2010-03-30 4 views
0

Étant donné le code suivant, pourquoi ai-je des valeurs différentes pour a et b? J'aurais pensé qu'ils reviendraient la même chose:Comportement du sélecteur Jquery en cache que je ne comprends pas

(function() { 
    var a = $('#foo'); 

    var Test = function(){ 
    console.log(a); //outputs 'jQuery()' 
    var b = $('#foo'); 
    console.log(b); //outputs 'jQuery(select#foo)' which is what I want 
    }; 
})(); 

Cette question provient de moi d'essayer de coller les sélecteurs fréquemment utilisés dans vars. A l'origine je le faisais dans chaque méthode (comme je l'ai fait avec var b dans l'exemple ci-dessus) mais ensuite j'ai trouvé que je devais utiliser les sélecteurs dans plusieurs méthodes, donc j'ai déplacé l'affectation pour être disponible (ou je pensais) à tous les méthodes dans cette fonction anonyme. Comme vous pouvez le voir, cela ne fonctionne pas. Pourquoi est-ce?

EDIT: ce code est chargé par une méthode qui est déclenchée par un clic. L'id foo est présent au chargement de la page et n'est pas défini ou modifié dynamiquement.

+3

Quand 'test' a appelé? –

+0

Dans mon code actuel, il s'agit d'une fonction appelée dans le cadre d'une méthode de validation de données lorsqu'un formulaire est soumis. Après le chargement de la page à tout prix. – Stuart

+0

Mais maintenant que j'y pense, la fonction anonyme elle-même ne se charge probablement pas au bon moment. Il est chargé par un plugin mais doit être chargé avant la fin de la page (donC# # foo n'est pas disponible). Ensuite, 'Test()' est appelé après le chargement de la page via un clic, donc naturellement cela fonctionne. Cela aide, merci! – Stuart

Répondre

1

Assurez-vous que le code n'est pas appelé jusqu'à ce que votre page ait terminé le chargement!

$(function() { 
    // your code 
}); 

, vous aurez également, bien sûr d'être prudent sur les choses de mise en cache qui pourraient être modifiés sur la page par d'autres parties de votre application côté client.

+0

Il est appelé après le chargement de la page. L'ID utilisé est défini dans le HTML ... il n'est pas modifié ou dynamique de quelque façon que ce soit. – Stuart

1

Juste pour améliorer la réponse précédente - b n'est évalué que lorsque vous appelez la fonction Test, probablement une fois la page chargée. Mettez en cache les sélecteurs dans le document prêt:

$(document).ready(function(){ 
    var a = $('#foo'); 
}); 

Je cache uniquement les sélecteurs lorsque j'utilise le même sélecteur dans un bloc de code. J'utilise la convention de nommage variable $ pour ceci:

var $divs = $('div'); 

Vous pouvez également les fonctions de la chaîne ensemble pour éviter d'avoir à mettre en cache le sélecteur:

$('div').append('hello world').addclass('hello').show(); 
+0

Je dirais que c'est le coupable le plus probable. Mettre votre code dans l'événement $ (document) .ready() garantit que le DOM sera accessible lorsque ce code est exécuté et que l'objet jQuery trouvera un élément. – Bob

Questions connexes