【问题标题】:trying to get the href attribute of <a> tag onclick - no errors?试图获取 <a> 标签 onclick 的 href 属性 - 没有错误?
【发布时间】:2017-02-22 10:58:09
【问题描述】:

尝试简单地识别是否有任何标签在任何时候被点击,并获取点击标签的 href 属性以存储在数据库中。

为了测试我试图打印出 href 但屏幕上没有打印任何内容并且控制台中没有错误?有什么想法吗?

// Anchor Tags - Capture the href of the link clicked
var aTags = document.getElementsByTagName('a');

for (var i = aTags.length - 1; i >= 0; --i) {
    aTags[i].onclick = function() {
    var aTagHref = aTags[i].getAttribute("href");
        alert(aTagHref);
    };
}

【问题讨论】:

  • 使用 'this' 或 event.target。您尝试执行此操作的方式不起作用,因为您没有通过闭包缓存i。因此,当循环结束时,i 将是 aTags.length + 1,因此所有点击都将尝试在 aTags 中找到一个不存在的元素。始终尝试在事件处理程序中使用 event.target,因为它会告诉您事件来自哪个元素,而无需将其缓存在数组中。

标签: javascript dom event-handling getelementsbytagname getattribute


【解决方案1】:

在事件侦听器中,您不会拥有该元素数组,而且您可以使用this 来引用点击的a

像这样:

var aTags = document.getElementsByTagName('a');

for (var i = aTags.length - 1; i >= 0; --i) {
    aTags[i].onclick = function() {
    var aTagHref = this.getAttribute("href");
        alert(aTagHref);
    };
}
<a href="#asd">a</a>
<br />
<a href="#asdf">b</a>
<br />
<a href="#asdfg">c</a>

【讨论】:

  • 有效!快速提问,for 循环背后的逻辑是什么 var i = aTags.length - 1; ?我们不是通过从长度中减去 1 来跳过初始索引,即不是像 i= 4,3,2,1 那样迭代,而是像这样进行交互:3,2,1...正确吗?
  • @Shaz,在这种情况下,for life cicle 是 -> create var i = 3 - 1;检查条件;做逻辑;递减;检查条件....所以,i 的值类似于 2、1 和 0
  • 这就是我的观点。它不执行“3”的逻辑。开始。如果 var i 中有 3 个链接,它不只是在 2,1 0 和 NOT 3nth 上做逻辑吗?
  • @Shaz 如果它从 3 开始,你会得到一个索引超出范围错误,数组的索引从 0 开始,所以......位置 0 -> 一个链接;位置 1 -> b 链接;位置 2 -> c 链接; w3schools.com/js/tryit.asp?filename=tryjs_array_element
  • 现在说得通了。我没有将长度属性视为数组(愚蠢)或变量。我的错。感谢您的解释!
猜你喜欢
  • 2013-01-18
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2010-10-27
  • 2017-06-04
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多