2012-01-19 23 views
6

Potrzebuję napisać kod, który umieszcza wszystkie linki href ze strony internetowej w tablicy. Oto co mam do tej pory:Pobierz wszystkie linki href w DOM

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

Jednak to nie działa na stronie, takich jak skrzynki odbiorczej Gmaila, ponieważ niektóre linki są w iframe. Jak mogę uzyskać ALL z linków, w tym te w elemencie iframe?

Jest to również rozszerzenie Google Chrome. W manifeście ustawiłem all_frames na true - czy to robi różnicę?

Dzięki

+1

Co z 'document.getElementsByTagName (" a ")'? –

+2

Zwiększyć współczynnik accdeptance .......... nie zapomnij zaznaczyć odpowiedzi jako accpeted, jeśli to działa dla Ciebie ........ –

+1

'document.links' otrzymuje wszystkie odnośniki. Oprócz linków bez wartości 'href', ale nie potrzebujesz tych, ponieważ chcesz uzyskać wartości href. To, czego nie robi, to uzyskiwać linki w ramkach iframes lub ramkach. – Raynos

Odpowiedz

5

Mam metoda używam dostępu do danych w iframe. Jak zabawne, że odpowiedź nigdy nie jest zapisana do przeczytania i użycia: P. Zapraszam do modyfikowania i nadużyciom:

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

I następnie używać go szukać cokolwiek elementu Im po:

foreach (HtmlElement el in GetElements("input")) 
     { 
      if (el.GetAttribute("id").Equals("hasNoGoogleAccount")) 
      { 
       el.InvokeMember("click"); 
      } 
     } 

Zawsze możesz zmienić metodę pętli i uzyskać wszystkie iFrames itp bla bla ale to powinno wystarczyć, abyś się ruszał. Oceń mnie! Im nowe

7

pewno dostaniesz „arr nie jest zdefiniowana” z kodem na początek?

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

Spróbuj:

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

Och, tak, właśnie to miałem - literówka. Muszę jednak uzyskać linki wewnątrz iframe. Jak mogę to zrobić? – user1137778

6

Jedną rzeczą, aby pamiętać, że

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

są żywe zapytań do obiektów DOM, zatem w forLoops może znacząco spowolnić wykonanie (jak < links.length jest dla zapytań na każdy cykl), sprawdzając długość tablicy takiego:

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

zamiast lepiej to zrobić:

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

Dzięki. Nauczyłem się czegoś. Nie myśl, że to dotyczy tego pytania, ale na pewno mi pomaga. :) – motorbaby

0

z kodu bookmarkletu moi Web Adjuster „s,

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) } 

Możesz przekazać dowolną funkcję do all_frames_docs i będzie ona wywoływana po kolei na każdej ramce i elemencie iframe w bieżącym oknie, pod warunkiem, że twój skrypt ma do nich dostęp (tj. to rozszerzenie lub bookmarklet).Więc wszystko, co musisz teraz zrobić, to zakodować funkcję obsługi każdego dokumentu, który może przejść przez document.getElementsByTagName("a") lub cokolwiek innego, i uczynić tę funkcję parametrem twojego połączenia z all_frames_docs.

Powiązane problemy