ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – IE-8中丢失的事件类型属性

2019-06-20 19:21:25  阅读:144  来源: 互联网

标签:javascript javascript-events internet-explorer-8 html


我注意到一个奇怪的Javascript错误,它似乎只发生在Internet Explorer 8上.基本上,在IE-8上如果你有一个事件处理函数捕获闭包中的事件对象,事件“type”属性似乎变得无效从关闭内部.

这是一个简单的代码片段,可以重现错误:

<html>
    <head>
        <script type="text/javascript">
            function handleClickEvent(ev)
            {
                ev = (ev || window.event);
                alert(ev.type);
                window.setTimeout(function() {
                    alert(ev.type); // Causes error on IE-8
                }, 20);
            }

            function foo()
            {
                var query = document.getElementById("query");
                query.onclick = handleClickEvent;
            }

        </script>
    </head>
    <body>
        <input id="query" type="submit" />
        <script type="text/javascript">
            foo();
        </script>
    </body>
</html>

所以基本上,这里发生的是在handleClickEvent函数中,我们有事件对象ev.我们调用alert(ev.type),我们看到事件类型是“click”.到现在为止还挺好.但是当我们在一个闭包中捕获事件对象,然后再从闭包内再次调用alert(ev.type)时,现在突然出现Internet Explorer 8错误,因为表达式ev.type而出现“Member not found” .在我们捕获闭包中的事件对象之后,似乎事件对象的type属性神秘地消失了.

我在Firefox,Safari和Chrome上测试了此代码段,但没有一个报告错误情况.但是在IE-8中,事件对象在关闭时被捕获后似乎变得无效.

问题:为什么在IE-8中发生这种情况,是否有解决方法?

解决方法:

是的,这是因为事件数据结构是IE8中的全局变量,所以当它们发生时它会被其他事件覆盖.如果你需要它来保持闭包,你将不得不在闭包中制作事件数据结构的实际副本,这样你就可以引用静态副本而不是IE8重用的一个全局结构.

制作数据结构的副本包括创建一个新对象并复制所有属性.如果任何属性本身是对象或数组,您也必须复制它们(只需将它们分配给新对象将分配引用,而不是副本).

或者,如果您只需要类型,那么只需将类型分配给闭包中的局部变量,然后像这样引用它.

function handleClickEvent(ev)
{
    ev = (ev || window.event);
    // save copy of type locally so we can use it later in setTimeout()
    var type = ev.type;
    alert(type);
    window.setTimeout(function() {
        alert(type);
    }, 20);
}

标签:javascript,javascript-events,internet-explorer-8,html
来源: https://codeday.me/bug/20190620/1247282.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有