Firefox 3.6x - 8 の JavaScript に関する互換性

<< 戻る   トップ >>

『数独』を解くプログラム」という記事を2007年の12月末に作成した。この記事の中に JavaScript プログラムがあるのだが、職場でこれが動作しないことに気がついた。気になって家でも試してみると動く。職場では Firefox 8 を使っていて、家では Firefox 3.6x だ。このブラウザのバージョン違いが原因だと思うのだが、ちょっと調べてみよう。仕事が忙しいことでもあるし。

<script type="text/javascript">
  document.writeln( '<p style="color: red;"この赤文字が見えていれば JavaScript 動いているよ。</p>' );
</script>

実は、上記のサンプルとこの段落との間には、サンプルどおりのコードが書かれているのだが、Firefox 8 ではまったく無視されてしまう。おそらく、Firefox 3.6x では動作するんじゃないだろうか。ちなみに、JavaScript を CDATA でラップするともっとひどいことになる。

原因についてはいろいろ考えてみたいが、基本的に「鴨乃嘴南蛮」のウェブウインドウ内のコンテンツ表示は、XMLHttpRequest で引っ張ってきたデータを innerHTML に放り込むという極めてゾンザイな手法を使っている。これで静的な要素がレンダリングされるのはよいとして、 <script> 要素が動作するのはどうよ、とも思っていた。何かの悪事に使われそうな気もする。

「できなくなった」でもよいのだが、そうなった経緯や代替手段はないか、などを調べてみたいと思う。

...

記事投稿後自宅で確認したところ、Firefox 3.6x ではもっとひどいことが起きていることがわかった。document.writeln が問題で、innterHTML 再レンダリング中にそれ自体を document.writeln で変更するというのはやはり無理がありすぎる話で、要するにサンプルとして不適切であった。したがって、上記の Script は本稿から削除した。

ちなみにテキストモードであれば Firefox 3.6x でも Firefox 8 でも動作する。テキストモードでは innterHTML などはつかわないのだ。

【追記】2011年12月08日(木)

Firefox の JavaScript まわりが大きく変わったのは Firefox 4 で新スクリプトエンジン JägerMonkey を導入した今年3月のことだ。どこかそのころに変更に関するコメントやレポートがないかと思って検索したところ、"admin" 氏のブログ "floatingdays" 2010年5月28日「JavaScriptによって動的に script要素を追加する場合のブラウザごとの挙動の違い」(2011年3月29日 追記)にレポートがあり、やはり Firefox 4 になったときに innterHTML の挙動の変更があったようだ。admin 氏は「セキュリティ的な施策」ではないかと推察している。

代替手段としては、<script> 要素を生成してから src 属性で外部ファイルを読みこむ方法が推奨されている。IE 以外なら <script> 要素の innerHTML にプログラムを流し込んでも動作するそうだ。いずれにせよ、鴨乃嘴南蛮システムのプログラム変更をしないと対応できない。例えば、「数独を解くプログラム」は独立したアプリケーションとして、鴨乃嘴南蛮デスクトップで動くようにしてやればよい。"鴨乃嘴南蛮 Sei" で解決すべき問題がまたひとつ増えた。なお、この場合「問題」と書いて「たのしみ」と読む。


作成: 2011-12-07 11:05:05.0更新: 2011-12-08 17:21:36.0
http://museo-anonimo.jp/nanban/?id=1047,http://museo-anonimo.jp/nanban/tr/1047