Использование функции jQuery end () с методами Destructive - PullRequest
3 голосов
/ 11 апреля 2011

У меня возникли некоторые проблемы с использованием функции .end () в jQuery.Документы, которые я прочитал, рекламируют это как «откат» изменений из фильтра или дополнительного выбора.Например,

var someDivs = $('div');
someDivs
  .filter('li')
  .css('color', 'green')
.end(); // ok, reverted back to original wrapper

С другой стороны, это не работает.

someDivs
  .get(0) // get DOM element at index 0
.end(); // error, executing a jQuery method on a plain javascript object.

Я просто пытаюсь убедиться, что я прав после определенной цепной деструктивностиВызываются такие методы, как html (), text () и get (), возврат к исходной оболочке невозможен.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Да, end() будет работать только с методами, которые возвращают объект jQuery. Методы, которые возвращают строки (.html(), .text()) или элементы DOM (.get()), впоследствии не позволят вам связывать никакие методы jQuery вообще.

3 голосов
/ 11 апреля 2011

get () возвращает фактический элемент DOM HTML, а не элемент jQuery. Вам нужно использовать eq () :

someDivs.eq(0).end();

Если вам когда-либо понадобится вернуться к контексту объекта jQuery из элемента dom. Вы всегда можете бросить элемент в $ (). Например, приведенное выше утверждение может быть переписано:

$(someDivs.get(0)).end();

^ Именно поэтому вы делаете $(this) в большинстве обработчиков событий. Вы получаете переданный элемент DOM, а не объект jQuery.

2 голосов
/ 11 апреля 2011

Да, вы правы, так как эти «деструктивные» функции возвращают значения, которые не jQuery объекты.

Однако вам даже не нужно использовать .end(), когда вы сохраняете свой выбор в переменной (например, someDivs). Ни одна из функций обхода jQuery (children(), filter() и т. Д.) Фактически не изменяет объект jQuery, к которому они применяются, но вместо этого возвращает новый. Этот раздел документации jQuery очень полезен для понимания того, что происходит во время цепочки:

Большинство методов обхода DOM в jQuery работать с экземпляром объекта jQuery и произвести новый, соответствующий другой набор элементов DOM. когда это происходит, как будто новый набор элементов помещается в стек это поддерживается внутри объекта. Каждый последующий метод фильтрации выдвигает новый элемент на стек. Если нам нужен более старый элемент установить, мы можем использовать end(), чтобы вытолкнуть наборы отступить из стека.

Поскольку исходный объект jQuery не изменяется, вместо использования .end() вы можете просто ссылаться на оригинал:

var html = someDivs.filter('li').html();
var text = someDivs.filter('p').text();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...