获取DOM中的所有href链接

时间:2012-01-19 08:16:51

标签: javascript google-chrome-extension

我需要编写将所有href链接从网页放入数组的代码。这是我到目前为止所做的:

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

但是,这不适用于Gmail的收件箱这样的网页,因为部分链接位于iframe中。如何获取所有链接,包括iframe中的链接?

此外,这是针对Google Chrome扩展程序的。在清单中,我将all_frames设置为true - 这是否会产生影响?

由于

4 个答案:

答案 0 :(得分:12)

要记住的一件事

  1. document.links
  2. document.images
  3. document.forms
  4. document.forms [0] .elements
  5. document.getElementsByName()
  6. document.getElementsByClassName()
  7. document.getElementsByTagName()
  8. 是对DOM对象的实时查询,因此在forLoops中它可能会显着减慢执行速度(因为i&lt; 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);
    }
    

答案 1 :(得分: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);
}

答案 2 :(得分:6)

我有一个用于访问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");
            }
        }

您可以随时更改方法以循环并获取所有iFrame等等等等,但这应该足以让您感动。 给我评分!我是新的

答案 3 :(得分: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调用的参数。