Я искал и искал в google и stackoverflow, и, пожалуйста, перенаправьте меня, если я ошибаюсь, но ничто прямо не адресовало то, что я ищу.
Я составил список из трех элементов, и для каждого из них я хотел бы создать прослушиватель действий (onclick), который вызывает функцию window.open(myURL, '_blank')
и переходит к этому URL-адресу.
function goToURL (at) {
window.open(myURL[at], '_blank');
};
for (var i = 0; i < document.getElementsByTagName("li").length; i++) {
document.getElementsByTagName("li")[i].onclick = goToURL(i);
}
Теперь он не только игнорирует onclick, но и сразу открывает все URL. Я проверил документацию, и он вызывает только имя функции no ()
. Но даже если нет параметров, это не сработает. Поэтому, если я не могу передать параметр, мне не удастся назначить разные URL-адреса. Я понимаю, что для меня может быть еще один метод, но что-то такое же простое, как прохождение параметра, я должен понять это.
http://jsfiddle.net/gymbry/7MG7P/
Заранее спасибо!
Вы должны назначить функцию onclick
. Вы вызываете функцию немедленно и присваиваете ей возвращаемое значение. Если вам не нужно было передавать аргумент функции, вы можете просто сделать:
document.getElementsByTagName("li")[i].onclick = goToURL;
Обратите внимание, что после имени функции нет ()
. Мы не вызываем функцию, мы имеем в виду только функцию.
Если вы хотите передать аргумент, зависящий от переменных цикла, вы должны знать о проблеме "замыкания в цикле".
В конце концов вы можете сделать что-то вроде этого:
document.getElementsByTagName("li")[i].onclick = (function(i) {
return function() {
goToURL(i);
};
}(i));
Поскольку вы отметили вопрос с помощью jQuery, вы можете упростить это:
$('li').each(function(i) {
$(this).data('url', myURL[i]);
}).click(function() {
window.open($(this).data('url'), '_blank');
});