2016-09-02 10 views
0

Я пытаюсь включить некоторые символы в div с помощью JavaScript.
Это должно выглядеть так: x ∈ ℝ, но все, что я получаю, это: x ∈ ℝ.JavaScript: выходные символы и специальные символы

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

Я попытался document.getElementById("something").innerHTML="x &#8712; &reals;", и она работала, поэтому я понятия не имею, почему метод createTextNode не сделал.

Что делать, чтобы вывести правильную вещь?

+0

Текстовый узел = содержит этот * текст *. Внутренний HTML = содержит этот * HTML *. Один случай явно оценивается как HTML, другой - нет. – deceze

ответ

2

Вы включаете HTML-экраны («сущности») в тексте. Согласно документации для createTextNode:

data представляет собой строку, содержащую данные, которые будут ставить в текстовом узле

Вот и все. Это данные помещаются в текстовый узел. DOM spec так же ясно:

Создает текстовый узел с заданной строкой.

Вы хотите включить Unicode в эту строку. Чтобы включить Unicode в строку JavaScript, используйте Unicode escapes, в формате \uXXXX.

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

Или вы просто могли бы включать в себя фактический характер Unicode и избежать всех проблем:

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

В этом случае, просто убедитесь, что файл JS подается в UTF-8, вы сохраняя файл как UTF-8 и т. д.

Причина, по которой настройка .innerHTML работает с объектами HTML, заключается в том, что она устанавливает контент как HTML, что означает, что он интерпретирует его как HTML, во всех отношениях, включая разметку, специальные объекты и т. д. . Это может быть легче понять, если вы считаете разница между следующим:

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

Первым создает текстовый узел с буквенными символами"<div>foo</div>". Второй устанавливает содержание нового элемента буквально до "<div>foo</div>". С другой стороны, третий создает фактический элемент div внутри нового элемента, содержащего текст "foo".

2

document.createTextNode автоматически удалит требуемые символы html.Вы должны предоставить эти тексты в виде строк JavaScript, либо убежали или нет:

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

EDIT: Это не правда, что функция createTextNode будет делать фактический HTML вытекающее здесь, как это не нужно. @deceze дал очень хорошее объяснение о связи между dom и html: html представляет собой текстовое представление dom, поэтому вам не нужно какое-либо html-связанное экранирование при прямом манипулировании dom.

+1

Я не понимаю, что вы подразумеваете под «автоматически html-escape». Он ничего не делает; он просто помещает текст, который вы ему дали, точно так же, как и в текстовый узел. –

+0

Веб-страница не является HTML. Веб-страница представляет собой дерево DOM. Не все должно пройти через HTML и HTML-экранирование. HTML - это только текстовое представление исходной структуры дерева DOM. – deceze

+0

Ребята, это способ заставить новичков понять, почему им не нужно html-escape здесь. Нельзя просто дать 20 строк длинного объяснения, как дом работает как ответ на такой простой вопрос. (хотя вам удалось описать его в двух строках, спасибо за это) –

1

Каждый символ имеет шестнадцатеричное имя (например, 0211D). если вы хотите, чтобы превратить его в HTML-сущности, добавить &#x =>&#x0211D; или использовать имя лица &reals; или десятичную имя &#8477; которое можно найти все здесь: http://www.w3schools.com/charsets/ref_html_entities_4.asp

Но при использовании JavaScript, для того, чтобы сделать браузер понимает, что вы хотите вывести символ юникода, а не строку, требуемые объекты исключения. Для этого добавьте \u перед шестнадцатеричным именем =>\u211D;.

+1

(1) Точка с запятой не является частью шестнадцатеричного кода. (2) Символ unicode ** является ** строкой (или, скорее, символом в строке). (3) Формат '\ uXXXX' не называется« сущностью ». (4) Ведущий ноль сделает это недействительным и не даст вам то, что вы хотите. Он будет интерпретироваться как кодовая точка юникода '0211', за которой следует символ« d ». –

 Смежные вопросы

  • Нет связанных вопросов^_^