2010-02-08 21 views
59

Ho una funzione che toglie l'id di youtube da un url. Quindi desidero utilizzare questa funzione 10 volte per pagina (nel ciclo wordpress).Come posso rendere una funzione definita in jQuery.ready disponibile globalmente?

La funzione funziona alla grande quando inserisco l'url all'interno dei tag di script della mia funzione, ma quando avvio un nuovo set di tag di script all'interno del ciclo, non funziona.

Ho bisogno di sapere come posso usare la mia funzione senza dichiararla prima.

quindi questo è il codice che ho nell'intestazione:

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


     }); 

Ma quando provo utilizzare questo un altro punto della pagina, non lavorare.

<script type="text/javascript"> 

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

Firebug mi dà getList non è definito che ha un senso, perché la sua non. Posso dichiarare questa funzione "globalmente"?

+0

Siamo spiacenti per la scarsa formattazione, ogni volta che modifica il codice, risulta strano. Il codice è valido – wesbos

+0

Una cosa BTW - dichiararlo all'interno di document.ready significa che è definito solo quando il documento è pronto (dopo che la pagina è stata caricata) quindi dovresti chiamare la funzione quando sei sicuro che sia definita. Dichiararlo come un oggetto globale potrebbe non essere sufficiente se la dichiarazione stessa viene eseguita dopo aver provato a utilizzarla. –

risposta

95

avete due opzioni, aggiungerlo all'oggetto window per renderlo globale:

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

o spostare dall'interno del gestore di eventi pronto per i documenti nell'ambito 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; 

}; 

Si Inoltre, si desidera leggere this question sull'utilizzo di var functionName = function() {} rispetto a function functionName() {} e su this article sull'ambito della variabile.

+1

Tante ottime risposte, grazie mille :) – wesbos

2

Basta definire come una normale funzione nella parte superiore dello script:

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

Indipendentemente da ciò è vero ma non è una buona soluzione, ad esempio in questo caso hai definito la funzione jQuery nell'intestazione di un'altra pagina e desideri utilizzarla all'interno dell'elemento img come onclick = "$. Funzione()", Altre risposte devono essere migliori. – QMaster

+1

Non sono sicuro di aver compreso il tuo commento (e il downgrade). Questo codice risponde alla domanda su come creare una funzione nello spazio dei nomi globale - al di fuori del gestore jQuery. –

+0

Globalmente il termine della parola ha un significato [Globalmente]. Presumo che la funzione globale sia accessibile da ogni sezione di script java ma ciò non è vero quando si definiscono solo gli script. Ho citato un esempio di {inside img element as onclick = "$. Function()"}. Dopo tutto il voto negativo è solo per aiutare l'utente a determinare la risposta migliore. Cordiali saluti. – QMaster

8

dichiarare getList() al di fuori della funzione di pronto() ..

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

Ora il getList funzionerà ovunque nel codice:

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

Il problema era, campo di applicazione della getList (.) funzione.

41

Un'altra opzione è quella di sospendere la funzione dall'oggetto jQuery stesso. In questo modo si evita di inquinare lo spazio dei nomi globale ogni ulteriore:

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

allora si può ottenere ad essa con "$ .getlist (url, key)"

+0

Grazie a te, ho appena realizzato la mia prima funzione jQuery, fantastica! Se esiste una risorsa più completa per rendere le tue funzioni jQuery, faccelo sapere, ma questo mi ha aiutato http://blogs.microsoft.co.il/blogs/basil/archive/2008/09/22/defining-your- own-functions-in-jquery.aspx –

-4

di dichiararla come una funzione globale, basta avere sbarazzarsi di tutti i bit specifici di jQuery. Qualcosa del genere:

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

E quindi dovresti essere in grado di chiamarlo da qualsiasi luogo.

+0

Questo non ha senso. Se ha usato jQuery, è stato per un motivo quindi perché non usarlo più? Inoltre, dichiarare qualcosa in $ (document) .ready evento ti assicura che l'intera pagina sia caricata, il che a volte è essenziale. Ovviamente, la miscelazione della dichiarazione document.ready con la funzione di chiamata al di fuori di questo ambito potrebbe essere errata, ma la semplice rimozione della chiamata jQuery non è esattamente una soluzione. Dovresti almeno spiegare perché rimuovere jquery è buono. –

+2

UPDATE: ok, mi sono fatto trasportare, la tua risposta non è poi così male. Ma ciò che manca è una spiegazione quali sono i vantaggi e i pericoli di spostarlo all'esterno di document.ready scope, le differenze tra var x = function (...) e function x (...) dichiarazioni e così via. Senza di esso è in qualche modo magica - risolve un problema specifico, ma senza sapere perché funzioni. –

1

si può semplicemente aggiungere la funzione nella variabile $.fn: utilizzo

function ($) { 

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

}(jQuery)); 

Esempio:

$.getList(); 

Questo è quello che in genere si fa durante la creazione di un Basic Plugin per jQuery.

+1

$ .getList(); non funziona, solo $(). getList(); lavori.... – Andrew

Problemi correlati