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

时间:2010-11-09 20:30:40

标签: javascript internet-explorer event-handling

前言

  • 请注意,我不是在寻找代码解决方案,而是要深入了解可能出现这种情况的原因。
  • 错误发生在IE(测试7& 8),但不是Firefox,Chrome,Safari。

描述

当手动调用分配给onclick的函数时,如果满足以下所有条件,则抛出Error: Object doesn't support this action IE:

  1. 您可以通过元素的on[event]属性直接调用该方法。
  2. 您不使用.call().apply()
  3. 你传递一个参数(任何参数,甚至是undefined)。
  4. 您尝试将返回值分配给变量。
  5. 违反任何一条规则,并且通话成功。

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

    代码

    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
    

    ...但这不应该是一个惊喜,因为它实际上与上面的第四个版本相同。

3 个答案:

答案 0 :(得分:3)

关于“为什么”以这种方式实施,外界可能没有答案。一个很好的例子是,前IE开发者,innerHTML的发明者,面对problems本身就是innerHTML。

询问原因也是不必要的,因为

  1. 您通常不会使用明确的参数调用事件处理程序
  2. 您可以解决问题(正如您在问题中所述)
  3. 另外需要注意的是,你的类比太具体了。问题不仅限于 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