2016-07-06 10 views
5

Ho un Element e non riesco a capire come ottenere il HTMLElement da esso.Ottieni HTMLElement dall'elemento

Ad esempio:

<a href="">A link</a> 
<a href="">Another link</a> 

Allora ottengo loro in questo modo:

var nodes: NodeListOf<Element> = document.querySelectorAll('a'); // Returns a NodeList of Elements 
for (let i = 0; i < nodes.length; i++) { 
    var node = nodes.item(i); 
    // How can I get the HTMLElement here? 
} 

Modifica

enter image description here

Ecco il codice:

let nodes: NodeListOf<Element> = document.querySelectorAll('a'); 
for (let i = 0; nodes[i]; i++) { 
    let node = nodes[i]; 
    var c = nodes[i].style.backgroundColor = 'red'; 
} 
+0

è necessario utilizzare un tipo assertion https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html – basarat

risposta

10

Hai solo bisogno di cast:

let nodes = document.querySelectorAll('a'); 
for (let i = 0; nodes[i]; i++) { 
    let node = nodes[i]; 
    var c = (nodes[i] as HTMLElement).style.backgroundColor = 'red'; 
} 

Si può anche lanciare ad un elemento più specifico:

(nodes[i] as HTMLAnchorElement).style.backgroundColor = 'red'; 

Il fatto è che document.querySelectorAll restituisce il tipo elemento più generica, ma se conosci te stesso qual è il tipo specifico, puoi lanciare, perché "conosci meglio" del compilatore.

+2

Può anche affermarlo quando si esegue la query: 'let nodes = document.querySelectorAll ('a') come NodeListOf ;' o almeno quando si esegue l'assegnazione: 'let node = nodes [i] come HTMLAnchorElement;' –

+0

Sì, ho il sospetto che sarebbe più conveniente –

2

Sei vicino!

var nodes = document.querySelectorAll('a'); // Returns a NodeList of Elements 
for (let i = 0; nodes[i]; i++) { 
    // node is your element! 
    var node = nodes[i]; 
    node.style.backgroundColor = "blue"; 
} 
+1

Non penso che sia corretto, in quanto non riesco ad accedere a 'stile 'Il mio editor dice che è ancora un' Element' –

+0

Sì, è possibile. Ad es. 'nodes [i] .style.backgroundColor = "red"; ' –

+0

C'è un errore di battitura (punto estraneo) ma il codice dovrebbe funzionare:' var node = nodes [i]; 'Probabilmente vorrai fare qualcosa con il elemento, oltre a caricarlo in una variabile. – Cam

0

Il modo in cui funziona consiste nel trasmettere l'elemento a HTMLElement.

let nodes: NodeListOf<HTMLElement> = document.querySelectorAll('a') as NodeListOf<HTMLElement>; 
+0

Ti sei imbattuto nel problema: il typecasting in un 'Element' generico tramite typescript rimuove la possibilità di accedere agli attributi di' HTMLElement'. Vale la pena ricordare che nell'esempio 'ES5' di @ Erik, ogni nodo è implicitamente un' HTMLElement' senza typecasting. – Cam

+0

@Cam "Rimuove la capacità di accedere agli attributi HTMLElement"? Perché dovrebbe farlo? –

+0

@Nitzan Una ritrattazione è in ordine. Cosa avrei dovuto dire: senza esplicitamente typecasting, il compilatore non aveva evidentemente informazioni sufficienti su come accedere agli attributi HTMLElement. O castare ciascun nodo su 'HTMLElement' (come hai fatto) o eseguire il transpiling su ES5 dovrebbe risolvere il problema. – Cam

Problemi correlati