2009-10-02 8 views
1

utilisant:Est-ce que jQuery ('.foo'). Find ('. Bar') est équivalent à jQuery ('.bar', jQuery ('.foo'))?

var $a = $('.foo').find('.bar'); 

var $b = $('.bar', $('.foo')); 

Je sais $b aura son contexte mis à $('.foo'), tout en $a. En dehors de cela, je crois que les deux objets sont les mêmes, correct?

le suivi Qs:

  1. Est-ce que PERF les mêmes que bien puisque la recherche est enracinée hors du même objet efficacement?
  2. Un contexte plus strict améliore-t-il la performance en termes d'opérations de base de jquery? (Je sais qu'il est destiné à l'utilisation de plugin.)

Merci!

Répondre

4

EDIT:

oui, ils sont équivalents, voici la source

// HANDLE: $(expr, [context]) 
// (which is just equivalent to: $(content).find(expr) 
} else 
    return jQuery(context).find(selector); 

Pour utiliser efficacement le contexte, il doit être un HTMLElement, sinon le contexte est document

find() est implémenté en tant que tel dans jQuery 1.3.2

find: function(selector) { 
    if (this.length === 1) { 
     var ret = this.pushStack([], "find", selector); 
     ret.length = 0; 
     jQuery.find(selector, this[0], ret); 
     return ret; 
    } else { 
     return this.pushStack(jQuery.unique(jQuery.map(this, function(elem){ 
      return jQuery.find(selector, elem); 
     })), "find", selector); 
    } 
} 

find() utilise le moteur de sélection Sizzle pour effectuer le travail de recherche (voir la ligne 2364 dans la source jQuery).

et pushStack est

// Take an array of elements and push it onto the stack 
// (returning the new matched element set) 
pushStack: function(elems, name, selector) { 
    // Build a new jQuery matched element set 
    var ret = jQuery(elems); 

    // Add the old object onto the stack (as a reference) 
    ret.prevObject = this; 

    ret.context = this.context; 

    if (name === "find") 
     ret.selector = this.selector + (this.selector ? " " : "") + selector; 
    else if (name) 
     ret.selector = this.selector + "." + name + "(" + selector + ")"; 

    // Return the newly-formed element set 
    return ret; 
} 

Brandon Aaron a écrit un grand article sur understanding the context in jQuery

0

Oui, les résultats seraient les mêmes. Les performances devraient également être identiques, mais c'est pour ça que les tests sont faits!

Il existe une propriété sur l'objet jQuery résultant qui affiche le sélecteur utilisé pour rechercher les correspondances. Vérifiez-le dans votre débogueur. Ils peuvent même être identiques entre les deux méthodes.

Questions connexes