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

标签 javascript internet-explorer-8

我使用 onpropertychange 事件来检测用户键入时(即文本框失去焦点之前)对文本框的更改。这是有效的,但是当我使用代码设置文本框值时,似乎出现了一个错误。这样做会导致 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 存在一个错误,退格键根本不会触发 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>

最佳答案

这个对我来说适用于 JQuery:

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

或者

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

这个想法是在更改值之前首先获得焦点,然后在代码更改值后移除焦点。下次用户按下某个键时,onpropertychange 将触发。

关于javascript - 这是 Internet Explorer 8 的 onpropertychange 事件的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557511/

相关文章:

javascript - 在散点图上旋转文本

javascript - 如何在mongolab中存储图像

windows - 手动安装 ActiveX 组件

html - IE8 并排 DIVS 正在堆叠

javascript - 使用firebase时如何添加后端业务逻辑?

javascript - 每帧多次调用 requestAnimationFrame 的模式是什么?

javascript - 选择复选框上的元素选择

javascript - 希望切换到 VS 2013/MVC 进行 Web 开发但需要支持 IE8

Javascript 与 IE8 - 预期的标识符、字符串或数字

javascript - Traceur 在多大程度上编译为 IE8 兼容的 Javascript?