2011-12-13 52 views

回答

18

getElementsByTagName是所有现代浏览器,并回到IE 6

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

@马尔西奥完全取决于具体的使用情况,可能不是最优化的解决方案。 – zatatatata

-1

一路支持的请尝试使用getElementsByTagName('a')

1

像这样的东西应该对您有用:

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' 
} 
3
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]); 
} 
59

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

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

该方案的优点是,当你动态添加另一个锚,你并不需要一个事件特异性结合,所以所有的链接会一直触发此,即使他们这些行后添加被执行。这与迄今为止公布的所有其他解决方案形成对比。当您的网页上有大量链接时,此解决方案也更为优化。

+0

最近有人添加另一个答案,将添加事件侦听器的负载,但不会做的添加到DOM代码执行后锚任何事情。这样一个简单的原则,但很多人似乎完全没有意识到。 – HMR

+1

我也认为这个解决方案更好,因为它只增加一个事件,而不增加数十个事件。这个解决方案也更好,因为如果你动态添加更多的链接,它也可以为他们工作! – Ignas2526

+0

当有人倾向于深思熟虑时,这真是太棒了! – hex494D49

1

更好的办法:

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

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