JavaScript 事件处理程序 : problem with execution of handler that got parameters

标签 javascript events dom-events

我有这个问题:

我已经定义了一个需要参数的事件处理程序。

var handler = function(p1, p2){
    //some code
}

然后我将事件处理程序添加到函数内的对象。

function foo(p1, p2){
    //Some code
    obj.addEventListener('click', handler(p1, p2), false)
}

如您所知,上面的代码是不正确的。它不会听取事件。相反,它会立即执行该功能。现在要解决这个问题,我只需删除 handler(p1, p2) 并插入 function(){ handler(p1, p2) } 即可。但问题是我有另一个函数想要删除事件监听器,这对于后一种解决方案是不可能的。

function koo(){
    //Some code
    obj.removeEventListener('click', handler, false)
}

我该如何解决这个问题?

最佳答案

我想你需要创建一个闭包:

var createHandler = function(p1, p2){
    return function (event) {
        //some code that uses p1 and p2
    };
};

var handler;

...现在您可以像这样分配处理程序,同时仍然可以访问 p1 和 p2:

function foo(p1, p2){
    handler = createHandler(p1, p2);
    //Some code
    obj.addEventListener('click', handler, false);
}

function koo(){
    //Some code
    obj.removeEventListener('click', handler, false);
    handler = null;
}

请注意,handler 现在是一个全局变量。


更新:我刚刚意识到,在您的情况下,这可以通过合并 createHandlerfoo 来简化,如下所示:

var handler; // we need this to be accessible both to foo and koo

function foo(p1, p2){
    handler = function(event) {
        // some code that uses p1 and p2
    };
    //Some code
    obj.addEventListener('click', handler, false);
}

function koo(){
    //Some code
    obj.removeEventListener('click', handler, false);
    handler = null;
}

关于JavaScript 事件处理程序 : problem with execution of handler that got parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894416/

相关文章:

javascript - THREE.js:将摄影机从上方更改为第一人称

javascript - 在 Windows Chrome #74 上访问触摸属性

Delphi:WebBrowser 的 OnDownloadComplete 一次发生多次

javascript - 对滚动使用react被动事件处理程序

javascript - 当最后一个条目正确时 onsubmit 不会被触发

javascript - jQuery Ajax 从网站的另一个页面加载内容

javascript - 是否可以将函数以字符串的形式存储并在调用字符串后调用它?

javascript - 在删除点击上实现删除确认框

c# - 取消订阅从未订阅过的事件是否安全?

powershell - 将参数传递给Register-EngineEvent操作脚本 block