<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
從onClickHandler
和/或onChangeHandler
內,我怎麼能確定是否複選框的新狀態?獲得價值/平變化事件
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
從onClickHandler
和/或onChangeHandler
內,我怎麼能確定是否複選框的新狀態?獲得價值/平變化事件
簡短的回答:
當你把它想使用click
事件,該事件將不會觸發,直到該值已經更新後,和火災:
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
較長的答案:
的change
事件處理函數不是調用,直到checked
狀態已經更新(live example | source),但因爲(蒂姆·布泰在評論中指出的),即沒有按不會觸發change
事件,直到複選框失去焦點爲止,您不會主動收到通知。更糟糕的是,如果您點擊標籤作爲複選框(而不是複選框本身)來更新它,則可以獲得您獲得舊值的印象(請點擊標籤在IE瀏覽器中試用:live example | source)。這是因爲如果複選框具有焦點,則單擊標籤將使焦點遠離焦點,用舊值觸發change
事件,然後click
發生設置新值並將焦點設置回覆選框。很混亂。
但是,如果您使用click
來代替,則可以避免所有這些不愉快。
我用DOM0處理器(onxyz
屬性),因爲這是你問什麼,但爲了記錄在案,我一般會建議掛接在代碼處理程序(DOM2的addEventListener
,或attachEvent
在舊版本的IE),而不是使用onxyz
屬性。這使您可以將多個處理程序附加到相同的元素,並可以避免使您的所有處理程序具有全局功能。
這個答案的早期版本中使用此代碼爲:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
的目標似乎是使點擊看值之前完成。據我所知,沒有理由這樣做,我不知道我爲什麼這樣做。該值在調用click
處理程序之前已更改。實際上,規格是quite clear about that。沒有setTimeout
的版本在我嘗試過的每個瀏覽器(甚至IE6)中都能很好地工作。我只能假設我在考慮一些其他平臺,直到事件發生之後才進行更改。無論如何,沒有理由使用HTML複選框來做到這一點。
使用此
<input type="checkbox" onclick="onClickHandler()" id="box" />
<script>
function onClickHandler(){
var chk=document.getElementById("box").value;
//use this value
}
</script>
幸運'onchange'在'+ IE9'正常工作。 [來源](http://www.quirksmode.org/dom/events/change.html) – Mori 2014-01-26 07:30:01
在這裏添加我的2分錢:看起來,IE8(以及以下,我假設)區分點擊和點擊發布...而且我們在這個網頁上的原因是因爲點擊而不是點擊發布而觸發。似乎複選框僅在點擊發布時激活 - 單擊然後移動鼠標將註冊點擊,但不會修改複選框。 – dah97765 2014-08-05 16:49:16
看起來像通過鍵盤導航('tab' +'space')切換複選框也會觸發'onclick'處理程序(至少在Chrome 51中進行驗證)。 – 2016-06-17 18:16:31