Получить все ссылки HREF в DOM - PullRequest
9 голосов
/ 19 января 2012

Мне нужно написать код, который помещает все ссылки href с веб-страницы в массив. Вот что у меня есть:

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

Однако это не работает на странице, такой как входящие Gmail, потому что некоторые ссылки находятся внутри iframe. Как я могу получить ALL ссылок, включая ссылки внутри iframe?

Кроме того, это для расширения Google Chrome. В манифесте для all_frames установлено значение true - это имеет значение?

Спасибо

Ответы [ 4 ]

13 голосов
/ 31 марта 2015

Следует помнить, что

  1. document.links
  2. document.images
  3. document.forms
  4. document.forms [0]*поэтому в forLoops это может значительно замедлить ваше выполнение (так как i
    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);
    }
    
8 голосов
/ 19 января 2012

Наверняка вы получите «arr is not определен» с вашим кодом для начала?

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);
}
6 голосов
/ 04 мая 2012

У меня есть метод, который я использую для доступа к данным в 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");
            }
        }

Вы всегда можете изменить метод для циклического прохождения и получить все фреймы и т. Д., Бла-бла, но этого должно быть достаточно, чтобы вы двигались. Оцени меня! Я новенький

0 голосов
/ 03 июля 2017

Из моего кода веб-регулятора ,

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, и она будет вызываться по очереди для каждого кадра и фрейма в текущем окне, при условии, что ваш скрипт имеет к ним доступ (т.е. это расширение или букмарклет). Поэтому все, что вам нужно сделать сейчас, - это кодировать функцию для обработки каждого документа, которая может проходить через document.getElementsByTagName("a") или что-то еще, и делать эту функцию параметром вашего вызова all_frames_docs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...