document.getElementsByTagName(“a”)错过了一个链接

时间:2011-11-02 07:54:19

标签: javascript greasemonkey

我正在为Greasemonkey(FX7)编写一个脚本,尝试删除某些链接,并发现由于某种原因,源中存在的一个,不是由JS隐藏或构造的,没有出现在数组中该函数返回。

如果在运行该页面时通过JS构建了那个,它就不会让我感到惊讶,但它正好位于另一个找到的链接后面。

所以有人知道为什么会这样,以及我如何解决它?

var links = document.getElementsByTagName("a");
for (var l in links){
  if (links[l].href == "blah"){ ... }
}

多数民众赞成我是如何尝试与他们合作的,有点减少,因为我有更多的检查没有遇到空等等。

在旁注:我想知道为什么该函数也会返回空条目。

编辑:我很久以来就通过了这个问题我找到了帮助并找到了一个很好的方法:

for (var i = 0, l; l = links[i]; i++) { }

这会将l设置为当前链接,直到没有任何剩余。效果很好。

4 个答案:

答案 0 :(得分:7)

for ... in语句循环遍历对象的属性。在这种特殊情况下,您将迭代Array对象属性。请尝试使用此脚本:

var links = document.getElementsByTagName("a");
for (var l = 0; l < links.length; l++){
  if (links[l].href == "blah"){ ... }
}

答案 1 :(得分:0)

for … in语句循环遍历对象的属性,而不仅仅是它的值,就像@Yuriy所说的那样。你需要学习一些Javascript才能理解这一点(抱歉,在谷歌搜索几分钟后找不到任何指向这部分的直接指针)。

基本上,您需要了解JS中的对象还包括“方法”。当您使用for … in循环时,您会找到对象的值以及它的“方法”和其他属性。

所以,要么使用@ Yuriy的索引循环...或者更好,请使用hasOwnProperty()方法(MDN doc),这样可以避免提到的非常重要的警告@Kolink。

你的循环应该如下:

var links = document.getElementsByTagName('a');
for (var l in links) {
    if (! links.hasOwnProperty(l))
        continue; // this goes straight to the next property

    if (links[l].href == "blah") { ... }
}

答案 2 :(得分:0)

{
  "nyc": {
    "extension": [
      ".mjs"
    ]
  }
}

答案 3 :(得分:0)

getElementsByTagName(“ area”)[0]返回其href属性的值,而不是HTMLAnchorElement