Javascript 如何附加事件“;ondblclick“点击”;,谁的处理程序在“直接分配”中接受;这";作为参数

Javascript 如何附加事件“;ondblclick“点击”;,谁的处理程序在“直接分配”中接受;这";作为参数,javascript,javascript-events,parameters,event-handling,Javascript,Javascript Events,Parameters,Event Handling,RawClickedi对这样的事件使用了tr的旧赋值方法 <tr ondblclick="RawClicked(this) ....... 那么在这种情况下,如何将参数“this”传递给函数呢 在您的示例中,元素是节点的集合,而不是单个元素,因此您不能以这种方式添加事件侦听器。您可以迭代此节点集合,或者使用事件委派并将事件侦听器附加到 在这一行AssigningEventHandles(元素“dblclick”,RawClicked(this))RawClicked与绑定到全局对象的th

RawClickedi对这样的事件使用了tr的旧赋值方法

<tr ondblclick="RawClicked(this) .......
那么在这种情况下,如何将参数“this”传递给函数呢

  • 在您的示例中,
    元素
    是节点的集合,而不是单个元素,因此您不能以这种方式添加事件侦听器。您可以迭代此节点集合,或者使用事件委派并将事件侦听器附加到

  • 在这一行
    AssigningEventHandles(元素“dblclick”,RawClicked(this))
    RawClicked与绑定到全局对象的
    this
    一起执行。因此,作为
    handler
    传递给
    AssigningEventHandles
    的参数是该函数的结果,该函数无效。您应该像这样传递函数:
    AssigningEventHandles(元素“dblclick”,RawClicked)
    然后在
    raw中使用
    this.id
    而不是
    raw.id

  • 固定代码:

    var element = document.getElementById("CustomersTable").getElementsByTagName('tr');
    AssigningEventHandles(element, "dblclick", RawClicked);
    
    function AssigningEventHandles(element, event, handler) {
      if( !element.length ){ /* convert to array if it's a single node */
        element = [element];
      }
      for( var i=0; i<element.length; i++){ /* iterate over nodes and attach event listeners */
        if (element[i].addEventListener) {
            element[i].addEventListener(event, handler, false);
        }
    
        else if (element[i].attachEvent) {
            element[i].attachEvent("on"+ event, handler);
        }
      }
    }
    
    function RawClicked() {
    /* `this` is bound to the clicked element */
        var rawDoubleClicked = this.id;
        alert(this);
    }
    
    var element=document.getElementById(“CustomerTable”).getElementsByTagName('tr');
    赋值事件句柄(元素“dblclick”,单击);
    函数AssigningEventHandles(元素、事件、处理程序){
    如果(!element.length){/*是单个节点,则转换为数组*/
    元素=[元素];
    }
    
    对于(在firefox中的var i=0;i(使用AddEventListener)来说,处理程序似乎是在元素的作用域中运行的,所以只需在RawClicked中使用“this”就可以正常工作了

    pawel的回答肯定更好!你有没有尝试过我文章末尾的JSFIDLE链接?对我有用;)是的,我看到了,这就是我投票支持你的答案的原因,尽管它对我不起作用:)
    var element = document.getElementById("CustomersTable").getElementsByTagName('tr');
    AssigningEventHandles(element, "dblclick", RawClicked);
    
    function AssigningEventHandles(element, event, handler) {
      if( !element.length ){ /* convert to array if it's a single node */
        element = [element];
      }
      for( var i=0; i<element.length; i++){ /* iterate over nodes and attach event listeners */
        if (element[i].addEventListener) {
            element[i].addEventListener(event, handler, false);
        }
    
        else if (element[i].attachEvent) {
            element[i].attachEvent("on"+ event, handler);
        }
      }
    }
    
    function RawClicked() {
    /* `this` is bound to the clicked element */
        var rawDoubleClicked = this.id;
        alert(this);
    }