我正在使用onpropertychange事件来检测用户输入时文本框的更改(即在框失去焦点之前)。这是有效的,但是当我使用代码设置文本框值时,似乎会出现错误。这样做会导致onpropertychange事件触发,但是,用户对文本框进行的 next 更改不会导致事件触发。 下一次更改后的更改会触发事件,并且它会继续正常工作,直到再次使用代码设置文本框值。
重现的步骤:
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会出现一个错误,即退格区根本不会触发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)
这个对我有用JQuery:
$('#foo').focus().val(val).blur();
或者
var textBox = document.getElementById("foo");
textBox.focus();
textBox.value = val;
textBox.blur();
我们的想法是在更改值之前首先关注,然后在代码更改值后删除焦点。下次用户按下某个键时,将触发onpropertychange。