• ベストアンサー

【JavaScript】実体参照符号化なしでそのまま出力したい

JavaScript初心者です。 document.write()でhtmlかき出しをする際、 そのまま出力されるのではなくある程度の実体参照符号化が行われているということがわかりました。 例えば、 ・document.write("<>&");   → &lt;&gt;&amp ・document.write("<br />"); → <br> ・document.write("</3>");  → <!--3--> といった具合に加工されているようです。(あくまでhtmlソースの話です) かゆいところに手が届くいい機能だとは思うのですが、「そのまんま」出力したい場合もたまにはあります。そういうメソッドはないのでしょうか。 PHPやPerlの場合は print でそのまま出力できるのでJavaScriptはどうなの?と思ってしまったわけです。 「無理」という回答でも結構です。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • LOHA
  • ベストアンサー率52% (203/388)
回答No.1

私もjavascript歴はそんなに長いわけではないので、間違ってたらすいません。はじめに断っておきます。 さて、本題ですが、テキストをプレーンで出力したいということでしょうか? DOMが使えるのならtextContentプロパティ、innerTextプロパティに書き込めばいいようです。 (参考:http://www.openspc2.org/reibun/JavaScript_technique/sample/06_DOM/006/index.html) あるいはjQueryのtext()を使えばブラウザを意識する必要がないので楽ですね。 javascriptの組み込みでは、確認した限りではdocumentオブジェクトにそのまま出力する関数はないですね。 どうしてもdocument.writeを使いたいのであれば、がんばって自力で変換するしかないかもしれません。 ちなみに、 >・document.write("<>&");   → &lt;&gt;&amp >・document.write("<br />"); → <br> >・document.write("</3>");  → <!--3--> >といった具合に加工されている というのは違う気がします。 <>&と<br />はちゃんとそのまま出力されてますし(Firebugで確認)、</3>はHTMLとして無意味なので無視されているだけだと思います(確証ありませんが)。 実体参照符号化はされておらず、結局HTMLとしてどう解釈されるかなだけかと思われます。 以上参考になったら幸いです。

ikataro
質問者

お礼

ありがとうございます。 とりあえずそういう関数はないとわかっただけですっきりしました。 ちなみに >・document.write("<>&");   → <>& >・document.write("<br />"); → <br> >・document.write("</3>");  → <!--3--> はfirefox3.5.2(Win-XP)にて、「Ctrl+A」 > 「選択した部分のソースを表示」で見たものです。

その他の回答 (2)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.3

> ちなみに、改めて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-->を出力する」という動作と等価なはずなんです。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

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>

ikataro
質問者

お礼

なるほど、JavaScriptの書き出したものは直接的な方法で見ることが出来ないのでもどかしいですね。そもそもJavaScriptには書き出しという概念がないのでしょうか… ちなみに、改めてPHPで print '</3>'; を実行してみましたが、手打ちでhtmlを書くのと同様そのまま書き出しでした。 ありがとうございました。

関連するQ&A

  • 文字実体参照が勝手に変換されてしまう

    簡単な問合せフォームを作成中に文字実体参照に変換した文字が、元に戻されてしまい困っています。簡単なサンプルを作成してみましたが、以下の様な状態です。 1.入力フォームを持ったHTMLに 「<>と&lt;と&gt;」 と入力し、xxx.cgiに渡します。 2.xxx.cgi内で入力文字列を取得し、文字実体参照に変換後<hidden>で値を保持、再度xxx.cgiに<hidden>の文字列を渡すようにします。この時点で入力値は 「&lt;&gt;と&amp;lt;と&amp;gt;」 となります。 3.再度xxx.cgiが呼ばれると、文字実体参照に変換する処理が行われる為、入力値が 「&amp;lt;&amp;gt;と&amp;amp;lt;と&amp;amp;gt;」 となるはずですが、 「&lt;&gt;と&amp;lt;と&amp;gt;」 となってしまいます(変換処理が行われているはずなのに変換されていない)不思議に思って変換前のCGIの引数を確認してみると、 「<>と&lt;と&gt;」 と文字実体参照が元に戻されてしまっています。 ちなみに文字実体参照の変換処理は$valueに対象の文字が入っているとして以下の方法で変換しています。 ---------- $value =~ s/&/&amp;/g; $value =~ s/"/&quot;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\n/<BR>/g; ---------- こういった現象についてでも何か分かるようでしたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • javascriptの実体参照?

    現在googlechromeの拡張の開発の為に、javascriptにチャレンジしています。 やりたいことは不特定のサイトにアクセスした時、ソースを取得して、正規表現でマッチするURLがあればそのURLにジャンプするといった事です。 その際、URLの中に「&」があれば「&amp」に変換されてしまいます。 下記の記述で「document.write(xURL);」に書き換えると「&」のままで思い通りに出力できましたが、「location.href = xURL;」の場合は「&amp」に変換されてしまいます。 ジャンプするサイトが対応していないか、chromeが対応していないか、そもそもjavascriptの記述が間違っているか、判断がつきません。 ご教授頂ければ幸いです。宜しくお願い致します。 //////////////////// ソースから検索してジャンプしたいURLは「http://abc.com/(ワイルドカード)123」のようなものです。 xSource = document.getElementsByTagName("html")[0].innerHTML; if ((xURL = xSource.match(/http:\/\/abc\.com\/.*?123/)) != null) { location.href = xURL; }; ////////////////////

  • <textarea>の最後尾に追加した実体参照や数値参照が意図した通り表示されない

    <textarea>の最後尾に追加した実体参照や数値参照が意図した通り表示されません。 確認したこと(■1■)と、やりたい事(■2■)は、下記の通りです。 ■1■ <textarea>~</textarea>の中に直接記述すると    下記の例だと、 <とか> と、表示されます。 <textarea name="output" id="outputEdit" style="background-color:#99ff66" cols=80 rows=25> &lt;とか&gt </textarea> ■2■ javascriptで<textarea>の最後尾に追加する方法だと、    下記の例だと、 &lt;&gt; と、表示されてしまいます。 <textarea name="output" id="outputEdit" style="background-color:#99ff66" cols=80 rows=25></textarea> <script language="javascript"> <!-- var objTextarea = document.getElementById('outputEdit'); objTextarea.value+="&lt;&gt;"; //--> </script> 2の記述で、1と同じ様に表示させたいのですが、 無理なのでしょうか? どうか宜しくお願いいたします。

  • JavaScript実行結果を保存

    PerlでJavaScriptを実行し、その結果を出力することはできるのでしょうか? 例えば、 <HTML><BODY> <script> <!-- document.write("テストです"); // --> </script> </BODY></HTML> 上記のようでしたら、 <HTML><BODY> テストです </BODY></HTML> と、そのまま表示したいのですが("<"等は"&lt;"等に置き換えます。)、できるのでしょうか? 上の例だと、document.writeだけを消してしまえばいいのですが、if文やfor文などがあると消すだけでは無理ですので。。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • jsp 改行コードで改行させて表示したい

    はじめまして。 PostgreSQLから読み込んだ文字列データを表示させるtomcat+struts+servlet/jspを作成中です。 データの文字列に含まれる改行が、クライアントに表示された際に反映されず困っています。 過去ログも調べ、近い質問はありましたが、僕とは内容が微妙に違うようで、改めて質問させていただきました。 例えば、あるテーブルのある項目に、 A B C というデータ(A,Bそれぞれの後に改行のある3行の文字列)があるとします。 これを読み込みaction form bean(と言うのですか?setter/getterを定義する関数です)を介してjspに埋め込むと、できあがるhtmlでは、 ABC と改行されずに表示されます。 htmlで改行させるには「<BR>」が必要なのかと、データ文字列に0x0dや0x0a、または0x0d+0x0aがあれば「<BR>」に置き換えてaction form bean(?)のsetterに渡してjspを作ると、今度は、 A<BR>B<BR>C と「<BR>」が文字列として表示されます。 htmlをソース表示すると、「A&lt;BR&gt;B&lt;BR&gt;C」で、親切にも「<」「>」をそれぞれ「&lt;」「&gt;」に勝手に置き換えあくまで文字列として表示してくれるようです。 試しに改行コードを「&lt;BR&gt;」に置き換えても予想通りその部分は &lt;BR&gt; とそのまま表示され、そのソースは「&amp;lt;BR&amp;gt;」でした。 「<」や「&lt;」等をそれぞれ「&lt;」「&amp;lt;」のように置き換える作業は、どこが行っているのでしょうか。 また、改行位置で改行させるにはどうすればよろしいでしょう。 OSはwindowsXPです。 無知ゆえに、つまらないことで悪戦苦闘しているのかも知れませんが、経験も浅くてよく解りません。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 【XML】定義済み実体について

    XMLには定義済み実体(lt, gt, amp, quot, apos)というものが 存在し、明示的に開発者が定義をしなくても実体参照を 行うことができますが、実際、これはどこに定義されているのでしょうか。ご存知の方ご教示ください。

    • 締切済み
    • XML
  • 改行コード入り文字列を含むXMLの変換方法

    PHPを用いて、XMLからXSLTを経由しHTMLを出力するというプログラムを作成しています。 ほとんど完成しているのですが、最後に改行で問題が発生してしまい かなり困っています。 XML内に保存されている改行入りの文字列を HTMLできちんと改行されたまま表示したいのですが 繋がったまま出力されてしまいます。 ------------------------------------------------------- ※&lt;br /&gt;は、PHPで入力文章の確認をする際に  改行させたまま表示させたいので記述して  それを残したままXMLに保存しています。 <sample> <title>見出し1</title> <paragraph>  あいうえお&lt;br /&gt;  あいうえお&lt;br /&gt;   あいうえお&lt;br /&gt; </paragraph> <sample> ↓PHPでXSLTを通してHTMLに出力 見出し1 あいうえお<br />あいうえお<br />あいうえお ------------------------------------------------------- これを、改行された状態で表示できるようにしたいのですが なかなか上手くいきません。 何か、解決策が思い浮かぶ方がいらっしゃいましたら 是非、教えていただきたいです。 利用環境はPHP5です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • エスケープしたくない、けど、したいのもある

    とあるテキストデータ(.txt)を読み込み、それを表示するスクリプトをPHPで作りました。 その際、もしテキストデータにHTMLタグが入っている場合、そのまま出力させて、タグが有効になるようにしています。 (というかテキストを何も処理せずそのまま出力するだけ) (セキュリティ的には、テキストデータは信頼できる自サイトの同一ディレクトリに置いてあるものからしか読み込ませないようになっています) しかし、今度は逆に、もしそのテキストデータに「<hoge>」などの文字がふくまれていた場合、ブラウザはそれをタグと認識し、見えない表示になります。 本当は見えるようにそこは「&lt;hoge&gt;」と出力してほしいわけです。 かと言って、 echo htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); などエスケープして出力すると、今度はHTMLタグとして出力させたい「<br>」なども「&lt;br&gt;」として出力されてしまい都合が悪いです.. ようは、 「こんにちは<hoge><br>ほげ」 という文字列のテキストを、 「こんにちは&lt;hoge&gt;<br>ほげ」 と出力してほしい.. もちろんテキストは「hoge」であるとは限りません。 何かよい解決方法はないでしょうか? ご教示頂けましたら幸いです。

    • ベストアンサー
    • PHP
  • インデントされない

    プログラムをここにペーストすると、 インデントされないのですが、どうすればよいのですか? このようなプログラムでも駄目ですか? <pre>#!Perl<br># JOIN_WITH_BR.pl: join lines with &lt;BR&gt; in clip board v0.0.1<br>use Win32::Clipboard;<br>my $clip = Win32::Clipboard();<br>my $rec = $clip-&gt;Get();<br>$rec = convert($rec);<br>$clip-&gt;Set($rec);<br>print "Done...\n";<br>sleep 3;<br>sub convert {<br> $_[0] =~ s/&lt;/&lt;/g;<br> $_[0] =~ s/&gt;/&gt;/g;<br> $_[0] =~ s/\r\n/&lt;br&gt;/g;<br> $_[0] = "&lt;pre&gt;$rec&lt;/pre&gt;\r\n";<br>}<br>__END__<br></pre>

  • CGIにおいて、エンコード・文字化けの対処方法

    以下のようにCGIを記述しております。(本日勉強したてで間違いだらけでしたら申し訳ございません。) ============= #!/usr/local/bin/perl print "Content-type: text/html; charset=EUC-JP\n"; print "\n"; print "<html>\n"; print "<title>Hello CGI</title>\n"; print "<body>\n"; print "<h1>Hello CGI!</h1>\n"; print "<hr>\n"; print qq( 上記のCGIファイルのメッセージは、次のように記述しました。<br><br> #!/usr/local/bin/perl<br><br> print "Content-type: text/html\\n";<br> print "\\n";<br> print "&lt;html&gt;\\n";<br> print "&lt;title&gt;Hello CGI&lt;/title&gt;\\n";<br> print "&lt;body&gt;\\n";<br> print "&lt;h1&gt;Hello CGI!&lt;/h1&gt;\\n";<br> print "&lt;/body&gt;";<br> print "&lt;/html&gt;";<br><br> ); print "</body>"; print "</html>"; =========== 以上をIE7で表示しますと、エンコードが西ヨーロッパ言語になって文字化けを起こしてしまいます。 何か記述の仕方が間違っているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI

専門家に質問してみよう