JavaScript. Подробное руководство, 6-е издание, стр. 328

<b>$(&quot;a[href]&quot;).closest(&quot;div&quot;) // Самые внутренние элементы &lt;div&gt;, содержащие ссылки </b>

<b>$(&quot;а[href]&quot;).parentsUntil():not(div)&quot;) // Все элементы &lt;div&gt;, непосредственно</b>

<b>                                       // обертывающие элементы &lt;а&gt;</b>

19.8.2.2. Возврат к предыдущему выбору

Чтобы обеспечить возможность составления цепочек вызовов методов, большинство методов объекта

<b>jQuery</b>
возвращают объект, относительно которого они вызываются. Однако все методы, которые рассматривались в этом разделе, возвращают новые объекты
<b>jQuery</b>
. Они также могут включаться в цепочку вызовов, но вы должны иметь в виду, что методы, вызываемые в цепочке вслед за ними, будут оперировать другим множеством элементов, отличным от того, которое использовалось в начале цепочки.

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

<b>jQuery</b>
, они сохраняют в нем ссылку на прежний объект
<b>jQuery</b>
, на основе которого был порожден новый объект. В результате создается список, или стек объектов
<b>jQuery</b>
. Метод
<b>end()</b>
выталкивает объект на вершине этого стека и возвращает сохраненный объект
<b>jQuery</b>
. Вызов метода
<b>end()</b>
в цепочке восстанавливает множество выбранных элементов в предыдущее состояние. Взгляните на следующий фрагмент:

<b>// Отыскать все элементы &lt;div&gt;, затем внутри множества выбранных элементов отыскать </b>

<b>// элементы &lt;р&gt;. Выделить элементы &lt;р&gt; цветом и затем окружить рамками элементы &lt;div&gt;.</b>

<b>// Сначала рассмотрим, как это сделать без цепочек вызовов методов</b>

<b>var divs = $(&quot;div&quot;);</b>

<b>var paras = divs.find(&quot;p&quot;);</b>

<b>paras.addClass(&quot;highlight&quot;); </b>

<b>divs.css( &quot;border&quot;, &quot; solid black 1px&quot;);</b>

<b>// А теперь то же самое, составив цепочку вызовов методов</b>

<b>$(&quot;div&quot;). find(&quot;p&quot;).addClass(&quot;highlight&quot;).end().css(&quot;border&quot;, &quot;solid black 1px&quot;);</b>

<b>// To же самое можно реализовать без вызова метода end(), просто переупорядочив операции </b>

<b>$(&quot;div&quot;).css(&quot;border&quot;', &quot;solid black 1рх”).find(&quot;р&quot;).addClass(&quot;highlight”);</b>

Если вам когда-нибудь потребуется вручную определить множество выбранных элементов и обеспечить его совместимость с методом

<b>end()</b>
, передайте новое множество элементов в виде массива или в виде объекта, подобного массиву, методу
<b>pushStack().</b>
Указанные элементы будут преобразованы в новое множество выбранных элементов, а предыдущее множество будет помещено в стек, откуда его можно будет извлечь вызовом метода
<b>end():</b>

<b>var sel = $(&quot;div”);              // Выбрать все &lt;div&gt;</b>

<b>sel.pushStack(document.getElementsByTagName(&quot;p&quot;)); // Заменить его множеством</b>

<b>                                                   // всех элементов &lt;р&gt;</b>

<b>sel.end(); // Восстановить множество элементов &lt;div&gt;</b>

Теперь, когда мы познакомились с методом

<b>end()</b>
и со стеком, хранящим множества выбранных элементов, нам осталось познакомиться с еще одним методом. Метод
<b>andSelf()</b>
возвращает новый объект
<b>jQuery</b>
, включающий все элементы из текущего множества выбранных элементов плюс все элементы (за исключением дубликатов) из предыдущего множества. Метод
<b>andSelf()</b>
действует подобно методу
<b>add()</b>
и для него больше подошло бы имя «addPrev». В качестве примера рассмотрим следующий вариант реализации предыдущего примера: он выделяет цветом элементы
<b>&lt;р&gt;</b>
и вмещающие их элементы
<b>&lt;div&gt;</b>
и затем добавляет рамки к элементам
<b>&lt;div&gt;:</b>

<b>$(&quot;div&quot;).find(&quot;р&quot;).andSelf(). // Отыскать &lt;p&gt; в &lt;div&gt; и объединить их</b>

<b>addClass(&quot;highlight&quot;). // Выделить их все цветом</b>

<b>  end().end(). // Вытолкнуть со стека дважды до $(&quot;div&quot;)</b>

<b>  css(&quot;border&quot;, &quot;solid black 1px&quot;); // Добавить рамки к элементам &lt;div&gt;</b>

19.9. Расширение библиотеки jQuery с помощью модулей расширений

Библиотека jQuery написана так, что позволяет легко добавлять в нее новые функциональные возможности. Модули, добавляющие новые функциональные возможности, называются расширениями (plug-in), большое количество которых можно отыскать на сайте http://plugins.jquery.com. Расширения для библиотеки jQuery являются обычными файлами с программным кодом на языке JavaScript, и, чтобы задействовать их в своих веб-страницах, достаточно просто подключить их с помощью элемента

<b>&lt;script&gt;,</b>
как любую другую библиотеку на языке JavaScript (разумеется, расширения должны подключаться после подключения самой библиотеки jQuery).

Создание собственных расширений для библиотеки jQuery является почти тривиальной задачей. Вся хитрость заключается в объекте-прототипе

<b>jQuery.fn</b>
, который является прототипом для всех объектов
<b>jQuery</b>
. Если добавить новую функцию в этот объект, она превратится в метод объекта
<b>jQuery</b>
. Например: