2009-10-02 3 views
1

Использование:Является jQuery ('. Foo'). Find ('. Bar') эквивалентно jQuery ('. Bar', jQuery ('. Foo'))?

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

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

Я знаю $b будет иметь свой контекст установлен $('.foo'), в то время как $a. Кроме того, я считаю, что два объекта одинаковы, правильно?

Последующие Qs:

  1. Будет ли парфюм быть такой же, как хорошо, так как поиск коренится от эффективного и того же объекта?
  2. Есть ли более строгий контекст, улучшающий perf в терминах основных операций jquery? (Я знаю, что это предназначено для использования плагинов.)

Спасибо!

ответ

4

EDIT:

да, они эквивалентны, вот источник

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

Для эффективного использования контекста, он должен быть HTMLElement, в противном случае контекст document

find() реализован как таковой в 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() использует механизм выбора Sizzle для выполнения фактического работы (посмотрите строку 2364 в источнике jQuery).

и pushStack является

// 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 написал большую статью о understanding the context in jQuery

0

Да, результаты были бы то же самое. Производительность также должна быть одинаковой, но для этого нужно тестирование!

На полученном объекте jQuery есть свойство, которое показывает селектор, используемый для поиска совпадений. Проверьте это в своем отладчике. Они могут быть одинаковыми между двумя способами.

Смежные вопросы