获取DOM中的所有href链接

19

我需要编写代码将网页中所有的href链接放入数组中。以下是我目前的代码:

var array = [];
var links = document.links;
for(var i=0; i<links.length; i++) {
  array.push(links[i].href);
}

然而,这在像Gmail收件箱这样的页面上不起作用,因为一些链接在iframe内部。如何获取所有链接,包括iframe内部的链接?

另外,这是为了谷歌浏览器扩展而设的。在清单中,我将all_frames设置为true - 这会有所影响吗?

谢谢


1
document.getElementsByTagName('a') 是什么意思? - ldiqual
2
提高你的接受率……如果它对你有用,别忘了将答案标记为已接受…… - Pranay Rana
1
document.links 可以获取所有链接。除了没有 href 值的链接,但是你不需要这些,因为你想要 href 值。它无法获取 iframe 或 frame 中的链接。 - Raynos
1
我如何获取iframes内部的链接? - user1137778
4个回答

28

记住一件事,

  1. document.links
  2. document.images
  3. document.forms
  4. document.forms[0].elements
  5. document.getElementsByName()
  6. document.getElementsByClassName()
  7. document.getElementsByTagName()

这些都是对DOM对象的实时查询,因此在for循环中使用它们会显著降低您的执行速度(例如i < links.length将在每个循环中进行查询),如果您像这样检查数组长度:

var array = [];
var links = document.getElementsByTagName("a");
for(var i=0; i<links.length; i++) {
    array.push(links[i].href);
}

相反,你最好这样做:

var array = [];
var links = document.getElementsByTagName("a");
for(var i=0, max=links.length; i<max; i++) {
    array.push(links[i].href);
}

4
谢谢,我学到了一些东西。虽然我不认为它与这个问题有关,但肯定对我有帮助。 :) - motorbaby

8
当然,你的代码一开始就会出现“arr未定义”的错误提示吧?
var array = [];
var links = document.links;
for(var i=0; i<links.length; i++) {
    arr.push(links[i].href);
}

尝试:

var array = [];
var links = document.getElementsByTagName("a");
for(var i=0; i<links.length; i++) {
    array.push(links[i].href);
}

1
哦,是的,那就是我的问题-打错字了。不过我需要获取iframe内部的链接。我该怎么做? - user1137778
getElementsByTagName 不会返回所有标签。例如,在“lifehacker.ru”上。 - Gargo

7

我有一种方法可以访问IFrame中的数据。很有趣的是,答案从来没有被写下来供阅读和使用 :P。随意修改并滥用:

public HtmlElementCollection GetIFrameElements(String tmpTag, int Frame)
    {
        HtmlElementCollection tmpCollection = mWebBrowser.Document.Window.Frames[Frame].Document.Body.GetElementsByTagName(tmpTag);
        return tmpCollection;
    }

我随后使用它来寻找我需要的任何元素:
foreach (HtmlElement el in GetElements("input"))
        {
            if (el.GetAttribute("id").Equals("hasNoGoogleAccount"))
            {
                el.InvokeMember("click");
            }
        }

您可以随时更改循环遍历并获取所有iFrames等内容,但这应该足以使您启动。 请评价我!我是新手


0

从我的Web Adjuster的书签代码中,

function all_frames_docs(c) {
    var f=function(w) {
        if(w.frames && w.frames.length) {
            var i; for(i=0; i<w.frames.length; i++) f(w.frames[i])
        } c(w.document) };
    f(window) }

您可以将任何函数传递到all_frames_docs中,它将依次在当前窗口的每个框架和iframe上调用,前提是您的脚本可以访问这些内容(即它是一个扩展程序或书签)。因此,现在您所要做的就是编写处理每个文档的函数,该函数可以通过document.getElementsByTagName("a")或其他方式进行操作,并将此函数作为参数传递给all_frames_docs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接