Как jQuery работает с несколькими селекторами?

#javascript #jquery #chaining

#javascript #jquery #объединение в цепочку

Вопрос:

Некоторое время мне было интересно, как jQuery работает с несколькими селекторами. Например:

 $("p").css({"border":"1px solid #000"});
  

Выполняет последующую функцию для всех тегов p. Я просмотрел исходный код jQuery, но, честно говоря, это обширное чтение, когда вы пытаетесь разработать одну конкретную функциональность. Я предполагаю, что существует какой-то стек, посредством которого css () и другие функции просто воздействуют на текущий стек, который определяется функцией selector.

Кроме этого, я не могу понять, как это можно было бы воспроизвести, поскольку, я думаю, в javascript нет способа возвращать несколько объектов для выполнения функции. Например.

 House.first_bedroom.size = "large"
House.second_bedroom.size = "small"
House.all_rooms().alertSize();
  

alertSize() должна была бы быть функцией-членом некоторой коллекции объектов, а не функцией-членом каждого объекта room, который возвращается all_rooms()?

Ответ №1:

Во-первых, функции jQuery (обычно) возвращают объект jQuery, который действует как массив и отслеживает текущий набор сопоставленных элементов. Во-вторых, внутренне каждая функция jQuery широко использует each() функцию для перебора соответствующих объектов, выполнения последующих действий и создания нового объекта jQuery для возврата. Некоторые функции возвращают что-то отличное от jQuery, например get() . Эти функции не могут быть объединены в цепочку. Объединение в цепочку возможно только тогда, когда функция возвращает объект jQuery. Поскольку возвращаемый объект является объектом jQuery, ему доступны все функции jQuery.

Ответ №2:

Конструктор jquery ($ (…)) всегда возвращает объект jquery. Вы можете думать об этом как о причудливом массиве. Выбранные элементы сохраняются (похоже, в исходном коде это называется context).

Итак, затем для вашего объекта вы вызываете функцию css… Смотрите jQuery.fn.css в исходном коде. По сути, он вызывает функцию, которая выполняет делегирование (настройку или получение css) для каждого элемента в контексте.

Ответ №3:

Возможно, DOM проанализирован и все элементы, соответствующие критериям, добавлены в массив? Или … что-то более эффективное? 🙂

Аналогично, для обработки событий каждому элементу в массиве присваивается обработчик?

Я просто бреду в темноте.

Комментарии:

1. Но тогда как функция вызывается для каждого элемента массива? Например, ["foo", "bar"].someFunc() выполняет someFunc для массива в целом, а не для отдельных элементов, но jQuery удается выполнить свои функции для каждого элемента

2. Как я уже сказал, функция / обработчик назначается каждому элементу в массиве — так что тогда вы получаете что-то вроде: foo.click = someFunc и bar.click = someFunc.