$ non definito utilizzando jQuery in WordPress

14 ott 2010, 18:27:21
Visualizzazioni: 53K
Voti: 38

So che jQuery è caricato, perché posso sostituire il $ con 'jQuery' e tutto funziona come previsto, ma questo script diventerà disordinato se non riesco a risolvere questo problema

Questo script:

jQuery(document).ready(function(){
    $("ul.vimeo_desc_feed li a").click(function(){
        alert($(this).attr('href'));
        return false;
    })
});

Produce l'errore $ is not a function

Questo script:

jQuery(document).ready(function(){
    jQuery("ul.vimeo_desc_feed li a").click(function(){
        alert(jQuery(this).attr('href'));
        return false;
    })
});

funziona correttamente.

0
Tutte le risposte alla domanda 3
3
51

Puoi racchiudere il tuo codice JavaScript all'interno di una funzione auto-invocante, passando poi jQuery come argomento, utilizzando $ come nome della variabile locale. Ad esempio:

(function($) {
  $(document).ready(function(){
    $("ul.vimeo_desc_feed li a").click(function(){
      alert($(this).attr('href'));
      return false;
    })
 });
}(jQuery));

dovrebbe funzionare come previsto.

Se ricordo bene, la versione di jQuery fornita da WordPress (quella che ottieni con wp_enqueue_script('jquery')) imposta immediatamente jQuery in modalità no-conflict, causando la non definizione di $.

14 ott 2010 18:38:33
Commenti

Ah, capisco. Io lo aggiungevo manualmente, il che spiega perché non mi sono mai imbattuto in questo problema.

Mild Fuzz Mild Fuzz
14 ott 2010 18:46:28

Grazie, stavo usando il formato alternativo con jQuery all'inizio invece che alla fine... ma non riuscivo a capire come restituire un valore, con questo formato ho semplicemente aggiunto return prima della funzione auto-invocante, e funziona.

eselk eselk
15 gen 2015 20:08:33

Risposta molto utile.

MarkSkayff MarkSkayff
1 nov 2017 22:04:41
4
32

Ci sei quasi!

jQuery(document).ready(function($){
    $("ul.vimeo_desc_feed li a").click(function(){
        alert($(this).attr('href'));
        return false;
    })

});

Devi passare un riferimento a jQuery come funzione $ al tuo metodo altrimenti non funzionerà. Se inserisci semplicemente un $ all'interno della prima chiamata function() come ho fatto sopra, tutto funzionerà correttamente.

14 ott 2010 18:41:38
Commenti

+1: È più leggibile che mettere jQuery alla fine.

fuxia fuxia
14 ott 2010 20:42:45

...ma non è il modo standard di fare una funzione anonima. http://forum.jquery.com/topic/jquery-anonymous-function-calls

BryanH BryanH
15 ott 2010 02:55:29

Sì e no. Entrambi sono considerati modi "standard" per farlo. Uno crea una classe singleton che ha $ definito localmente. L'altro definisce semplicemente un gestore per l'evento ready del documento e passa l'oggetto jQuery al gestore come $. Se stai cercando di agganciarti all'evento ready, il secondo metodo è più utilizzato. Se hai bisogno di jQuery per qualsiasi altro scopo (ad esempio per accedere a $.browser), useresti una classe singleton.

EAMann EAMann
15 ott 2010 04:39:10

+1 per jQuery(document).ready(function($){... per maggiori informazioni su jQuery e WordPress puoi anche leggere il mio post: http://wpengineer.com/2028/small-tips-using-wordpress-and-jquery/ .

bueltge bueltge
15 ott 2010 15:46:46
0

Passare una funzione a jQuery è una forma abbreviata per $(document).ready(...). Quindi, posizionando $ come primo parametro della tua callback, crei un alias per jQuery all'interno di quella callback:

jQuery(function($) {
    $("ul.vimeo_desc_feed li a").click(function(){
        alert($(this).attr('href'));
        return false;
    });
});

Puoi consultare la documentazione per questo qui.

10 ott 2013 02:18:45