2015-07-30 3 views
4

мне интересно, если я установить переменный в запрос JQuery, как он выполняется немедленно, или с задержкой, когда поток управления первой попытки получить доступ к его результирующим элементам (скажем, итерация на нем)Замедленный jQuery выполняется так же, как LINQ?

С другими словами: Есть переменная хранит сам запрос или вместо этого сохраняет результат?

Например:

var $query = $('myselector'); // Is it traverses the DOM this time or later when actually using this variable? 

ответ

4

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

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

В отличие от некоторых методов DOM, таких как getElementsByName, возвращается живая коллекция NodeList, которая изменится, если вы добавите или удалите элементы, соответствующие названию.

+0

Thx. Является ли это результатом спецификации, поэтому она не изменится или просто появится, исследуя источник, и в будущих реализациях она может измениться в зависимости от намерения разработчика? –

+0

@ g.pickardou: Я не могу найти его прямо сейчас, но как это работает, это фундаментальная часть работы jQuery, поэтому в будущем это не изменится. Объект jQuery представляет собой объект, подобный массиву, который содержит результат запроса. – Guffa

0

jQuery не LINQ. Когда вы вызываете $('myselector'), это переводится на звонок document.querySelectorAll, который возвращает список узлов. Отложенная загрузка отсутствует. Список также не «живет». Он представляет собой DOM в то время. Поэтому, если вы измените его (добавьте узлы, удалите узлы), ваш список не будет изменен. Он представляет состояние DOM во время вызова селектора. У Mozilla есть большое объяснение этого на MDN here.

Также следует отметить, что в дополнение к вызову document.querySelectorAll, иногда jQuery должен обрабатывать селектор самостоятельно, используя движок Sizzle. Это происходит, когда вы используете определенные расширения, которые не являются частью того, что поддерживает querySelectorAll, или если вы используете браузер, который не имеет этой функции. Одним из таких примеров является псевдокласс класса :eq(N). Это не часть querySelectorAll, и поэтому jQuery делает весь тяжелый подъем. Обратите внимание, что даже если все это сделано Sizzle, оно все равно выполняется немедленно и возвращает неживой список узлов, соответствующих селектору.

+0

Примечание. В браузерах, где 'querySelectorAll' не поддерживается, или если запрос содержит специальные селектора jQuery, вместо этого будет использоваться механизм запросов Sizzle. – Guffa

+0

Действительно. Я уточню – dman2306