在IE浏览器中,“onchange”事件延迟了吗?(在Firefox中正常)

5

这可能是一个初学者的问题,但我不明白为什么IE永远不会调用onchange事件,而Firefox可以正常工作。

<input type="text" id="mytext" size="48" value="" onchange="execute()"/>
<button type="button" onclick="execute()">Go</button>

当点击按钮时,将调用execute函数,但不会在输入框中的文本更改时调用。

有什么想法吗?


也许你可以在这里看一下:http://support.microsoft.com/?scid=kb%3Ben-us%3B319741&x=11&y=12,似乎 onchange 事件有一个 bug。 - Boris Guéry
2
使用跨浏览器框架,否则您将无法找到所有问题... - jldupont
6个回答

15

当元素失去焦点时,只有IE会触发onchange事件 - 如果您单击元素外部或切换到不同的元素,则应该会触发。

您可以通过使用不同的事件来解决此问题,例如onkeypress


2
你确定只有IE会出现这种行为吗?我刚在FF3.5和IE7中测试了一下,两者都表现出相同的行为,即在失去焦点后触发事件。 - msp
经过尝试,我必须承认这是最好的答案。jQuery在IE上存在类似的问题。我不得不使用keydown事件而不是onchange。 - luc
4
通常情况下,阅读规格说明是一个很好的开始:“当控件失去输入焦点并且自获取焦点以来其值已被修改时,会触发change事件。” - http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents - NickFitz
通常最好同时使用 onkeypressonchange,因为该字段也可以通过右键+粘贴进行修改。 - Justin Johnson
只有当菜单打开时才是真的。如果菜单聚焦但实际上没有打开,例如通过键盘(通过tab + arrows)使用的用户,则Firefox和IE会有所不同。在这种情况下,Firefox直到元素失去焦点才触发onchange,而IE则在浏览选项时触发。当菜单实际上打开时(通过Alt +向下箭头,包括屏幕阅读器行为),行为完全不同。 - Marcy Sutton

6
虽然有些烦人,但是onchange事件直到元素失去焦点才会触发,这并不是一个错误。(我通过为不同的事件绑定多个处理程序来解决此问题;确保不要覆盖处理程序,并在适当时使用更新聚合。)

以下是"官方" W3C文档:

当控件失去输入焦点且其值自获取焦点以来已被修改时,onchange事件会被触发。此属性适用于以下元素:INPUT、SELECT和TEXTAREA。

以下是MSDN参考:

当内容被提交时触发此事件,而不是在值改变时触发。例如,在文本框上,用户输入时不会触发此事件,而是[在用户离开具有焦点的文本框时触发]

这种行为虽然经常很烦人,但是它是“按规定”的。


3

如其他地方所述,IE在您单击输入字段外部之前不会触发事件。

以下是我如何使用jQuery修复它的简要说明。(这是我的代码翻译,可能存在错误...)

<input id="somecheck" name="somecheck" value="1" onchange="dosomething();">

...被更改为...

<input id="somecheck" name="somecheck" value="1">

<script language="javascript">
$(document).ready(function() {

    $('#somecheck').change(function() { dosomething(); } );
});
</script>

对于那些刚接触 jQuery 的人来说,你需要等待页面完全加载完成,然后将事件处理程序“dosomething”添加到输入框中。

2

哦,几个月前我也花了一些时间解决这个问题。我为FF/IE onchange想出了以下解决方案:

$("input[name*='delivery_method']").bind(($.browser.msie ? "click" : "change"), function() {
    //your code here
});

2
据我所记,IE和FF处理onchange事件的方式不同。鼠标单击时会触发该事件。
我建议您使用一个处理事件的库,如jQuery、Dojo等。请参考jQueryDojo等相关文档。

你是正确的!我会听取你的建议并使用 jquery。 - luc
1
jQuery是一个不错的推荐,但它在onchange和IE方面存在类似的问题。 - luc
你能贴出你的代码吗?最近我也做了类似的事情来处理两个选择输入,没有遇到任何问题。 - Boris Guéry

1

IE在你的输入失去焦点后才会执行,这只有在你点击按钮、切换到其他选项卡或者屏幕上的其他位置时才会发生。尝试使用onclick或其他事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接