【PR】 マジックリスニングで12時間英語耳
【PR】 インターネットでおこづかい稼ぎに必要なプログラム知識とは?
【PR】 (話題の本)イラクの中心で、バカとさけぶ
【PR】 失敗しないレンタルサーバの選び方
 

Mac版ネットスケープ4.XでのみJavascriptが動かない

DB数・メールアドレス・ドメイン・サブドメイン・FTPアカウント無制限の
レンタルサーバーMUGEN


普通にHTMLファイルを作成する際は、Shift_JISで作成することが多いと思いますが、プログラムで動的に表示するようになると圧倒的にEUC-JPで作成する機会も多くなると思います。実はここに落とし穴があります。

Shift_JISでなら動くけれど、EUC-JPにするとJavascriptが動かなくなることがあるんです。しかも、他のブラウザでは動くのに、Mac版ネットスケープ4.Xでだけ動かない難問。しかも、ずっと動かないのではなく、一度目にロードした時には動作せずに、 ブラウザの戻るボタンで戻り、「次へ」ボタンでそのページに戻ると今度はちゃんと動いたり。気のせいだったのかと、キャッシュをクリアして、テストするとやっぱり動かない。でも2回目は動く。必ず1回目は動かない。一旦、前のページに戻り、また戻ってくるとうまくいきます。

2回・3回繰り返し、うまく行ったり行かなかったりを繰り返す中で、訳が分からなくなり、しまいにはキャッシュをクリアするのを忘れているのに、間違った推論に基づくプログラム修正で、「うまく行った」「解決できた」と勘違いしたり、ユーザーの指摘でやっぱり修正されていないという繰り返しの日々を過ごしたことを覚えています。

Mac版ネットスケープ4.XでJavascriptが動かないサンプルコード
(※ ページの文字コードがEUC-JPの場合、テスト1からテスト4までの書き方では動きません。)
<a href="javascript:void(0)" onClick="alert('Hello');return false;">テスト1</a>

<a href="javascript:void(0)" onClick="windowOpen();return false;">テスト2</a>

<a href="#" onClick="alert('Hello');return false;">テスト3</a>

<a href="#" onClick="windowOpen();return false;">テスト4</a>

<a href="javascript:alert('Hello');">テスト5</a>

<a href="javascript:windowOpen();">テスト6</a>

  私は、会社勤めの際、この問題に非常に悩まされました。結局、独立して、Macを自宅に購入して、ちゃんとテストできる環境を整えるまでは、原因が分かりませんでした。

その原因を探るために、具体例を出します。冒頭にも書きましたが、これはShift_JIS以外の文字コードで作成している場合にのみ起きます。Shift_JISで作成している場合は、何の問題もありません。

左のテスト例で、Mac版ネットスケープ4.Xで、EUC-JPで作成されているページにアクセスした際に動かないのは、テスト1からテスト4の下記方の場合です。テスト5及び6は動きます。


アンカータグで開くウインドウサイズを開く際には通常、「テスト2」もしくは「テスト4」の書き方をするのがセオリーです。しかし、これでは、Mac版ネットスケープ4.7の場合、動きません。くどいですが、EUC-JPで作成している場合です。

Mac版ネスケ4.7の場合、テスト1及びテスト2のリンクをクリックすると、ブラウザのアドレス欄が「Javascript:void(0)」に変わってしまいます。onClickイベントが発生していないのか、無視されるのか、とにかく「hello」とalertが表示されたり、「window.open」されることはありません。一旦、ブラウザの戻るボタンで前のページに戻り、再びブラウザの「次へ」ボタンで戻ってくるとイベントが発生します。そのため、気のせいだったのかと思いがちです。

さらに、<input type=button onClick="alert('hello');return false;" value="テスト">であれば、一発目のロード時にも動くので、なおさら気のせいのように思います。読み込みのタイミングの関係か何かで、たまたま動かなかったのだろうと思ってしまうのです。

対策としては、テスト5やテスト6の書き方であれば動きます。ただし、このようにアンカータグのhrefに直接Javascriptを書くと、ブラウザのURL欄に「Javascript:windowOpen();」などとそのまま表示されるため美しくないと言えば美しくありません。

そこで、他の対策としては、Mac版ネスケ4.Xに文字コードはEUC-JPですということをはっきり分からせればいいことになります。これまで何度か説明しましたが、メタタグでは不十分です。.htaccessを利用して、WEBサーバ側でEUC-JPであることを知らせます。

AddType "text/html; charset=EUC-JP" html

のようにします。これで文字化けが解消します。

(なお、ご利用になられているホームページサービスによっては、.htaccessを許可していない場合もあります。その場合は.htaccessが利用可能なレンタルサーバを借りなければいけないかもしれません。.htaccessが利用可能なサーバはこちらを参照してください。)

もちろん、単なるHTMLファイルで無いならば、perlやPHPなどでHTTPヘッダーを出力することでも解消が可能です。具体的な指定方法は、第4章の「メタタグの有効性」を参照してください。

また、アンカータグだけでなく、外部ファイル(JSファイル)の読み込みも、ページの本体がEUC-JPの場合、最初のロード時には失敗するようです。詳しくは、「JSファイル内でdocument.writeしたら文字化けする事例(Macネスケ4.7編)」の章をご参照ください。

この問題は文字化けには関係ありませんが、文字コードがプログラムに影響する例としてご紹介しました。もう一つ、文字コードがプログラムに与える影響を示す例を挙げてみます。やはり、ネットスケープ4.Xについてですが、今度はWindows版がその対象になります。特定の条件下でブラウザからのファイルのアップロードに失敗する例です。