#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.