1 707 Новости

Вышел jQuery 1.6.1 RC

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().

Комментарии

  • Facebook
  • Вконтакте

Похожие статьи