2010-02-08 8 views
59

J'ai une fonction qui dépouille le id de youtube d'une URL. Je veux ensuite utiliser cette fonction 10 fois par page (dans la boucle wordpress).Comment rendre une fonction définie dans jQuery.ready disponible globalement?

La fonction fonctionne très bien lorsque je la charge dans l'URL de mes balises de script de fonction, mais lorsque je lance un nouveau jeu de balises de script dans la boucle, cela ne fonctionne pas.

J'ai besoin de savoir comment je peux utiliser ma fonction sans tout déclarer d'abord.

Donc, c'est le code que j'ai dans l'en-tête:

<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")); 


     }); 

Mais quand j'essaie d'utiliser ce quelque part ailleurs sur la page, cela ne fonctionne pas.

<script type="text/javascript"> 

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

Firebug me donne getList n'est pas défini ce qui est logique, parce que son pas. Suis-je capable de déclarer «globalement» cette fonction?

+0

Désolé pour la mauvaise mise en forme, chaque fois que je modifie le code, il se avère étrange. Le code est valide. – wesbos

+0

Une chose BTW - le déclarant dans document.ready signifie qu'il est défini uniquement lorsque le document est prêt (après que la page est chargée), vous devez donc appeler la fonction lorsque vous êtes sûr qu'il est défini. Le déclarer en tant qu'objet global peut ne pas suffire si la déclaration elle-même est exécutée après que vous ayez essayé de l'utiliser. –

Répondre

95

Vous avez deux options, l'ajouter à l'objet window pour le rendre global:

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

ou mouvement de l'intérieur du gestionnaire d'événement de document prêt dans la portée globale:

$(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; 

}; 

Vous pouvez également lire this question sur l'utilisation de var functionName = function() {} par rapport à function functionName() {} et this article sur la portée variable.

+1

Tant de bonnes réponses, merci beaucoup :) – wesbos

2

Il suffit de le définir comme une fonction régulière en haut de votre script:

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

Indépendamment c'est vrai mais ce n'est pas une bonne solution par exemple dans ce cas vous avez défini la fonction jQuery dans un autre en-tête et vous voulez l'utiliser dans l'élément img comme onclick = "$. Function()". – QMaster

+1

Je ne suis pas certain de comprendre votre commentaire (et votre critique négative). Ce code répond à la question de savoir comment créer une fonction dans l'espace de noms global - en dehors du gestionnaire jQuery. –

+0

Globalement, le mot désigne le sens [globalement]. Je suppose que la fonction globale est accessible à partir de chaque section de script java, mais ce n'est pas vrai quand vous définissez juste au dessus des scripts. J'ai mentionné un exemple de {inside img element comme onclick = "$. Function()"}. Après tout le vote bas est juste pour aider l'utilisateur à déterminer la meilleure réponse. Cordialement. – QMaster

8

getList déclare() en dehors de la fonction prêt() ..

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

Maintenant, le getList fonctionnera partout dans le code:

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

Le problème était, la portée de la getList (.) fonction.

41

Encore une autre option consiste à suspendre la fonction de l'objet jQuery lui-même. De cette façon, vous éviter de polluer l'espace de noms global plus loin:

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

Ensuite, vous pouvez obtenir à avec « .getlist de $ (url, clé) »

+0

Merci à vous, venez de faire ma première fonction jQuery, génial! S'il y a une ressource plus complète pour faire vos propres fonctions jQuery, s'il vous plaît faites le moi savoir, mais cela m'a aidé http://blogs.microsoft.co.il/blogs/basil/archive/2008/09/22/defining-your- own-functions-in-jquery.aspx –

-4

Pour déclarerons comme fonction globale, juste obtenir débarrasser de tous les bits spécifiques de jQuery. Quelque chose comme ceci:

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; 
} 

Et puis vous devriez pouvoir l'appeler de n'importe où.

+0

Cela n'a aucun sens. S'il utilisait jQuery, c'était pour une raison alors pourquoi ne plus l'utiliser? Quoi de plus - déclarer quelque chose dans l'événement $ (document) .ready vous assure que toute la page est chargée, ce qui est parfois essentiel. Bien sûr, mélanger la déclaration document.ready avec la fonction d'appel en dehors de cette portée peut être mauvaise, mais la suppression de jQuery call n'est pas vraiment une solution. Vous devriez au moins expliquer pourquoi la suppression de jquery est bonne. –

+2

MISE À JOUR: ok, je me suis levé, votre réponse est en fait pas si mal. Mais ce qui lui manque est une explication quels sont les avantages et les dangers de le déplacer en dehors de document.ready portée, les différences entre var x = fonction (...) et la fonction x (...) déclarations et ainsi de suite. Sans cela, c'est comme une magie - résout un problème spécifique, mais sans savoir pourquoi cela fonctionne. –

1

Vous pouvez simplement ajouter votre fonction dans la variable $.fn:

function ($) { 

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

}(jQuery)); 

Exemple d'utilisation:

$.getList(); 

Voici ce que vous généralement faire en créant un Basic Plugin pour jQuery.

+1

$ .getList(); ne fonctionne pas, seulement $(). getList(); travaux.... – Andrew

Questions connexes