• ベストアンサー

書き方が悪いのか?それとも仕様なのか?

それとも、単純なミスに気がつかないのか、どうしても、期待した結果を表示させることができません。 document.write();内で「<!-- comment -->」や「<script ... </script>」はNGなのでしょうか? 現状としては、後述の内容をHTMLファイルとしてローカルに保存した後、ブラウザで、そのHTMLファイルを開いて結果を確認しています。 ブラウザは Firefox 2.0.0.19 で OS には Debian GNU/Linux etch を使用しています。 可能であるならば、表示できるようにしたいのですが、もし、無理であるなら、その原因(理由?)も知りたいです。 申し訳ありませんが、詳しいかた、どうぞ、よろしくおねがいいたします。 【期待している結果】 - Test Start - ------------------------------------------- ←<HR>の線 Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End. 【実際の結果】 - Test Start - ------------------------------------------- ←<HR>の線 :End."); --> ---- ここからHTMLファイル内の内容 ---- <HTML> <HEAD> <TITLE>ScriptTest</TITLE> <script language="Javascript"> <!-- document.write("- Test Start -"); --> </script> </HEAD> <HR> <BODY> <script language="Javascript"> <!-- document.write("<!-- comment -->"); document.write("Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End."); --> </script> </body> </HTML> ---- ここまでHTMLファイル内の内容 ----

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

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.4

タグを文字列として HTML に出力するのであれば、普通に考えて <、& → &lt;、&amp;(場所によっては >、"、' → &gt;、&quot;、&apos;)に置換する必要があるのですから、document.write() するときもこれを考慮しなければなりません。 <script type="text/javascript"> document.write ("\u003C\u0021\u002D\u002D comment \u002D\u002D\u003E"); document.write ("\u003Cp\u003EScript:document.write(\u0026apos;\u0026lt;script type=\u0026quot;text/javascript\u0026quot;\u0026gt;document.write(\u0026apos;Hello World\u0026apos;):\u0026lt;/script\u0026gt;:End.\u003C/p\u003E"); </script> 上記はやや偏執狂的にエスケープしていますが、どこを何の形式に合わせているかを確認して下さい。HTML パース → JavaScript パース → HTML パースの順ですから、各段階でエスケープの層が増えていきます。 あるいは、DOM API の createTextNode() を使えばタグのエスケープは不要です。

jxnvozt
質問者

お礼

繰り返し、御回答頂き、ありがとうございます。 >タグを文字列として HTML に出力するのであれば、普通に考えて <、& → &lt;、&amp;(場所によっては >、"、' → &gt;、&quot;、&apos;)に置換する必要があるのですから、document.write() するときもこれを考慮しなければなりません。 確かにその通りでした。御指摘ありがとうございます。「<」「>」「&」「*」だけでなく「”」や「’」等も置き換え対象として注意します。 Chaireさんをはじめ、みなさんの御指摘でようやく、ここまで、たどり着けました。 この場を借りて感謝します。本当にありがとうございました。

jxnvozt
質問者

補足

参考までに、できあがったコードは下記の通りです。 -- ここから HTML ファイル -- <HTML> <HEAD> <TITLE>ScriptTest</TITLE> <!-- Chaireさん/Wernerさんの指摘 : language を type に変更 : script language="Javascript" // --> <script type="text/javascript"> <!-- document.write("- start -"); <!-- Wernerさんの指摘 : 「Netscapeでのエラー対策の為」との解釈で良いのでしょうか? // --> // --> </script> </HEAD> <hr> <BODY> <!-- 4017Bさん/Wernerさんの提案 : 外部ファイル化 // --> <script src="./sdjs.js" type="text/javascript"> </script> </body> </HTML> -- ここまで HTML ファイル -- -- ここから JS ファイル(HTMLファイルと同じ場所に配置。ファイル名:sdjs.js ) -- // ScriptDemoJavaScript.js // Chaireさんの指摘 : コメント内では「--」を「-\-」にする。特定文字の置き換え // 疑問 : .js ファイル内でも「--」を「-\-」とする必要はあるのだろうか?どちらでも同じように動くようだが…。 document.write("&lt;!-\- comment -\-&gt;"); document.write("<br>"); //改行の指示。 // document.writeln()を使わないのは、使いかたがわからなかった為。(改行されず、空白ができるだけだった。) // new String() を試したときの残骸 // Chaireさんの指摘 : 特定文字の置き換え // str = new String("Script:document.write('&lt;script language='Javascript'&gt;document.write('Hello World'):&lt;/script&gt;:End."); // document.write(str); // Chaireさんの指摘 : 特定文字の置き換え document.write("Script:document.write('&lt;script language='Javascript'&gt;document.write('Hello World'):&lt;/script&gt;:End."); -- ここまで JS ファイル --

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

特に出来ない理由がなければ、JavaScriptは外部ファイルにすることをすすめます。 外部ファイルはHTMLとして解釈されることはないので、 ソースコード全体をHTMLのコメントで囲ったりしなくて良いし <script>や</script>、--の出現に関して気にする必要もなくなりますから。 それから、提示のコードの  -->  </script> は、  //-->  </script> としておきましょう。 あと提示のコードはHTML4.01のつもりで書いたわけでは無いのかもしれませんが、 もしHTML4.01に従って記述するつもりがあるなら language 属性ではなく、type 属性を使用しましょう。

jxnvozt
質問者

お礼

御回答ありがとうございます。 コードの御指摘、感謝します。早速、反映させてみます。 「//」を入れる意味(理由)が、気になりますが、後ほど調べてみます。 さて、回答者:4017Bさん(No.1)の回答の中でも、「外部ファイルで」という表現がありましたので、 今回、外部ファイル(JSファイル)に分割して、試してみました。 Firefoxでしかテストしていないのですが、結果として、外部ファイルもHTML的に解釈されるようで、変化はありませんでした。 また、回答のお礼(No.1/No.2)で書いた「new String()」でも同様の結果となってしまいました。 そんなこともあって、googleにて「エスケープ文字」で検索していた所、Pythonスクリプトでの説明ではありましたが、 要約すると『HTML内では「<」「>」「&」そして「*」の4文字は必ず、エスケープしなければならない。』と書かれていました。 さっそく、マネて、文字列部分を書き換えてみました。 その結果、見事、期待している結果になり…。 一応なりました。 あとは、<!-- comment -->の後の改行を、入れるだけです。 やることは、単純なのに、無駄に長くかかってしまいましたが、ようやく、終わりそうです。 ★ここで、質問の内容に一部誤りが発見されましたので、訂正させていただきます。 [訂正内容] <HR>の線の下に入るべき内容(<!-- comment -->)が入っていない。 [誤] 【期待している結果】 - Test Start - ------------------------------------------- ←<HR>の線 Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End. [正] 【期待している結果】 - Test Start - ------------------------------------------- ←<HR>の線 <!-- comment --> Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End. 以上が、訂正の内容です。

すると、全ての回答が全文表示されます。
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.2

ただの構文違反です。 <script type="text/javascript">document.write ('<script type="text/javascript">document.write (\'<script type="text/javascript">document.write (\\\'<script type="text/javascript">document.write (\\\\\\\'TEST\\\\\\\');<\\\\/script>\\\');<\\/script>\');<\/script>');</script> script 要素の入れ子に関しては HTML5 で script nesting level が提唱されていますが、今のところ入れ子回数の制約はありません。 逆に言えば、何をエスケープして何をエスケープしないかに十分注意して下さい。例えば、HTML 4.0 のコメント内に -- を書くことはできません(ブラウザが例外処理するかは別問題です)ので、document.write('<!-\- comment -\->') のようにしなければなりません。入れ子になれば \ の個数も増えます。エスケープを間違えたくなければ DOM API の createComment() を使うべきです。

jxnvozt
質問者

お礼

御回答ありがとうございます。 構文違反として、理解しました。 >例えば、HTML 4.0 のコメント内に -- を書くことはできません 不勉強で申し訳ありません、まったく知りませんでした。 早速、エスケープ文字にて、確認します。 >script 要素の入れ子に関しては HTML5 で script nesting level が提唱されていますが、今のところ入れ子回数の制約はありません。 スクリプトの入れ子についても、ご解説頂きありがとうございます。 当方、入れ子が可能だとは、思っていませんでした。またしても、不勉強で申し訳ありません。 さて、回答者:4017Bさん(No.1の方)のお礼にも書いたのですが、スクリプトとして入れ子にして実行しようというわけではなく、文字列として出力しようとしております。 これから、エスケープ文字や「new String()」等で文字列として出せないかを試してみます。

すると、全ての回答が全文表示されます。
  • 4017B
  • ベストアンサー率73% (1341/1821)
回答No.1

JavaScriptの仕様です。 “<script>~</script>”で囲った中でわ「script」と言う文字列自体が無効化される仕様だったと思います。 単純に2重入れ子等での悪意あるファイルの読み込みを禁止させるための仕様だったはず…? 外部ファイル(JSファイル)を読み込ませる事で回避する方法もありますが。 確かIEの一部のver.でしか動作しないです。3年前まではそれでも良かったですけど、今のブラウザ戦争の状況を考えると、事実上不可能と思った方が良いかと。 例文では恐らく簡易化されてるのでしょう。 本当にやりたい事が分かりませんので、何か他の手段で代替する方法を考えるしかないですね…。

jxnvozt
質問者

お礼

御回答ありがとうございます。 当方としては、""で囲んでいるので、単なる文字列と考えていたのですが、 「文字列であってもスクリプトとして解釈する(してしまう?)」仕様である。 といった解釈で、差し支えないのでしょうか? とりあえず、「new String()」等で文字列として出せないか試してみます。

すると、全ての回答が全文表示されます。

関連するQ&A