Получение значения флажка HTML из событий onclick/onchange
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
внутри onClickHandler и/или onChangeHandler, Как я могу определить, будет ли новое состояние checkbox?
2 ответа:
короткий ответ:
использовать
clickсобытие, которое не будет срабатывать до тех пор, пока значение не будет обновлено, и срабатывает, когда вы хотите:<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label> function handleClick(cb) { display("Clicked, new value = " + cb.checked); }видео/источник
более подробный ответ:
The
changeобработчик событий не вызывается доcheckedсостояние было обновлено (видео/источник), а потому, что (как Тим Бюте указывает в комментариях) IE не стреляетchangeсобытие пока флажок не потеряет фокус, вы не получите уведомление проактивно. Хуже того, с IE, если вы нажмете метка для флажка (а не сам флажок), чтобы обновить его, вы можете получить впечатление, что вы получаете старое значение (попробуйте его с IE здесь, нажав на метку:видео/источник). Это потому, что если флажок имеет фокус, нажав на метку отвлекает внимание от него, стреляяchangeсобытие со старым значением, а затемclickпроисходит установка нового значения и установка фокуса обратно на флажок. Очень запутанный.но вы можете избежать всех этих неприятностей, если вы используете
clickвместо.я использовал обработчики DOM0 (
onxyzатрибуты) потому что это то, о чем вы спрашивали, но для записи я бы вообще рекомендовал подключить обработчики в коде (DOM2addEventListenerилиattachEventв старых версии IE) вместо использованияonxyzатрибуты. Это позволяет присоединить несколько обработчиков к одному элементу и позволяет избежать создания всех ваших обработчиков глобальных функций.
более ранняя версия этого ответа использовала этот код для
handleClick:function handleClick(cb) { setTimeout(function() { display("Clicked, new value = " + cb.checked); }, 0); }цель, казалось, чтобы позволить щелчок, чтобы завершить, прежде чем смотреть на значение. Насколько мне известно, для этого нет причин, и я понятия не имею, почему я это сделал. Значение изменяется перед началом
clickобработчик вызывается. На самом деле, спецификация совершенно ясно, что о. Версия безsetTimeoutотлично работает в каждом браузере, который я пробовал (даже IE6). Я могу только предположить, что я думал о некоторых другое платформа, где изменение не делается до тех пор, пока после события. В любом случае, нет причин делать это с помощью флажков HTML.