简体   繁体   English

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

[英]Javascript attach an onclick event to all links

I want to attach a function on every link on the site to change a parameter.我想在网站上的每个链接上附加一个函数来更改参数。

How can I do this without jQuery?如果没有 jQuery,我怎么能做到这一点?

How do I traverse every link (it might be a DOM item) and call a function on them?我如何遍历每个链接(它可能是一个 DOM 项)并在它们上调用一个函数?

It's weird that nobody offered an alternative solution that uses event bubbling奇怪的是没有人提供使用事件冒泡的替代解决方案

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);

The pros of this solution is that when you dynamically add another anchor, you don't need to specifically bind an event to it, so all links will always fire this, even if they were added after these lines were executed.这个解决方案的优点是,当你动态添加另一个锚点时,你不需要专门绑定一个事件到它,所以所有的链接总是会触发这个,即使它们是在这些行被执行之后添加的。 This is in contrast to all the other solutions posted so far.这与迄今为止发布的所有其他解决方案形成对比。 This solution is also more optimal when you have a large number of links on your page.当您的页面上有大量链接时,此解决方案也更为理想。

getElementsByTagName is supported by all modern browsers and all the way back to IE 6所有现代浏览器都支持getElementsByTagName并且一直回到 IE 6

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

I wanted to offer an improvement on @zatatatata's answer which also works with links with nested elements.我想对@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);

If the clicked element isn't a link, we search its parents to check for a link element.如果被点击的元素不是链接,我们会搜索它的父元素来检查链接元素。

function linkClickHandler(a) {
  console.log(a.host);
}

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) links[i].onclick = function() {
    linkClickHandler(links[i]);
}

better way:更好的方法:

const item = document.querySelectorAll(".nav__item");

item.forEach(link => {
  link.addEventListener("click", function () {
    link.classList.add("nav__item--active");
  });
});

Something like this should be useful for you:像这样的东西应该对你有用:

var elements = document.getElementsByTagName("a"),
    i,
    len,
    el;

for (i = 0, len = elements.length; i < len; i++) {
    el = elements[i];

    // Do what you need on the element 'el'
}

尝试使用getElementsByTagName('a')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM