プロが教える店舗&オフィスのセキュリティ対策術

JavaScript初心者です。

document.write()でhtmlかき出しをする際、
そのまま出力されるのではなくある程度の実体参照符号化が行われているということがわかりました。
例えば、

・document.write("<>&");   → &lt;&gt;&amp
・document.write("<br />"); → <br>
・document.write("</3>");  → <!--3-->

といった具合に加工されているようです。(あくまでhtmlソースの話です)
かゆいところに手が届くいい機能だとは思うのですが、「そのまんま」出力したい場合もたまにはあります。そういうメソッドはないのでしょうか。

PHPやPerlの場合は print でそのまま出力できるのでJavaScriptはどうなの?と思ってしまったわけです。
「無理」という回答でも結構です。よろしくお願いいたします。

A 回答 (3件)

私もjavascript歴はそんなに長いわけではないので、間違ってたらすいません。

はじめに断っておきます。

さて、本題ですが、テキストをプレーンで出力したいということでしょうか?
DOMが使えるのならtextContentプロパティ、innerTextプロパティに書き込めばいいようです。
(参考:http://www.openspc2.org/reibun/JavaScript_techni …
あるいはjQueryのtext()を使えばブラウザを意識する必要がないので楽ですね。

javascriptの組み込みでは、確認した限りではdocumentオブジェクトにそのまま出力する関数はないですね。
どうしてもdocument.writeを使いたいのであれば、がんばって自力で変換するしかないかもしれません。

ちなみに、
>・document.write("<>&");   → &lt;&gt;&amp
>・document.write("<br />"); → <br>
>・document.write("</3>");  → <!--3-->
>といった具合に加工されている
というのは違う気がします。
<>&と<br />はちゃんとそのまま出力されてますし(Firebugで確認)、</3>はHTMLとして無意味なので無視されているだけだと思います(確証ありませんが)。
実体参照符号化はされておらず、結局HTMLとしてどう解釈されるかなだけかと思われます。

以上参考になったら幸いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
とりあえずそういう関数はないとわかっただけですっきりしました。

ちなみに
>・document.write("<>&");   → <>&
>・document.write("<br />"); → <br>
>・document.write("</3>");  → <!--3-->
はfirefox3.5.2(Win-XP)にて、「Ctrl+A」 > 「選択した部分のソースを表示」で見たものです。

お礼日時:2009/09/06 14:09

> ちなみに、改めてPHPで print '</3>'; を実行してみましたが、


> 手打ちでhtmlを書くのと同様そのまま書き出しでした。
それはおかしいな。
Firefox 3.5.2で
<>&
<br />
</3>
と書いただけのHTMLを表示し
選択した部分のソースを表示してみたら、こちらでは
<html><head></head><body>&lt;&gt;&amp;
<br>
<!--3-->
</body></html>
と表示されたから。


それから、No.2の回答で言いたかったことは、
ブラウザのパーサーが </3> を <!--3--> と解釈している以上、
</3> と書くのと <!--3--> と書くのは全く同じことで、
そのまま書き出すということにこだわるのは
できるできないではなくそもそも意味がないのではないかと言うこと。

(JavaScript出力でも、HTMLの手打ちでも、PHP出力でも、)
</3> が必ず <!--3--> と解釈されるなら、
「</3>を出力する」と言う動作は「<!--3-->を出力する」という動作と等価なはずなんです。
    • good
    • 0

document.writeは直接関係なくて


ブラウザのHTMLパーサーがそう解釈しているようです。
なので、PHPやperlで書き出したとしても同じ結果だと思います。

--------------------------------------------------
<html>
<head>
<script>
//Firefox3だと
// &lt;&gt;&amp;
// <br>
// <!--3-->
//というalertがでる。
window.onload = function(){
alert(document.getElementById("test").innerHTML);
}
</script>
</head>
<body>

<div id="test">
<>&
<br />
</3>
</div>

</body>
</html>
    • good
    • 0
この回答へのお礼

なるほど、JavaScriptの書き出したものは直接的な方法で見ることが出来ないのでもどかしいですね。そもそもJavaScriptには書き出しという概念がないのでしょうか…

ちなみに、改めてPHPで print '</3>'; を実行してみましたが、手打ちでhtmlを書くのと同様そのまま書き出しでした。

ありがとうございました。

お礼日時:2009/09/06 14:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!