2016-09-02 5 views
0

Ich versuche, einige Symbole mit JavaScript in ein Div einzufügen.
Es sollte so aussehen: x ∈ ℝ, aber alles was ich bekomme ist: x ∈ ℝ.JavaScript: Ausgabesymbole und Sonderzeichen

var div=document.getElementById("text"); 
 
var textnode = document.createTextNode("x ∈ ℝ"); \t \t \t \t \t 
 
div.appendChild(textnode);
<div id="text"></div>

Ich hatte document.getElementById("something").innerHTML="x &#8712; &reals;" versucht, und es hat funktioniert, so dass ich habe keine Ahnung, warum createTextNode Methode nicht.

Was soll ich tun, um das Richtige auszugeben?

+0

Textknoten = enthält diesen * Text *. Inneres HTML = enthält dieses * HTML *. Ein Fall wird explizit als HTML ausgewertet, der andere nicht. – deceze

Antwort

2

Sie fügen HTML-Escapes ("Entities") in den Text ein, der benötigt wird. Nach der Dokumentation für createTextNode:

data ist eine Zeichenfolge, die die Daten enthält

im Textknoten gesetzt werden

Das ist es. Es sind die Daten, die in den Textknoten eingegeben werden sollen. Die DOM spec ist genauso klar:

Erstellt einen Text-Knoten mit der angegebenen Zeichenfolge.

Sie möchten Unicode in diese Zeichenfolge einschließen. Um Unicode in eine JavaScript-Zeichenfolge aufzunehmen, verwenden Sie Unicode escapes im Format \uXXXX.

var textnode = document.createTextNode("x \u2208 \u211D"); 

Oder Sie könnten einfach schließen die tatsächlichen Unicode-Zeichen und vermeiden alle Mühe:

var textnode = document.createTextNode("x ∈ ℝ"); 

In diesem Fall nur sicherstellen, dass die JS-Datei als UTF-8 serviert wird, sind Sie Speichern der Datei als UTF-8 usw.

Der Grund dafür, dass die Einstellung .innerHTML mit HTML-Entities funktioniert, ist, dass der Inhalt als HTML gesetzt wird, dh er interpretiert ihn als HTML, einschließlich Markup, spezielle Entities, etc Es kann leichter sein, dies zu verstehen, wenn man bedenkt die Differenz zwischen dem folgenden:

document.createTextNode("<div>foo</div>"); 
document.createElement("div").textContent = "<div>foo</div"; 
document.createElement("div").innerHTML = "<div>foo</div>"; 

Die ersten erstellt eine Textknoten mit dem Literalen"<div>foo</div>". Die zweite setzt den Inhalt des neuen Elements wörtlich auf "<div>foo</div>". Die dritte erzeugt andererseits ein tatsächliches div Element innerhalb des neuen Elements, das den Text "foo" enthält.

2

document.createTextNode wird automatisch die benötigten Zeichen html-escape.Sie haben diese Texte als JavaScript-Strings zur Verfügung zu stellen, entweder entkommen oder nicht:

document.body.appendChild(document.createTextNode("x ∈ ℝ")); 
 
document.body.appendChild(document.createElement("br")); 
 
document.body.appendChild(document.createTextNode("x \u2208 \u211d"));

EDIT: Es ist nicht wahr, dass die createTextNode Funktion hier tatsächlich html tun zu entkommen, da es nicht der Fall ist müssen. @deceze hat eine sehr gute Erklärung über die Verbindung zwischen dom und html gegeben: html ist eine textuelle Repräsentation des dom, so dass Sie kein HTML-bezogenes Escaping benötigen, wenn Sie das dom direkt manipulieren.

+1

Ich verstehe nicht, was Sie mit "automatisch html-escape" meinen. Es macht überhaupt nichts; es setzt den Text, den Sie ihm gegeben haben, genau so in den Textknoten. –

+0

Eine Webseite ist kein HTML. Eine Webseite ist eine DOM-Struktur. Nicht alles muss durch HTML- und HTML-Entweichen gehen. HTML ist nur eine textuelle Darstellung der ursprünglichen DOM-Baumstruktur. – deceze

+0

Jungs, das ist der Weg, um Anfängern zu erklären, warum sie hier nicht html-entkommen müssen. Man kann nicht einfach eine 20 Zeilen lange Erklärung geben, wie das dom als Antwort auf eine so einfache Frage funktioniert. (obwohl Sie es geschafft haben, es in zwei Zeilen zu beschreiben, danke dafür) –

1

Jedes Zeichen hat einen hexadezimalen Namen (z. B. 0211D). wenn Sie es in eine HTML-Entität zu transformieren möchten, fügen Sie &#x =>&#x0211D; oder den Namen Einheit &reals; oder das Dezimalsystem Namen &#8477; verwenden, die alle hier gefunden werden kann: http://www.w3schools.com/charsets/ref_html_entities_4.asp

Aber wenn Sie JavaScript verwenden, um das zu machen, Browser verstehen, dass Sie ein Unicode-Symbol und keine Zeichenfolge ausgeben möchten, sind Escape-Entitäten erforderlich. Fügen Sie dazu \u vor dem hexadezimalen Namen =>\u211D; hinzu.

+1

(1) Das Semikolon gehört nicht zum Hexadezimalcode. (2) Ein Unicode-Symbol ** ist ** eine Zeichenkette (oder vielmehr ein Zeichen in einer Zeichenkette). (3) Das '\ uXXXX'-Format wird nicht als" Entity "bezeichnet. (4) Die führende Null wird dies ungültig machen und Ihnen nicht geben, was Sie wollen. Es wird als der Unicode-Codepunkt "0211" gefolgt von dem Zeichen "d" interpretiert. –

Verwandte Themen