我需要有关此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]();
}
};
}
答案 0 :(得分:2)
尝试这样的事情
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循环中的代码包装在自调用匿名函数中,并为每个循环传递index的值。
答案 1 :(得分:0)
您可以使用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.
}