2012-01-19 18 views
6

Ho bisogno di scrivere codice che mette tutti i link href da una pagina web in un array. Ecco quello che ho finora:Ottieni tutti i link href in DOM

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

Tuttavia, questo non funziona in una pagina come casella di posta di Gmail, in quanto il alcuni dei collegamenti sono all'interno di un iframe. Come posso ottenere ALL dei collegamenti, compresi quelli all'interno dell'iframe?

Inoltre, questo è per un'estensione di Google Chrome. Nel manifest, ho impostato all_frames su true - questo fa la differenza?

Grazie

+1

Che dire di 'document.getElementsByTagName ('a')'? –

+2

Aumenta la tua velocità di accettazione .......... non dimenticare di segna la risposta come accetto se funziona per te ........ –

+1

'document.links' ottiene tutti i link. Oltre ai collegamenti senza un valore 'href', ma non ne hai bisogno perché vuoi valori href. Quello che non fa è ottenere link in iframe o frame – Raynos

risposta

5

Ho un metodo che uso per accedere ai dati in un iframe. Com'è divertente che la risposta non sia mai scritta per leggere e usare: P. Sentitevi liberi di modificare e abuso:

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

poi lo uso per cercare qualsiasi elemento Im dopo:

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

Si può sempre modificare il metodo per scorrere e ottenere tutti gli iFrame ecc bla bla ma questo dovrebbe essere sufficiente per farti muovere. Vota me! Im nuovo

7

Sicuramente si sta andando ad ottenere 'arr non è definita' con il codice per cominciare?

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

Prova:

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

Oh, sì è quello che ho avuto - errore di battitura. Ho bisogno di ottenere i collegamenti all'interno degli iframe però. Come lo posso fare? – user1137778

6

Una cosa da ricordare che

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

sono query in tempo reale per gli oggetti DOM, quindi in forLoops può rallentare in modo significativo il vostro esecuzione (come ho < links.length è query su ciascuno per ciclo), se si controlla la lunghezza della matrice in questo modo:

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

invece è meglio fare questo:

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

Grazie. Ho imparato qualcosa. Non pensare che si applica a questa domanda, ma sicuramente mi aiuta. :) – motorbaby

0

dal codice bookmarklet 's mie Web Adjuster,

È possibile passare qualsiasi funzione in all_frames_docs e verrà chiamata a turno su ogni frame e iframe nella finestra corrente, a condizione che lo script abbia accesso a tale (es. è un'estensione o un bookmarklet).Quindi tutto ciò che devi fare ora è codificare la funzione per gestire ciascun documento, che può passare attraverso document.getElementsByTagName("a") o qualsiasi altra cosa, e rendere questa funzione il parametro della tua chiamata a all_frames_docs.