来自事件处理者的触发事件在IE10中具有不同的行为

时间:2015-05-26 16:44:55

标签: javascript internet-explorer

我想在按键内触发模糊。 IE10与Chrome / FF的工作方式不同。似乎IE将在调用模糊处理程序之前完成keydown处理程序,而Chrome和FF将在模糊发生时立即触发模糊处理程序,然后返回完成按键处理程序。

我想知道这是不是一个错误,如果在IE中有一个很好的解决方法可以像Chrome和FF一样工作。

请参阅下面的代码。

 $(document).ready(function () {
     document.getElementById("txtInput").addEventListener('blur',
     function (event) {
         console.log('blur');
     });

     document.getElementById("txtInput").addEventListener('keydown',
     function (event) {
         console.log('down 1');
         document.getElementById("txtInput").blur();
         console.log('down 2');
     }
     );
 });

http://jsfiddle.net/244raf1u/

Chrome的输出:

down 1
blur
down 2

IE的输出

down 1
down 2
blur

2 个答案:

答案 0 :(得分:0)

试试这个:

$(document).ready(function () {

     $("#txtInput").blur(function (event) {
         event.preventDefault();
         console.log('blur');
     });

     $("#txtInput").keypress(function (event) {
         console.log('down 1');
         $(this).blur();
         console.log('down 2');
     });

 });

查看我在此更新的提琴手here中所做的更改。

我不得不改变你调用blur()触发器的方式,然后在blur()处理程序中添加一个简单的event.preventDefault()来防止在IE中再次触发。似乎IE在运行按键处理程序后试图将焦点从输入上移开。

同样通过使用这种表示法:($(“#txtInput”)[0])你实际上指的是原始元素对象而不是jQuery对象,这可能导致IE中的问题,其他两个正在捕获错误。

希望这会有所帮助!

答案 1 :(得分:0)

我找到了几个解决方案。首先是使用焦点而不是模糊。模糊不泡,焦点确实。不确定为什么重要,但事件可能以不同的方式实施。不幸的是,这对我来说不是一个选择。

另一个解决方案是拥有两个keydown处理程序。第一个触发模糊以及我想在模糊之前发生的任何事情。第二个处理程序在模糊之后进行处理,但是我必须设置50ms的超时,因为所有的keydown处理都发生在模糊处理之前。