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

问题描述 投票:4回答:1

[我注意到一个奇怪的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),然后看到事件类型为“点击”。到目前为止,一切都很好。但是当我们在一个闭包中capture事件对象,然后从该闭包内再次调用alert(ev.type)时,突然出现了Internet Explorer 8错误,由于表达式ev.type而说“找不到成员” ]。在我们捕获闭包中的事件对象之后,似乎事件对象的type属性神秘地消失了。]

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

问题

:为什么在IE-8中会发生这种情况,并且有任何解决方法吗?

[我注意到一个奇怪的Javascript错误,该错误似乎只发生在Internet Explorer 8上。基本上,在IE-8上,如果您有一个事件处理函数可以捕获闭包中的事件对象,则...]]

javascript html internet-explorer-8 dom-events
1个回答
5
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.