$ non défini avec jQuery dans WordPress

32

Je sais que jQuery est chargé, car je peux remplacer le $pour 'jQuery' et tout se comporte comme prévu, mais ce sera un script compliqué si je ne parviens pas à résoudre ce problème.

Ce script:

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

Produit l'erreur $ is not a function

Ce script:

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

fonctionne bien.

Fuzz doux
la source

Réponses:

42

Vous pouvez envelopper votre javascript dans une fonction à invocation automatique, puis lui passer jQuerycomme argument, en utilisant $comme nom de variable locale. Par exemple:

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

devrait fonctionner comme prévu.

Si je me souviens bien, la version de jQuery fournie par WP (celle que vous obtiendrez si vous en avez wp_enqueue_script('jquery')) place immédiatement jQuery dans le statut sans conflit, ce $qui le rend indéfini.

personne
la source
aah, je vois. J'avais l'habitude de l'ajouter à la main, ce qui explique pourquoi je n'ai pas rencontré ce problème.
Doux Fuzz
Merci, j'utilisais le format alternatif avec jQuery au début au lieu de la fin .. mais je ne savais pas comment renvoyer une valeur, avec ce format que je viens d'ajouter ajouté avant la fonction d'invocation automatique, et cela fonctionne.
Eselk
Réponse très utile.
MarkSkayff
32

Tu y es presque!

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

});

Vous devez passer une référence à jQuery en tant que $fonction dans votre méthode, sinon cela ne fonctionnera pas. Si vous placez simplement un $ dans le premier function()appel comme je l’ai fait ci-dessus, tout se passera bien.

EAMann
la source
4
+1: C'est plus lisible que de mettre jQueryà la fin.
fuxia
1
... mais ce n'est pas la façon habituelle de faire une fonction anonyme. forum.jquery.com/topic/jquery-anonymous-function-calls
BryanH
5
Oui et non. Ils sont tous deux considérés comme "standard" des moyens de le faire. On crée une classe singleton qui a $défini localement. L'autre définit simplement un gestionnaire pour l' readyévénement du document et transmet l'objet jQuery au gestionnaire en tant que $. Si vous essayez de vous accrocher à l' readyévénement, la deuxième méthode est plus largement utilisée. Si vous avez besoin de jQuery à toute autre fin (pour vous y accrocher $.browserpar exemple), utilisez une classe singleton.
EAMann
+1 pour jQuery (document) .ready (function ($) {... plus d'infos sur jquery et WordPress, vous pouvez également lire sur mon post: wpengineer.com/2028/small-tips-using-wording-and-jquery .
Bueltge
6

Passer une fonction à jQuery est un raccourci car $(document).ready(...)en plaçant $comme premier paramètre de votre rappel, vous créez un alias pour jQuery dans ce rappel:

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

Vous pouvez voir la documentation à ce sujet ici .

Rohmann
la source