这是Internet Explorer 8的onpropertychange事件的错误吗?

时间:2012-09-24 00:37:46

标签: javascript internet-explorer-8

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

1 个答案:

答案 0 :(得分:0)

这个对我有用JQuery:

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

或者

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

我们的想法是在更改值之前首先关注,然后在代码更改值后删除焦点。下次用户按下某个键时,将触发onpropertychange。