Передать несколько аргументов вместе с объектом события в обработчик события - javascript - PullRequest
5 голосов
/ 20 января 2012

Как можно передать несколько аргументов вместе с объектом события в обработчик события, не используя Function.prototype.bind?

В обработчике событий есть замыкание.

Нижеследующий базовый код не будет работать,

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

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

НадеюсьНе знаю, как передать объект события и другие аргументы одновременно обработчику события.

Обновлено:

Я даже пытался использовать анонимную функцию внутри addEventListener.При этом кажется, что элемент управления никогда не доходил до замыкания внутри функции обратного вызова.

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));
  };
}

Ответы [ 3 ]

18 голосов
/ 20 января 2012

Поэтому, если я правильно понимаю, вы хотите добавить прослушиватель событий к элементу и настроить некоторые дополнительные данные, которые существуют во время добавления прослушивателя, для передачи прослушивателю при его вызове.Если это то, что вы хотите сделать, вам просто нужно надлежащее закрытие.Примерно так, при условии, что вы хотите сохранить дополнительные данные в объекте:

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));
2 голосов
/ 20 января 2012

Я подозреваю, что вы не можете, но есть хитрость:

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

Теперь в вашем обработчике ссылки на объект, генерирующий событие.

0 голосов
/ 22 января 2012

вспомогательная функция:

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...