Javascript将onclick事件附加到所有链接

Joh*_*ith 13 javascript events

我想在网站的每个链接上附加一个函数来更改参数.

如果没有jQuery,我怎么能这样做?

如何遍历每个链接(可能是一个DOM项)并调用它们上的函数?

zat*_*ata 71

奇怪的是,没有人提供使用事件冒泡的替代解决方案

function callback(e) {
    var e = window.e || e;

    if (e.target.tagName !== 'A')
        return;

    // Do something
}

if (document.addEventListener)
    document.addEventListener('click', callback, false);
else
    document.attachEvent('onclick', callback);
Run Code Online (Sandbox Code Playgroud)

此解决方案的优点是,当您动态添加另一个锚点时,您不需要专门将事件绑定到它,因此所有链接将始终触发它,即使它们是在执行这些行之后添加的.这与迄今为止发布的所有其他解决方案形成对比.当您的页面上有大量链接时,此解决方案也更加优化.

  • 仅在您的A标签中没有嵌套元素时才有效 (8认同)
  • 我也认为这个解决方案更好,因为它只添加一个事件,而不是可能添加数十个事件。此解决方案也更好,因为如果您动态添加更多链接,它也适用于它们! (3认同)
  • 最近有人添加了另一个答案,它将添加事件侦听器的负载,但不会对代码执行后添加到 dom 的锚点执行任何操作。这么简单的道理,却有很多人似乎完全不知道。 (2认同)
  • 当有人倾向于深入思考时,这很棒! (2认同)
  • 这并不奇怪,例如 Youtube 网站有很多带有嵌套元素的 A 标签,这种方法不起作用 (2认同)

Joe*_*Joe 23

所有现代浏览器都支持getElementsByTagName,并且一直支持IE 6

var elements = document.getElementsByTagName('a');
for(var i = 0, len = elements.length; i < len; i++) {
    elements[i].onclick = function () {
        // stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Márcio完全取决于具体的用例,可能不是最优的解决方案. (5认同)

jaz*_*mit 6

我想对@zatatatata 的答案进行改进,该答案也适用于带有嵌套元素的链接。

function findLink(el) {
    if (el.tagName == 'A' && el.href) {
        return el.href;
    } else if (el.parentElement) {
        return findLink(el.parentElement);
    } else {
        return null;
    }
};

function callback(e) {
    const link = findLink(e.target);
    if (link == null) { return; }
    e.preventDefault();
    // Do something here
};

document.addEventListener('click', callback, false);
Run Code Online (Sandbox Code Playgroud)

如果被点击的元素不是链接,我们会搜索它的父元素来检查链接元素。