Вышел jQuery 1.6.1 RC
Мы подошли к первому обновлению 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().