Hoe kan ik een functie gedefinieerd in jQuery.ready wereldwijd beschikbaar maken?

Ik heb een functie die de YouTube-ID van een url verwijdert. Ik wil deze functie dan 10 keer per pagina gebruiken (in de wordpress loop).

De functie werkt prima als ik hem de url in mijn functie-scripttags geef, maar als ik een nieuwe set scripttags binnen de lus start, werkt hij niet.

Ik moet weten hoe ik mijn functie kan gebruiken zonder alles eerst te declareren.

Dus dit is de code die ik in de kop heb:

<script type="text/javascript"> 
$(document).ready(function() {
var getList = function(url, gkey){
        var returned = null;
        if (url.indexOf("?") != -1){
          var list = url.split("?")[1].split("&"),
                  gets = [];
          for (var ind in list){
            var kv = list[ind].split("=");
            if (kv.length>0)
                gets[kv[0]] = kv[1];
        }
        returned = gets;
        if (typeof gkey != "undefined")
            if (typeof gets[gkey] != "undefined")
                returned = gets[gkey];
        }
            return returned;
    };
        // THIS WORKS
    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
      });

Maar als ik dit ergens anders op de pagina probeer te gebruiken, werkt het niet.

<script type="text/javascript"> 
      $(document).ready(function() {
              alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
      };
      </script>

Firebug geeft me getList is niet gedefinieerdwat logisch is, want dat is het niet. Kan ik deze functie ‘globaal’ declareren?


Antwoord 1, autoriteit 100%

Je hebt twee opties, voeg het toe aan het windowobject om het globaal te maken:

window.getList = function(url, gkey){ 
    // etc...
}

of verplaats het vanuit de document-ready event-handler naar het globale bereik:

$(document).ready(function() {  
    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
});  
var getList = function(url, gkey){  
    var returned = null;  
    if (url.indexOf("?") != -1){  
      var list = url.split("?")[1].split("&"),  
              gets = [];  
      for (var ind in list){  
        var kv = list[ind].split("=");  
        if (kv.length>0)  
            gets[kv[0]] = kv[1];  
    }  
    returned = gets;  
    if (typeof gkey != "undefined")  
        if (typeof gets[gkey] != "undefined")  
            returned = gets[gkey];  
    }  
        return returned;  
};  

Misschien wil je ook deze vraaglezen over het gebruik van var functionName = function () {}vs function functionName() {}, en dit artikelover variabel bereik.


Antwoord 2, autoriteit 42%

Nog een andere optie is om de functie aan het jQuery-object zelf te hangen. Zo voorkom je dat de globale naamruimte verder vervuild raakt:

jQuery.getlist = function getlist(url, gkey) {
  // ...
}

Dan kun je het doen met “$.getlist(url, key)”


Antwoord 3, autoriteit 8%

declareer getList() buiten de ready() functie..

var getList = function(url, gkey){
        var returned = null;
        if (url.indexOf("?") != 
....
....
...
};

Nu werkt de getList overal in de code:

$(document).ready( function() {
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v"));
});

Het probleem was de reikwijdte van de getList(.)-functie.


Antwoord 4, autoriteit 3%

U kunt eenvoudig uw functie toevoegen in de variabele $.fn:

(function ($) {
   $.fn.getList = function() {
       // ...
   };
}(jQuery));

Voorbeeld van gebruik:

$().getList();

Dit is wat u normaal gesproken zou doen bij het maken van een Basic Pluginvoor jQuery.


Antwoord 5, autoriteit 2%

Definieer het gewoon als een normale functie bovenaan je script:

<script type="text/javascript">
    function getlist(url, gkey){  
        ...
    }
</script>

Antwoord 6

Om het als een globale functie te declareren, verwijdert u gewoon alle jQuery-specifieke bits. Zoiets als dit:

function getList(url, gkey) {
    var returned = null;
    if (url.indexOf("?") != -1){
    var list = url.split("?")[1].split("&"), gets = [];
    for (var ind in list){
        var kv = list[ind].split("=");
        if (kv.length>0) {
            gets[kv[0]] = kv[1];
        }
    }
    returned = gets;
    if (typeof gkey != "undefined") {
        if (typeof gets[gkey] != "undefined") {
            returned = gets[gkey];
        }
    }
    return returned;
}

En dan zou je het overal moeten kunnen bellen.

Other episodes