Передача параметров функции в событии onclick

#javascript

#javascript

Вопрос:

Я пытаюсь динамически создать некоторый HTML-код и назначить функцию onclick событию ссылки. Вот код, который у меня есть…

 link = document.createElement("a");
link.setAttribute("href", "#");
link.onclick = function(){someFunction(myObject.id);};
link.appendChild(document.createTextNode("Click Me!"));
  

Мои исследования показали, что я оборачиваю свой вызов функции внутри анонимной функции, как я уже делал. Однако я нахожу, что моя функция вызывается при запуске этого фрагмента скрипта, а не при событии click. Кажется, это распространенная проблема, но я следую всем советам, которые я нашел до сих пор, но безрезультатно.

Любая помощь или указания высоко ценятся.

Мистер Б.

Комментарии:

1. Это странно, someFunction() не должна вызываться, пока вы не нажмете на ссылку…

2. Я протестировал это в jsfiddle, оно отлично работает: jsfiddle.net/sGbjD

3. Я тоже пытался… ссылка.addEventListener(«щелчок», функция(){someFunction(object.id );}, false);

4. Хорошо, для начала, я думаю, что это может быть функция, которую я вызываю, как если бы я заменил вызов моей функции на вызов alert она работает нормально. Следующая проблема, поскольку объект поступает из массива, и я создаю список ссылок, object.id всегда один и тот же, значит, где-то что-то пошло не так.

5. Я вижу в одном из ваших других сообщений, что вы новичок в Javascript. Чтобы сохранить работоспособность, ознакомьтесь с jQuery. Я обнаружил это примерно через 5 лет моего опыта работы с Javascript и жаловался, что не обнаружил его раньше.

Ответ №1:

Может быть, попробовать этот альтернативный метод:

 function someFunction(id) {
    return function() {
        alert(id);
    };
}

link = document.createElement("a");
link.setAttribute("href", "#");
link.onclick = someFunction(myObject.id);
link.appendChild(document.createTextNode("Click Me!"));
  

Ответ №2:

Опубликованный вами код работает нормально — я только что его протестировал. Вот несколько возможностей, на которые следует обратить внимание..

  1. Где вы определили someFunction? Вызывается ли она по определению?
  2. Ссылаетесь ли вы на какую-либо функцию где-либо еще? Возможно, именно это вызывает проблему.
  3. По какой-либо причине вы не используете библиотеку javascript, такую как jQuery, для этого? Многое упрощает.

Одним из методов отладки было бы изменить эту строку на:

 link.onclick = function(){alert('test'); someFunction(myObject.id);};
  

Появляется ли предупреждение? Я предполагаю, что нет, предлагая # 1 и # 2 выше. Не стесняйтесь размещать больше кода, и мы сможем поискать ошибку в другом месте.

Комментарии:

1. Появляется предупреждение. Я думаю, как я упоминал ранее, проблема в моей вызываемой функции. В данный момент я не использую jQuery, поскольку я новичок в javascript и хочу сначала понять основы gthe.

2. В вашем комментарии к основному сообщению вы заявили, что замена предупреждения работает нормально. Поскольку это фактически то же самое, что я делаю здесь, это стало довольно запутанным 🙂 Не могли бы вы опубликовать весь свой код или, по крайней мере, больший фрагмент?

3. Я думаю, что теперь я разбираюсь с этим, я загрузил множество оповещений, чтобы я знал, что вызывается с какими параметрами. Я думаю, что мое первоначальное предположение о том, что функция вызывалась в этой части скрипта, было неверным, моя функция просто делала что-то неожиданное, из-за чего казалось, что это так. Сейчас у меня другая проблема (которая, вероятно, не помогла !!) что в основном в мою функцию передаются неправильные параметры. Я видел это в другом месте на SO, где функции передается значение последнего элемента в массиве, который выполняется итерация.

4. Я знал это! 🙂 Для облегчения отладки вы также можете изучить Firebug и его возможности ведения журнала в консоли. Намного проще, чем оповещения.

5. Я нахожу, что окно консоли javascript в Chrome тоже довольно хорошее, но я изучу firebug, приветствую. Есть идеи о том, почему моей функции передается последний элемент в моем массиве?