Как обойти эту очевидную ошибку рендеринга флажка Webkit?
Предполагаемая ошибка рендеринга можно увидеть здесь:
<input id="box" type="checkbox">
<button id="chk">Check</button>
<button id="unchk">Uncheck</button>
function check() {
$("#box").prop("checked", "checked");
}
function uncheck() {
$("#box").removeProp("checked");
}
$("#chk").click(check);
$("#unchk").click(uncheck);
Уязвимые браузеры включают в себя: Chrome 27, Android Froyo и iPhone моего коллеги (версия?). Не влияет: IE9, FireFox 22
В браузерах, на которые влияют, Вы можете нажать кнопки "Проверить" и "Снять галочку" по одному разу, после чего они перестают работать.
Несмотря на внешний вид, состояние флажка, кажется, устанавливается правильно с каждым щелчком мыши. Я использовал отладчик Chrome, чтобы прийти к такому выводу.
Новые версии jQuery, похоже, не влияют на результат.
Если ответ очевиден, я потратил некоторое время на поиск в SO и Google!
Заранее спасибо.
2 ответа
Вы хотите, чтобы проверить и снять флажок использовать логические значения в проп, не используйте removeProp
что может привести к удалению свойства selected из элемента в каком-либо браузере, как вы упомянули, и может вызвать такие проблемы.
function check() {
$("#box").prop("checked", true);
}
function uncheck() {
$("#box").prop("checked", false);
}
См док
Метод.removeProp() удаляет свойства, установленные методом.prop().
С некоторыми встроенными свойствами элемента DOM или объекта окна, браузеры могут генерировать ошибку, если предпринята попытка удалить свойство. Сначала jQuery присваивает свойству значение undefined и игнорирует любую ошибку, сгенерированную браузером. В общем случае необходимо удалить только пользовательские свойства, которые были установлены для объекта, а не встроенные (собственные) свойства.
Примечание. Не используйте этот метод для удаления собственных свойств, таких как отмеченные, отключенные или выбранные. Это полностью удалит свойство и после удаления не может быть снова добавлено к элементу. Используйте.prop(), чтобы вместо этих свойств установить false.
Сделай это так:
function check() {
$("#box").prop("checked", true);
}
function uncheck() {
$("#box").prop("checked", false);
}