图片链接的addEventListener失效问题求助
问题:包含子元素的链接点击时无法正确获取href
我用以下代码捕获页面上所有链接的点击事件,把href存入cookie,普通文本链接正常,但点击包含图标(比如<i>标签)的链接时,event.target.href会变成undefined,导致cookie设置失败。
原JavaScript代码
//Get all anchor tags on the page var links = document.getElementsByTagName('a'); //Loop through all the links and attach an event listener to each for (var i = 0; i < links.length; i++) { links[i].addEventListener('click', function(event) { var date = new Date(); var expiry='; expires='+date.setTime(date.getTime() + (30 * 1000)); document.cookie='click_link='+event.target.href+expiry+'; path=/'; }); }
问题示例HTML
<a class="elementor-icon elementor-animation-pulse-shrink" href="https://example.org/path/page/"> <i aria-hidden="true" class="fas fa-map-marked-alt"></i> Some text </a>
解决方案
问题核心是event.target的指向:当点击<a>标签内的子元素(比如示例里的<i>图标)时,event.target会指向那个子元素,而子元素本身没有href属性,所以event.target.href自然是undefined。
你需要改用this或者event.currentTarget,这两个属性永远指向绑定事件监听的<a>元素,不管点击的是它的哪个子节点:
修改后的JavaScript代码(方案一:用this.href)
//Get all anchor tags on the page var links = document.getElementsByTagName('a'); //Loop through all the links and attach an event listener to each for (var i = 0; i < links.length; i++) { links[i].addEventListener('click', function(event) { var date = new Date(); var expiry='; expires='+date.setTime(date.getTime() + (30 * 1000)); // 改用this.href获取绑定事件的a标签的href document.cookie='click_link='+this.href+expiry+'; path=/'; }); }
修改后的JavaScript代码(方案二:用event.currentTarget.href)
//Get all anchor tags on the page var links = document.getElementsByTagName('a'); //Loop through all the links and attach an event listener to each for (var i = 0; i < links.length; i++) { links[i].addEventListener('click', function(event) { var date = new Date(); var expiry='; expires='+date.setTime(date.getTime() + (30 * 1000)); // 用event.currentTarget.href获取绑定事件的a标签的href document.cookie='click_link='+event.currentTarget.href+expiry+'; path=/'; }); }
内容的提问来源于stack exchange,提问作者Frank Petersen
相关产品推荐
相关产品推荐

