首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件类型属性在IE-8中丢失

事件类型属性在IE-8中丢失
EN

Stack Overflow用户
提问于 2012-10-24 16:55:12
回答 1查看 1.7K关注 0票数 4

我注意到一个奇怪的Javascript错误,似乎只发生在Internet 8上。基本上,在IE-8上,如果您有一个事件处理程序函数来捕获闭包中的事件对象,则事件"type“属性似乎在闭包中无效。

下面是一个简单的代码片段,用于复制错误:

代码语言:javascript
复制
<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 8错误,因为表达式ev.type说“找不到成员”。在闭包中捕获事件对象之后,事件对象的type属性似乎神秘地消失了。

我在Firefox、Safari和Chrome上测试了这个代码片段,它们都没有报告错误情况。但在IE-8中,事件对象在闭包中捕获后似乎变得无效。

问题:为什么在IE-8中会发生这种情况,有什么解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-24 16:57:46

是的,之所以会发生这种情况,是因为事件数据结构是IE8中的一个全局变量,因此当它们发生时会被其他事件覆盖。如果需要在闭包中保留它,则必须在闭包中创建事件数据结构的实际副本,这样就可以引用静态副本,而不是IE8重用的一个全局结构。

创建数据结构的副本包括创建一个新对象和对所有属性进行复制。如果任何属性本身都是对象或数组,您也必须创建它们的副本(将它们赋值给新对象将指定引用,而不是副本)。

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

代码语言:javascript
复制
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);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13053950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档