Как с помощью JavaScript я могу изменить обработчик события onclick тега <a>на функцию с параметрами? - PullRequest
1 голос
/ 03 февраля 2009

Я знаю, что вы можете установить обработчик onclick следующим образом:

my_a = document.createElement('a');
my_a.onclick = somefunction;

... но что, если somefunction принимает параметр? Для простоты, скажем, мне нужно передать ему строку «х». Возможно ли динамически установить обработчик onclick для некоторой функции ('x')?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2009

Тогда вы создадите анонимную функцию:

my_a = document.createElement('a');
my_a.onclick = function() { somefunction(x); };

Если вы также хотите сослаться на this в somefunction, вы можете использовать библиотеку типа [Prototype] [1], тогда вы бы сделали что-то вроде:

my_a = document.createElement('a');
my_a.onclick = somefunction.bind(this, x);

[1]: http://alternateidea.com/blog/articles/2007/7/18/javascript-scope-and-binding Статья блога

2 голосов
/ 03 февраля 2009

Вы хотите использовать так называемую анонимную функцию :

my_a.onclick = function() {
    somefunction(arguments, here);
};

Если вы хотите сохранить «это», вы можете использовать замыкания :

my_a.onclick = function() {
    somefunction.call(my_a, arguments, here);
};
1 голос
/ 03 февраля 2009

То, что вы хотите, это частичное применение функции :

function partial(func /*, 0..n args */) {
  var args = Array.prototype.slice.call(arguments).splice(1);
  return function() {
    var allArguments = args.concat(Array.prototype.slice.call(arguments));
    return func.apply(this, allArguments);
  };
}

Теперь вы сможете сделать это:

my_a.onclick = partial(somefunction,1,2,3); //1,2,3 being some parameters
0 голосов
/ 03 февраля 2009

Самый простой способ - обернуть его в анонимную функцию. Как это:

my_a.onclick = function() { somefunction('x'); };

Недостатком является то, что «this» больше не будет ссылаться на «my_a» внутри функции someFunction, но если вам это не нужно, анонимная функция должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...