jquery logo

Мы подошли к первому обновлению jQuery 1.6 и рады сообщить о выходе первого релиз-кандидата! Данный код, скорее всего, пойдёт в итоговую версию 1.6.1 (она выйдет ближе к концу недели) — всё, кроме (возможных) критических багов, конечно же.

Скачать код можно из jQuery CDN:
http://code.jquery.com/jquery-1.6.1rc1.js

Можете поспособствовать нам, поместив этот код в ваше рабочее приложение и дав знать, если что-то перестанет работать. В этом случае, пожалуйста, убедитесь, что вы тестируете конкретно jQuery 1.6.1 RC 1 и заведите баг.

Мы собираемся поощрять любые инициативы участников сообщества по внесению полезных изменений в ядро jQuery. Мы подготовили целую страницу с подробной информацией, призванную упростить этот процесс. Наша команда здесь и готова помочь вам помочь нам!

Обновление с 1.5.2 до 1.6.1

Появление нового метода .prop(), а также изменения в работе метода .attr() — породили целую дискуссию о различиях между атрибутами и свойствами и их взаимосвязи. Кроме того, возникли некоторые проблемы с обратной совместимостью, которые были исправлены в 1.6.1. Другими словами, при обновлении с 1.5.2 до 1.6.1, вам не нужно менять какой-либо старый код.


Ниже вы найдёте описание изменений в модуле «Атрибуты» в jQuery 1.6 и 1.6.1, а также рекомендации по предпочтительному использованию методов .attr() и .prop(). Однако, повторимся, jQuery 1.6.1 позволяет вам обращаться к методу .attr() точно так, как вы уже привыкли.

Список изменений

Недавние изменения в модуле «Атрибуты» устранили разночтения и двусмысленность в поведении атрибутов и свойств, но в тоже время вызвали смятение в рядах jQuery-сообщества, т.к. во всех версиях jQuery вплоть до 1.6 для работы и с атрибутами, и со свойствами использовался один единственный метод (.attr()). Прежний метод .attr() содержал множество багов и был непрост в поддержке.

В jQuery 1.6.1 были исправлены несколько багов, а также (снова) обновился модуль «Атрибуты».

Итак, булевые атрибуты (такие как checked, selected, readonly и disabled) в 1.6.1 ведут себя точно также как и в прежних версиях jQuery — вплоть до 1.6. Таким образом, код типа такого:

$(“:checkbox”).attr(“checked”, true);
$(“option”).attr(“selected”, true);
$(“input”).attr(“readonly”, true);
$(“input”).attr(“disabled”, true); 

или даже такой:

if( $(":checkbox").attr("checked") ) { /* Do something */}

— можно не менять при переходе на 1.6.1 и оставить как есть (ничего не сломается).

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

 

.attr() Proper .prop() usage
$(window).attr… $(window).prop…
$(document).attr… $(document).prop…
$(“:checkbox”).attr(“checked”, true); $(“:checkbox”).prop(“checked”, true);
$(“option”).attr(“selected”, true); $(“option”).prop(“selected”, true);

 

Во-первых, вызов метода .attr() у window или document не сработает в jQuery 1.6, т.к. window и document не имеют атрибутов. Они содержат только свойства (например, location или readyState), манипулировать которыми следует при помощи метода .prop(), либо чистого яваскрипта. В jQuery 1.6.1 метод .attr(), вызванный у window или document вместо того, чтобы выдать ошибку — просто приведёт к вызову метода .prop().

Далее, checked, selected и другие вышеупомянутые атрибуты обрабатываются особым образом, т.к. имеется специальная взаимосвязь между этими атрибутами и соответствующими свойствами. В простейшем случае, атрибут это то, что вы видите в html:

<input type="checkbox" checked="checked">

Булевые атрибуты (например, checked) задают только значение по умолчанию (во время инициализации страницы). В случае чекбокса, атрибут checked определяет будет ли в нём стоять галочка при загрузке страницы.

Свойства, в свою очередь, это то, с помощью чего браузер отражает изменения в текущих значениях. Обычно значения свойств отражают значения соответствующих атрибутов (если таковые существуют). Однако, в случае булевых атрибутов — всё иначе. Булевые свойства остаются в актуальном состоянии (с актуальными значениями), если пользователь убрал галочку с чекбокса или выбрал пункт из выпадающего списка. Соответствующий атрибут — нет (как было уже отмечено выше, они используются только для хранения значения по умолчанию).

$(":checkbox").get(0).checked = true;
 // Тоже самое, что мы бы написали $(":checkbox:first").prop("checked", true);

В jQuery 1.6, такой способ динамического проставления галочки в чекбоксе:

$(":checkbox").attr("checked", true);

уже не сработает, т.к. тут нужно было поменять свойство, а не атрибут, т.е. всё, чего мы этим добились только что — поменяли значение по умолчанию.

Однако, когда jQuery 1.6 вышла в свет, команда разработчиков jQuery осознала, что это, наверное, не слишком полезная возможность — выставлять значения по умолчанию, которые браузер всё равно считывает только один раз — при загрузке страницы. Так что, с учётом этого факта, а также в интересах поддержания обратной совместимости, мы решили вернуть возможность задавать значения булевых атрибутов при помощи метода .attr() в jQuery 1.6.1.

Наиболее распространённые булевые атрибуты это checked, selected, disabled и readOnly, но вот вам полный их список (атрибутов и свойств, у которых в jQuery 1.6.1 можно динамически получать/задавать значения методом .attr()):

autofocus, autoplay, async, checked, controls, defer, disabled, hidden, loop, multiple, open, readonly, required, scoped, selected

По-прежнему рекомендуется использовать .prop() для установки булевых атрибутов/свойств, однако ваш старый код продолжит работать с jQuery 1.6.1 как ни в чём не бывало.

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

 

Атрибут/свойство .attr() .prop()
accesskey  
align  
async
autofocus
checked
class  
contenteditable  
draggable  
href  
id  
label  
location (например, window.location)
multiple
readOnly
rel  
selected
src  
tabindex  
title  
type  
width (если требуется перекрыть .width())  


Ни .attr(), ни .prop() не рекомендуется использовать для записи/чтения значений — для этих целей есть .val() (хотя, .attr(“value”, “somevalue”) по-прежнему будет работать, как и в 1.6).

Итого (предпочтительное использование)

Метод .prop() рекомендуется использовать для работы с булевыми атрибутами/свойствами, а также со свойствами, не присутствующими в html (например, window.location). Манипуляции со всеми остальными атрибутами (теми, что есть в html) могут (и должны) проводиться по-старому с использованием метода .attr().