我正在使用onpropertychange事件檢測用戶正在輸入時對文本框所做的更改(即在框失去焦點之前)。這是行得通的,但是當我使用代碼設置文本框值時,似乎出現了一個錯誤。這樣做會導致onpropertychange事件觸發,因爲它應該如此,但下一個更改,用戶對文本框進行更改不會導致該事件觸發。在之後的更改會觸發該事件,但它會繼續正常工作,直到再次使用代碼設置文本框的值爲止。這是Internet Explorer 8的onpropertychange事件的錯誤嗎?
重現步驟:
1)添加onpropertychange事件作爲任一文本框HTML元素的屬性,或者使用DOM。 (document.form.TextboxName.onpropertychange = myHandler) 2)觀察文本框更改時onpropertychange事件觸發 3)使用代碼設置文本框值(document.form.TextboxName.value =「New value」) 4)觀察這會導致事件觸發 5)使用鍵盤更改文本框的值(插入後者,退格或刪除等) 6)注意此時沒有事件被觸發 7)再次使用鍵盤更改文本框的值。事件繼續發射正常
首先我想得到確認,這確實是一個IE錯誤,並且我的代碼不是怪罪。我還在尋找如何解決此問題的建議。我想跟蹤文本框值的所有更改。像onkeydown這樣的其他事件都是有限的,因爲它們不檢測修改值的非鍵盤方法。這隻需要在IE 8中工作。
編輯:代碼如下。在家中的瀏覽器上運行(IE9),所述問題不會發生。然而,IE9展示了一個錯誤,那就是backspaces根本不會觸發onpropertychange事件!將模式切換到IE8標準(按F12並選擇瀏覽器模式)會導致代碼按照本文所述運行(事件觸發,直到控件的文本值使用代碼設置,在這種情況下,輸入的下一個字符不會觸發事件。)
<!doctype html>
<html>
<head>
<script type="text/javascript" language="javascript">
var changingValue = false;
function onpropchange(){
if (window.event.propertyName == "value" && !changingValue) {
// Do stuff here
alert("Changed via user input");
}
}
function setTextBoxValue(val) {
var textBox = document.getElementById("foo");
changingValue = true;
textBox.value = val;
changingValue = false;
}
window.changeValue = function() {
setTextBoxValue("NEW VALUE");
}
</script>
</head>
<body>
<input id="foo" onpropertychange="onpropchange();">
<input type="button" value="change value" onclick="changeValue()">
</body>
</html>
我遇到了同樣的問題,並且使得元素獲得焦點後,其價值變化將有所幫助。我期待更好的解決方案,雖然.. –
http://jsfiddle.net/AndyE/4C6KL/,奇怪,這對作品罰款只在jsfiddle –
更新我的OP。 IE9展現出與IE8不同的(並且更糟糕的)錯誤。 Joy – Trent