Свойства
Кроме атрибутов также есть свойства элементов, к ним относятся «selectedIndex», «tagName», «nodeName», «nodeType», «ownerDocument», «defaultChecked» и «defaultSelected». Ну, вроде бы, список невелик, можно и запомнить. Для работы со свойствами используем методы из семейства «.prop()»:
prop(propName)
— получение значения свойства
prop(propName, propValue)
— установка значения свойства (также можно использовать hash либо функцию обратного вызова)
removeProp(propName)
— удаление свойства (скорей всего, никогда не понадобится)
А теперь выключите музыку, и запомните следующее – для отключения элементов формы и для проверки/изменения состояния чекбоксов мы всегда используем метод «.prop()», пусть вас не смущает наличие одноименных атрибутов в HTML (это я про «disabled» и «checked»), используем «.prop()» и точка.
Давайте на примере properties.html:
Посмотрите, как работает система без нашего вмешательства — кликните чекбокс, селектбокс, попробуйте отправить форму.
Теперь приступим к серии экспериментов (не забудьте обновить страничку):
- Ставим галочку на чекбоксе посредством метода «.attr()» — $("#checkbox").attr("checked", "checked")
- Теперь снимите галочку мышкой — значение «.attr()» осталось без изменений, значение «.prop()» изменилось
- Попробуйте ещё раз поставить галочку, используя метод «.attr()»
Небольшое пояснение сути происходящего. При первом вызове метода «.attr("checked", "checked")» проставляется галочка, т.к. изменяются и атрибут и свойство «checked». При повторном вызове уже ничего не происходит, меняется только значение атрибута, которое и так уже «checked».
Следующий эксперимент:
- Поставьте мышкой галочку на чекбоксе
- Снимите галочку — значение «.attr()» не изменяется
- Попробуйте установить значение посредством вызова $("#checkbox").attr("checked", "checked")
В данном эксперименте интересен следующий момент: вызов метода «.attr("checked", "checked")» не срабатывает после того, как пользователь изменял статус чекбокса
Ну и ещё один эксперимент со вторым чекбоксом:
- Удаляем галочку — $("#checkbox-two").removeAttr("checked")
- Ставим галочку — $("#checkbox-two").attr("checked", "checked")
- Опять удаляем галочку, используя метод «.attr()»
- Повторяем до упаду
Работает — не трожь, мышкой всё сломаете :)
Сравните с поведением метода «.prop()»:
- Удаляем галочку — $("#checkbox-two").prop("checked", false)
- Ставим галочку — $("#checkbox-two").prop("checked", true)
- Можем кликать мышкой по чекбоксу и повторять предыдущие пункты в произвольном порядке, всё будет работать как часы
Надеюсь, я достаточно наглядно дал понять, когда надо использовать «.attr()», а когда «.prop()»
Это ещё не всё, у нас же есть ещё свойство «disabled»! Но не волнуйтесь, его поведение более предсказуемо, т.к. пользователь не может вмешиваться в его состояние:
- Включаем радио-кнопку — $("#radio-two").attr("disabled", false)
- Выключаем — $("#radio-two").attr("disabled", true)
- Повторяем
Аналогичное поведение при использовании метода «.prop()»:
- Включаем — $("#radio-two").prop("disabled", false)
- Выключаем — $("#radio-two").prop("disabled", true)
- Повторяем
Ну, как бы, можно использовать «.attr()», но нет!