2012-09-24 21 views
1

我正在使用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> 
+0

我遇到了同樣的問題,並且使得元素獲得焦點後,其價值變化將有所幫助。我期待更好的解決方案,雖然.. –

+0

http://jsfiddle.net/AndyE/4C6KL/,奇怪,這對作品罰款只在jsfiddle –

+0

更新我的OP。 IE9展現出與IE8不同的(並且更糟糕的)錯誤。 Joy – Trent

回答

0

這一個jQuery的工作對我來說:

$('#foo').focus().val(val).blur(); 

或者

var textBox = document.getElementById("foo"); 
textBox.focus(); 
textBox.value = val; 
textBox.blur(); 

當時的想法是第一家專注變化前值,然後刪除在代碼更改了值後重點關注。下次用戶按下某個鍵時,onpropertychange將會觸發。