带有参数的Javascript事件处理程序

我想做一个eventHandler传递事件和一些参数。问题是该函数不获取元素。这里是一个例子:

doClick = function(func){
    var elem = .. // the element where it is all about
    elem.onclick = function(e){
        func(e, elem);
    }
}
doClick(function(e, element){
    // do stuff with element and the event
});

‘elem’必须在匿名函数之外定义。如何获得传递的元素在匿名函数中使用?有没有办法做到这一点?

和addEventListener呢?我似乎不能通过addEventListener传递事件在所有我吗?

更新

我似乎解决了这个问题“这”

doClick = function(func){
    var that = this;
    this.element.onclick = function(e){
        func(e, that);
    }
}

这里包含这个元素,我可以访问的功能。

addEventListener

但我想知道addEventListener:

function doClick(elem, func){
    element.addEventListener('click', func(event, elem), false);
}
我不明白你的代码试图做什么,但你可以使变量可用在任何事件处理程序中使用函数闭包的优势:

function addClickHandler(elem, arg1, arg2) {
    elem.addEventListener('click', function(e) {
        // in the event handler function here, you can directly refer
        // to arg1 and arg2 from the parent function arguments
    }, false);
}

根据你的确切的编码情况,你可以几乎总是做某种封闭保留对你的变量的访问。

从你的意见,如果你想达到的是这样:

element.addEventListener('click', func(event, this.elements[i]))

然后,您可以使用自执行函数(IIFE)来执行此操作,该函数在执行时捕获闭包中所需的参数,并返回实际的事件处理函数:

element.addEventListener('click', (function(passedInElement) {
    return function(e) {func(e, passedInElement); };
}) (this.elements[i]), false);

有关IIFE工作原理的更多信息,请参阅以下其他参考文献:

Javascript wrapping code inside anonymous function

Immediately-Invoked Function Expression (IIFE) In JavaScript – Passing jQuery

What are good use cases for JavaScript self executing anonymous functions?

这最后一个版本可能更容易看到它在做什么像这样:

// return our event handler while capturing an argument in the closure
function handleEvent(passedInElement) {
    return function(e) {
        func(e, passedInElement); 
    };
}

element.addEventListener('click', handleEvent(this.elements[i]));

也可以使用.bind()为回调添加参数。任何传递给.bind()的参数都将被放在回调本身拥有的参数之前。所以,你可以这样做:

elem.addEventListener(function(a1, a2, e) {
    // inside the event handler, you have access to both your arguments
    // and the event object that the event handler passes
}.bind(elem, arg1, arg2));
http://stackoverflow.com/questions/10000083/javascript-event-handler-with-parameters

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:带有参数的Javascript事件处理程序