javascript – 在手动调用事件处理程序时给出某些条件的IE中出错

栏目: JavaScript · 发布时间: 5年前

内容简介:http://stackoverflow.com/questions/4138277/error-in-ie-when-manually-calling-event-handler-given-certain-conditions

前言

>请注意,我不是在寻找代码解决方案,而是深入了解为什么会发生这种情况.

> IE(测试7和8),但不是Firefox,Chrome,Safari的错误.

描述

当手动调用分配给onclick的功能时,如果满足以下所有条件,IE将抛出Error:Object不支持此操作:

>通过元素的[event]属性直接调用该方法.

>你不使用.call()或.apply().

你传递一个参数(任何参数,甚至是未定义的).

>您尝试将返回值分配给变量.

违反这些规则中的任何一个,并且呼叫成功.

该功能本身似乎与之无关.空函数给出相同的结果.

var elem = document.getElementById('test');  // simple div element.
var result;               // store result returned.

function test_func(){};   // function declaration.
                          // function expression behaves identically.

elem.onclick = test_func; // assign test_func to element's onclick.

// DIRECT CALL
test_func();                 // works
test_func( true );           // works
result = test_func();        // works
result = test_func( true );  // works

// DIRECT CALL, CHANGING THE CONTEXT TO THE ELEMENT
test_func.call( elem );                  // works
test_func.call( elem, true );            // works
result = test_func.call( elem );         // works
result = test_func.call( elem, true );   // works ******** (surprising)

// CALL VIA ELEMENT, USING .call() METHOD, CHANGING THE CONTEXT TO THE ELEMENT
elem.onclick.call( elem );                  // works
elem.onclick.call( elem, true );            // works
result = elem.onclick.call( elem );         // works
result = elem.onclick.call( elem, true );   // works ******** ( very surprising)

// CALL VIA ELEMENT
elem.onclick();                 // works
elem.onclick( true );           // works
result = elem.onclick();        // works
result = elem.onclick( true );  // Error: Object doesn't support this action

概要

再次,我不需要代码解决方案.相反,如果有人深入了解为什么IE以这种方式实现,我很好奇.

非常感谢.

编辑:澄清一件事,实际功能什么都没有任何区别.命名参数,不命名,返回参数,返回一个文字值,返回未定义,所有这些都不起作用.

这可能是因为函数似乎从来没有被实际调用.正如我在下面的评论中指出的,导致此调用的代码运行正常,因此它也不是解析问题.但是当口译人员到达这个时,它会看到:

Variable + AssignmentOperator + DOMElement + EventHandler + CallOperator + Argument

…并抛出错误.没有操纵我似乎有任何区别.任何一个的有效删除,错误消失.

如果我将一个变量添加到存储处理程序的中间,然后从变量工作起来.

var temp = elem.onclick;
result = temp( true );    // works

…但这不应该是一个惊喜,因为它是有效地与上面的第四个版本相同.

至于“为什么”这样实现,外面可能没有答案.一个很好的例子是,当前IE开发人员innerHTML的发明者面临着拥有innerHTML本身的 problems

.

问为什么也是不必要的因为

>你不会经常使用参数调用事件处理程序

>您可以解决问题(正如您在问题中所述)

另外要注意的是,你的比喻太具体了.问题不仅限于赋值表达式,还可以使用其他类型的表达式进行重现:

undefined === elem.onclick( true )
typeof elem.onclick( true )
elem.onclick( true ) - 1
alert(elem.onclick( true ))

http://stackoverflow.com/questions/4138277/error-in-ie-when-manually-calling-event-handler-given-certain-conditions


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

GUI设计禁忌2.0

GUI设计禁忌2.0

Jeff Johnson / 盛海艳 等 / 机械工业出版社 / 2008 / 49.00元

本书描述软件开发人员在设计图形用户界面(GUI)时经常犯的“禁忌”,并提出避免这些错误的基本原则和理论依据。本书将GUI禁忌分为7种类型:GUI控件禁忌、导航禁忌、文字禁忌、图形设计和布局禁忌、交互禁忌、响应性禁忌以及管理禁忌,并分别进行详述。 本书编排独特,条理清晰,针对性极强,是不可多得的GUI设计优秀资源。本书适合软件开发人员、web站点设计人员、开发经理、用户界面设计人员等阅读。一起来看看 《GUI设计禁忌2.0》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具