当手动调用分配给onclick
的函数时,如果满足以下所有条件,则抛出Error: Object doesn't support this action
IE:
on[event]
属性直接调用该方法。.call()
或.apply()
。undefined
)。违反任何一条规则,并且通话成功。
该功能本身似乎与它无关。空函数给出相同的结果。
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为何以这种方式实施。
非常感谢。
编辑:为了澄清一件事,实际功能似乎没有任何区别。命名参数,不命名它们,返回参数,返回文字值,返回undefined,所有这些都没有效果。
这可能是因为函数似乎永远不会被调用。正如我在下面的评论中指出的那样,导致此调用的代码运行正常,因此它也不是解析问题。但是当解释器到达这个时,它会看到:
Variable + AssignmentOperator + DOMElement + EventHandler + CallOperator + Argument
...并抛出错误。我做的任何操作似乎没有任何区别。有效删除其中任何一个,错误消失。
如果我在其中间添加一个存储处理程序的变量,则从它工作的变量中激活它。
var temp = elem.onclick;
result = temp( true ); // works
...但这不应该是一个惊喜,因为它实际上与上面的第四个版本相同。
答案 0 :(得分:3)
关于“为什么”以这种方式实施,外界可能没有答案。一个很好的例子是,前IE开发者,innerHTML的发明者,面对problems本身就是innerHTML。
询问原因也是不必要的,因为
另外需要注意的是,你的类比太具体了。问题不仅限于 assignment expression
,您可以使用其他类型的 expressions
重现该问题:
undefined === elem.onclick( true )
typeof elem.onclick( true )
elem.onclick( true ) - 1
alert(elem.onclick( true ))
答案 1 :(得分:0)
您是否尝试过使用here找到的说明?他建议使用这样的代码:
var fireOnThis = document.getElementById('someID');
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent( 'click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
fireOnThis.dispatchEvent(evObj);
答案 2 :(得分:0)
尝试一些实际上有一个参数的函数并实际返回一些东西。看它是否也会产生错误。它可能与参数和函数默认返回值有关。请试试并发回结果。
修改
如果没有调用该函数,问题可能出在属性onclick的解析中。它可能以某种方式你实际上没有调用你定义的函数,但是当你传递true作为参数时,代码会在IE对象中找到一些其他的构建。在任何情况下,这种行为都不符合任何规范,因此我们可能称之为bug。从我自己的问题中可以看出,IE中有很多。
IE 8 absolute positioned element outside its parent clipping problem
IE8 bottom:0 in position:absolute behaves like position:fixed