2016-09-02 15 views
0

JavaScriptを使用してdivに記号を挿入しようとしています。
これは次のようになります。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 *を含みます。 1つのケースはHTMLとして明示的に評価され、もう1つのケースは明示的に – deceze

答えて

2

HTMLエスケープ(エンティティ)をテキストにする必要があります。 createTextNodeのためのドキュメントによると:

dataは、それだテキストノード

に入れるべきデータを含む文字列です。これは、テキストノードに配置されるデータです。 DOM specも同様です。

指定された文字列を指定してTextノードを作成します。

この文字列にUnicodeを含める必要があります。 JavaScript文字列にUnicodeを含めるには、\uXXXXの形式でUnicode escapesを使用します。

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

それとも、あなたは単に、実際のUnicode文字が含まれており、すべての問題を避けることができます:ちょうどあなたは、JSファイルはUTF-8を務めていることを確認してください、この場合、

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

をファイルを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>"とテキストノードを作成します。 2番目の要素は、新しい要素の内容を文字どおり"<div>foo</div>"に設定します。一方、3番目の要素は、テキスト"foo"を含む新しい要素内に実際のdiv要素を作成します。

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のテキスト表現なので、domを直接操作するときにはHTML関連のエスケープは必要ありません。

+1

「自動的にHTMLをエスケープする」という意味を理解できません。それはまったく何もしません。あなたが与えたテキストをテキストノードにそのまま置くだけです。 –

+0

ウェブページはHTMLではありません。 WebページはDOMツリーです。すべてがHTMLとHTMLをエスケープする必要はありません。 HTMLは最初のDOMツリー構造のテキスト表現です。 – deceze

+0

これは、初心者がhtml-escapeを使わない理由を理解できるようにする方法です。そのような単純な質問に対する答えとしてdomがどのように働くかについて、20行の説明を与えることはできません。 (あなたはそれを2行で記述することができましたが、そのおかげで) –

1

すべての文字は16進数の名前です(たとえば、0211D)。 JavaScriptを使用するときにするために、http://www.w3schools.com/charsets/ref_html_entities_4.asp

しかし:あなたは、HTMLエンティティに変換し&#x =>&#x0211D;を追加したり、エンティティ名&reals;またはすべてここに見つけることができ小数点名&#8477;を使用する場合ブラウザでは、文字列ではなくユニコード記号を出力することを理解しているので、エスケープエンティティが必要です。これを行うには、16進数=>\u211D;の前に\uを追加します。

+1

(1)セミコロンは16進コードの一部ではありません。 (2)ユニコード記号**は**文字列(または文字列中の文字)です。 (3) '\ uXXXX'フォーマットは"エンティティ "と呼ばれません。 (4)先行ゼロはこれを無効にし、あなたが望むものを与えません。これは、ユニコードコードポイント「0211」とそれに続く文字「d」として解釈されます。 –