Является ли jQuery ('. Foo'). Find ('. Bar') эквивалентным jQuery ('. Bar', jQuery ('. Foo'))? - PullRequest
1 голос
/ 02 октября 2009

Использование:

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

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

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

Контрольные вопросы:

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 октября 2009

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;
}

Брэндон Аарон написал отличную статью о понимании контекста в jQuery

0 голосов
/ 02 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...