Открыть меню    

4 наблюдения о методах jQuery

некоторые особенности jQuery jQuery является наиболее используемой javascript библиотекой в мире, это всем известно. Несмотря на то, что в последние месяцы было озвучено много критических замечаний, jQuery по-прежнему привлекает много внимания со стороны разработчиков. Неважно кто вы: эксперт javascript или новичок jQuery, вы можете не знать некоторые особенности jQuery. В этой статье мы обсудим некоторые из них.

Возвращается false в обработчике события

Как мы все знаем, первая цель jQuery заключается в определении одного стандарта для всех браузеров при работе с единым набором методов. Где это возможно jQuery расширяет особенности браузера, интегрирую то, что не поддерживалось изначально. Поразмышляйте о селекторах, которые можно использовать благодаря jQuery и которые изначально не поддерживаются IE6/7 (атрибуты селекторов, например, :not, :last-child и т.д.).

Иногда, хотя это редкое исключение, jQuery слегка отклоняется от стандартного поведения. Например, возвращается false в обработчике события jQuery, что равнозначно вызову:

jQuery

event.stopPropagation();
event.preventDefault();

Напротив, возврат false в родном обработчике события, например, таком как addEventListener() эквивалентно записи:

jQuery

event.preventDefault();

В доказательство такого поведения можете взглянуть на соответствующий код автора jQuery.

jQuery

if ( ret !== undefined ) {
   if ( (event.result = ret) === false ) {
      event.preventDefault();
      event.stopPropagation();
   }
}

Отличие preventDefault, stopPropagation

jQuery.type()

Может быть так, что вы видите конструкцию jQuery.type() в первый раз. И уже один этот момент дает вам новое знание. Знаете ли вы, что у jQuery есть метод, который определяет внутренний JavaScript [[Class]] объекта.

Даже если вы уже знали про метод jQuery.type(), вы могли проигнорировать разницу между этим методом и родным оператором javascript typeof. Фактически jQuery.type() более точное обозначение переданного аргумента. Давайте рассмотрим несколько примеров:

Javascript

// выведет object
console.log(typeof null);

// выведет object
console.log(typeof [1, 2, 3]);

// выведет object
console.log(typeof new Number(3));

Используя те же аргументы, но с методом jQuery.type() мы имеем:

jQuery

// выведет null
console.log($.type(null));

// выведет array
console.log($.type([1, 2, 3]));

// выведет number
console.log($.type(new Number(3)));

Таким образом, если вы разрабатываете, например, плагин jQuery вы можете использовать jQuery.type(), чтобы иметь более точное представление о типе параметров, с которыми вы имеете дело.

attr() может работать как removeAttr()

Название этого раздела может показаться странным, но, по крайней мере, здесь не утверждается ничего кроме истины. Для тех кто не знаком с методом jQuery attr() поясню: метод attr() извлекает значение атрибута для первого элемента в наборе соответствующих элементов, или устанавливает один или несколько атрибутов для каждого элемента.

Хотя можно было бы игнорировать данное поведение, однако в добавок к Number и String метод attr() также может принимать null в качестве второго параметра. В этом случае метод attr() фактически работает как removeAttr(). Последний, как следует из названия, удаляет атрибут из каждого элемента в наборе соответствующих элементов.

Не верите? Давайте взглянем на исходники:

jQuery

attr: function( elem, name, value ) {
    ...
    if ( value !== undefined ) {

        if ( value === null ) {
            jQuery.removeAttr( elem, name );
    ...
}

Как вы можете видеть, метод проверяет определенно ли передаваемое значение (if ( value !== undefined )) и затем явно проверяет значение на null, и в случае положительного ответе вызывает метод removeAttr().

Это может быть удобно, когда вам надо установить или удалить атрибут в зависимости от какого-либо состояния, при этом вы не хотите расширять код. Так, например, вы могли бы написать:

jQuery

$(selector).attr(anAttr, condition ? value : null);

Вместо:

jQuery

condition ? $(selector).attr(anAttr, value) : $(selector).removeAttr(anAttr);

Решение использовать или нет данный трюк остается за вами. Но явно не улучшает понимание кода. В данный момент это поведение не документировано.

Включение массивоподобных объектов в массивы

Как вы знаете javascript имеет такие “штуки” как nodeList (специальный объект, который похож на массив: есть длина и нумерованы элементы, но на самом деле это динамический объект DOM) или arguments (переменная внутри функции), которые похожи на массивы, но это не массивы. Это означает, что мы можем получить доступ к их элементам используя массивоподобную нотацию (например, arguments[0]), но мы не можем использовать методы массива, например, forEach() и join().

Допустим, мы имеем nodeList из DOM элементов, извлеченных следующим образом:

Javascript

var list = document.getElementsByClassName('book');

Мы хотим перебрать этот массивоподобный объект, используя метод forEach(). Но если мы вызовем forEach() непосредственно на переменную (list.forEach(…)), то получим ошибку: “Uncaught TypeError: undefined is not a function”. Чтобы избежать этой проблемы, наиболее часто используют технику, основанную на свойстве prototype и методе call() как показано ниже.

Javascript

Array.prototype.forEach.call(list, function() {...});

Как вариант вы можете написать так:

Javascript

[].forEach.call(list, function() {...});

Какое бы решение вы не выбрали это не очень элегантно в плане чтения или записи. К счастью для нас jQuery приходит к нам на помощь. Благодаря методу jQuery.makeArray(), мы можем написать просто:

jQuery

$.makeArray(list).forEach(function() {...});

Лучше, Неправда ли?

источник

Комментарии к статье