• ベストアンサー

JavaScriptのinnerHTMLの挙動について

下で"JavaScript内からJavaScriptを書き出したいのですが"で質問したものですが,ソースコードを簡単にして再質問したいと思います. ソースは以下のようにし,divタグのところにinnerHTMLで文字"test"とJavaScriptでアラートを表示させるものです.表示してみたところ,"test"は表示されるのですが,アラートは出てきません. これはinnerHTMLではHTMLのタグは評価されるが,JavaScriptは評価されない,ということなんでしょうか.JavaScriptのこのような仕様は調べにくいので困っています.回答宜しくお願いします. <html><head><title></title> <SCRIPT type="text/javascript"> <!-- var str='<font color="blue">test</font><script type="text/javascript">alert(123);</script>'; function gogo(){ document.all("here").innerHTML = str; } //--> </SCRIPT> </head><body> <div id="here" style="position:absolute;width:600px;left:0px;top:0px;"></div> <SCRIPT type="text/javascript"> <!-- gogo(); //--> </SCRIPT></body></html>

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

  • ベストアンサー
回答No.1

Mac OS10.3 , IE5.2ですが、記載されているもので「123」のアラートが出てきましたよ。 Windowsをご使用とのことだったと思うので、その違いかもしれないですね。 ご使用のブラウザがJavaScript無効になってたりは…しませんよね(^^;

timetraveler
質問者

お礼

回答ありがとうございます. 以前の質問でinnerHTMLはIE特有の・・・と教えていただいたのですが,私の持っているJavaScriptの本にWin,MacのIE,Netscapt,Mozillaにて動作すると書いてあったので,大丈夫だろうと考えていました. しかし,実際に試してみたところ, WinIE・・・文字の出力は○(フォントの色も) MacIE・・・アラートも表示 Netscape(Win,Macともに)・・・文字すら出ず Mozilla(Win,Mac)・・・文字すらでず Camino,Safari(Mac)・・・文字すら出ず で散々な結果でした. 皆さんが言うように,innerHTMLはあまり使わない方がよさそうだと実感しました. ありがとうございました.

その他の回答 (2)

  • itochanda
  • ベストアンサー率36% (8/22)
回答No.3

本文の gogo(); が評価された後、実行の流れは   //-->   </SCRIPT></body></html> これを残すのみです。   <div id="here"> の中身を書き換えても評価されずに終了しますから、 alert は出ません。 ですから実行している gogo(); よりも後ろ、</body>までの間の内容を書き換えれば実行されるはずです。 "test"の文字列は document.all("here").innerHTML を書き換えた時に副作用として画面でも表示されます。 書き換えること自体がスクリプトを実行するべきものではないことは、gogo()の後ろにまだほかのスクリプトが残っていればスクリプトの流れが分岐してしまうことから自明だと思います。

timetraveler
質問者

お礼

返答ありがとうございました. やはり,innerHTMLでHTMLを挿入->挿入されたHTML(JavaScript)が評価されるわけではなさそうですね. 他にも方法がないかいろいろ調べてみようと思います.

  • peron
  • ベストアンサー率45% (43/95)
回答No.2

前回のご質問でもご指摘されていたようにinnerHTMLはIEのみ動作し、レイアーに指定されたHTMLを書き出す関数としていながら、ハイパーリンク(<A href~>)すらまともに書き出す事が困難な関数なのです ※ DynamicHTML上での話しです せいぜい<BR>タグを使ったテキスト程度が無難です また、#1様の結果から明らかなようにIEに関してMacとWinは別物の動作をする事がたびたびあります (実際Win環境ではアラートは出ませんでした・・・Javascriptを書き出すのを失敗している) 私なら、ご質問の動作をさせたいと考えた時 スクリプトを書き出すという事を考えずに <SCRIPT type ="text/Javascript"> <!-- var staTag ="<P style='width:200px;height:50px;font-size:10pt;'>"; var endTag ="</P>"; function info1(a){ if(document.getElementById){ document.getElementById("Layer1").innerHTML = a; } if(document.all){ document.all["Layer1"].innerHTML = a; } if(document.layers) { with(document.layers["Layer1"].document){ open() write(staTag + a + endTag) close() }} alert("123") } //--> </SCRIPT> </HEAD> <BODY onload="info1('test')"> <DIV id="Layer1" style="position:absolute; width:200px; height:50px; z-index:1; left: 10px; top: 100px;font-size:10pt;"> </DIV> </BODY> と書きます(IE4、NN4以降Mozilla等動作します) この場合の9行目のinnerHTMLはDOMの仕様としてNNでも動作(NN6以降)しています ※ この場合でも<BR>を含むテキストを表示する程度です この後 どのような動作をご希望なのでしょうか そのあたりを書いて頂けるとアドバイス程度は出来るのですが 私 Javaは残念ながらわかりません あしからず

timetraveler
質問者

お礼

回答ありがとうございます. レイヤーに文字を書き出す方法としてinfo1関数中の3つめのような方法があるとは. 勉強になりました. 残念ながら,このプログラムの目的は訳あって説明することができません.申し訳ありません. 皆さんからの回答を参考に,(特に他ブラウザ,他OSでの挙動)JavaScriptの勉強,プログラミングをしていきたいと思います. ありがとうございました.

関連するQ&A