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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

Beginning ARKit for iPhone and iPad

Beginning ARKit for iPhone and iPad

Wallace Wang / Apress / 2018-11-5 / USD 39.99

Explore how to use ARKit to create iOS apps and learn the basics of augmented reality while diving into ARKit specific topics. This book reveals how augmented reality allows you to view the screen on ......一起来看看 《Beginning ARKit for iPhone and iPad》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具