Мне нужна помощь с этим кодом JavaScript. по какой-то причине переменная "index" всегда оказывается последним индексом массива независимо от того, какую ссылку я нажимаю.
var linkElements = document.getElementsByTagName('a');
var index;
var origOnClickArr = [];
for (index = 0; index < linkElements.length; ++index) {
origOnClickArr.push(linkElements[index].onclick);
linkElements[index].onclick = function (e) {
if (confirm(message)) {
origOnClickArr[index]();
}
};
}
Попробуйте что-то вроде этого
var linkElements = document.getElementsByTagName('a');
var index;
var origOnClickArr = [];
for (index = 0; index < linkElements.length; ++index) {
(function (index) {
origOnClickArr.push(linkElements[index].onclick);
linkElements[index].onclick = function (e) {
if (confirm(message)) {
origOnClickArr[index]();
}
};
})(index)
}
оберните код внутри цикла for внутри самозапускающей анонимной функции и передайте значение индекса для каждого цикла.
Вы можете добавить в список прослушивателей событий с помощью addEventListener или удалить прослушиватель событий. В идеале вы должны создавать функции и использовать javascript для назначения всей функции, которую вы хотите вызвать +, функции-обертки, которая делает подтверждение вместо встроенного назначения событию onclick. (http://www.quirksmode.org/js/events_advanced.html).
Один из способов добиться того, что вы делаете, - использовать методы захвата/пузырьков событий.
Захват события происходит от родительского элемента к потомку, за которым следует событие, возбуждающееся от дочернего элемента к родительскому.
Вы можете назначить обработчик события захвата для подтверждения. Если пользователь подтверждает, пусть событие продолжает распространяться. Если нет, прекратите распространение.
Неподтвержденный, но может работать:
var message = 'Confirm';
function doConfirm()
{
if (!confirm(message))
{
if (window.event)
{
if (window.event.stopPropagation) // w3c compliant browsers
{
event.stopPropagation();
}
else // Old IE browsers (ie 8 or ie 9 if i remember correctly)
{
event.cancelBubble = true;
}
}
}
}
var arr = document.getElementsByTagName("a");
for (var i = arr.length-; i >= 0; i--)
{
arr[i].addEventListener("click", doConfirm, true); // true indicates capture phase.
}
closures
. Это не простая концепция, чтобы разобраться, но она объясняет, в чем проблема. Есть уже много вопросов по SO на эту тему