簡體   English   中英

將多個 arguments 與事件 object 一起傳遞給事件處理程序

[英]Pass multiple arguments along with an event object to an event handler

如何在不使用Function.prototype.bind的情況下將多個 arguments 與事件 object 一起傳遞給事件處理程序?

事件處理程序中有一個閉包。

下面的基本代碼不起作用,

element.addEventListener("click", eventHandler(eventObj + arguments), false);

function eventHandler(eventObj + arguments) {
  return function(){}; //a closure
}

我不知道如何將事件 object 和其他 arguments 同時傳遞給事件處理程序。

更新:

我什至嘗試在 addEventListener 中使用匿名 function。 這樣做,控件似乎從未到達回調 function 內的閉包。

element.addEventListener("click", function(e){
    var data = {'event':e, 'args':arguments};
    eventHandler(data);
  }, false);

function eventHandler(data) {
  return function(){  //this function is never executed
    console.log(JSON.stringify(data));
  };
}

因此,如果我理解正確,您希望向元素添加事件偵聽器,並配置一些在您添加偵聽器時存在的其他數據,以便在調用時傳遞給偵聽器。 如果這就是你想要做的,你只需要一個合適的關閉。 這樣的事情,假設您想要將其他數據存儲在對象中:

var extra_data = {one: "One", two: "Two"};

var make_handler = function (extra_data) {
  return function (event) {
    // event and extra_data will be available here
  };
};

element.addEventListener("click", make_handler(extra_data));

我懷疑你不能,但有一個訣竅:

element.clickArguments=new Object();
element.clickArguments.argument1=...;
element.clickArguments.argument2=...;

現在在您的事件處理程序中引用事件發送對象。

我知道這個線程已經過時了,但這是我在這里看到的一個常見錯誤。

我甚至嘗試在addEventListener中使用匿名函數。 這樣做,似乎控件從未到達回調函數內的閉包。
-
@asur

您需要從eventHandler()調用返回的閉包。

element.addEventListener("click", function(e){
    var data = {'event':e, 'args':arguments};
    eventHandler(data)();    // invoking the closure here
  }, false);

如果你不是,你只需要一個閉包返回二進制必殺技。

除此之外,它更適合@ jmm的解決方案,而它更干凈。

我有一個 function,它有一個用於捕獲當前相對值 URL 以及其他值的參數。 為了簡單起見,我只提到URL的參數。

使用“event”作為關鍵字,如此處捕獲事件 object:

function Analyze(url) {
if (event) {
// do something with the event object, such as:
alert(event.timeStamp);
// ...
}

function 在按鈕中調用

onclick="Analyze(document.URL);".

是的,我知道這種形式的祈求讓我變成了一個頑皮的男孩,但在這種情況下有一個很好的借口。

如果將“event”替換為“e”或“x”,此技術將不起作用,但可能還有其他可能性。

輔助功能:

function curryRight( original ) {
    var args = [].slice.call( arguments, 1 );
    return function() {
        return original.apply( this, [].slice.call( arguments ).concat( args ) );
    };
}

用法:

element.addEventListener("click", curryRight( eventHandler, 1, 2, 3 ), false );

例:

function eventHandler( event, a, b, c ) {
    console.log( event, a, b, c );
    //Logs MouseEvent, 1, 2, 3
}

document.addEventListener("click", curryRight( eventHandler, 1, 2, 3 ), false );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM