2016-07-06 23 views
5

Ich habe eine Element, und ich kann nicht herausfinden, wie man die HTMLElement daraus bekommen.Get HTMLElement von Element

Zum Beispiel:

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

ich sie dann etwa so:

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

bearbeiten

enter image description here

Hier ist der Code:

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

müssen Sie eine Art Assertion https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html – basarat

Antwort

10

Sie müssen es einfach nur werfen:

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'; 
} 

Sie können sogar zu einem spezielleren Element gegossen:

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

Die Sache ist die, dass document.querySelectorAll kehrt das allgemeinste Elementtyp, Aber wenn Sie selbst wissen, was der spezifische Typ ist, dann können Sie ihn umsetzen, weil Sie "besser wissen" als der Compiler.

+2

Kann es auch beim Ausführen der Abfrage bestätigen: 'Lassen Sie Nodes = document.querySelectorAll ('a') als NodeListOf ;' oder zumindest bei der Zuweisung: 'let node = nodes [i] als HTMLAnchorElement;' –

+0

Ja, ich vermute, dass es bequemer wäre –

2

Sie sind nah dran!

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

Ich glaube nicht, dass das korrekt ist, da ich nicht auf Stil zugreifen kann 'Mein Redakteur sagt, dass es immer noch ein' Element' ist –

+0

Ja, du kannst. Mit z.B. 'nodes [i] .style.backgroundColor = "red"; ' –

+0

Es gibt einen kleinen Tippfehler (irrelevanter Punkt), aber der Code sollte funktionieren:' var node = nodes [i]; 'Du wirst wahrscheinlich etwas mit dem tun wollen Element, zusätzlich zum Laden in eine Variable. – Cam

0

Die Art und Weise, die funktioniert, ist das Element auf eine HTMLElement zu werfen.

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

Sie sind auf das Problem gestoßen: Das Typcasting zu einem generischen Element über Typoskript entfernt die Möglichkeit, auf die Attribute von HTMLElement zuzugreifen. Es ist erwähnenswert, dass in @ Eriks "ES5" -Beispiel jeder Knoten implizit ein 'HTMLElement' ohne Typumwandlung ist. – Cam

+0

@Cam "entfernt die Fähigkeit, auf HTMLElement-Attribute zuzugreifen"? Warum sollte es das tun? –

+0

@Nitzan Ein Rückzug ist in Ordnung. Was ich hätte sagen sollen: Ohne explizites Typecasting fehlte dem Compiler offenbar genügend Information, wie auf die HTMLElement-Attribute zugegriffen werden kann. Entweder wird jeder Knoten nach 'HTMLElement' (wie Sie es getan haben) oder nach ES5 transpiliert, um das Problem zu lösen. – Cam