ページの装飾に関するTips


・ステータス領域にメッセージを表示する

NN2Unknown NN3OK NN4OK MozillaOK IE3OK IE4OK

ステータス領域にメッセージといっても、 単に window.status に文字列を設定するだけが目的の項目です。

普通なら、これは Tips にはなりません。

然し、NN4.06/4.5PRx に関しては日本語が文字化けする問題があります。

これは、このバージョンから ECMA-262 対応のために内部コードが いわゆる UNICODE( ユニコードと読みます。ウニではありません f(^^; ) になったために発生した問題らしいのです。

もう少し突っ込んで言うと、内部コードが UNICODE になっただけなら問題が発生しないが、 HTML( FORMを含む ) や JavaScript で扱う文字列は従来通りらしいので、 普通に文字列を window.status に設定すると文字化けを起こします。 また、同時に ECMA-262 では escape 関数も UNICODEエンコード になっているのですが、 現在のところ従来通り URLエンコード のため、この手法も使用できません。

ってことで、以下に挙げる関数は日本語の文字列を NN4.06/4.5PR1/4.5PR2 でも ステータス領域に表示するための関数です( もちろん、他のバージョンでは従来通りです )。

<script language="JavaScript"><!--
// ステータス領域表示に問題があるかどうかのチェック関数
function isWindowStatusBug(){
  if(navigator.appName!='Netscape') return false;
  var apv=navigator.appVersion;
  var mnv=parseFloat(apv);
  if(mnv>4.05 && mnv<4.08) return true;
  return (mnv==4.5
      && (apv.charAt(3)=='b' || apv.indexOf('ja')==-1));
}
// ステータス領域に文字列を設定する関数
function setWindowStatus(s){
  var msg=''; // 設定する文字列
  if(isWindowStatusBug()){
    var sps=escape(s).split('%');
    for(var i=0; i<sps.length;i++){
      // status には %HH ではなく \u00HH を設定する
      if(i!=0) msg+='\\u00';
      msg+=sps[i];
    }
    msg=eval('"'+msg+'"');
  } else msg=s;
  window.status=msg;
  return true;
}
// --></script>
    :
<a href="xxxx.htm"
   onMouseOver="return setWindowStatus('トップページへ');
   onMouseOut ="return setWindowStatus('');">リンク</a>

この文字の部分は必要に応じて修正します。

通常は window.status = 'xxxx'; としていた部分を setWindowStatus('xxxx'); と 書き替えれば良いだけです。 f(^^;


使用例

ここにマウスを持ってくると ステータス領域に文字が表示され、離れると消えます。


注意事項

caution
厳密にどのバージョンが問題があるのかまでは調査していませんが、 このスクリプトは以下のバージョンに文字化け問題があると想定しています。


また、現在の仕様がどこまで維持されるかも定かではありませんので、 仕様が変更された場合には当然、再び対応する必要がでてきます。


ステータス領域の文字化けとは直接関係ありませんが、 補足として、 JavaScript1.4 の仕様( Core JavaScript Reference )では 「escape/unescape関数は ECMA の UNICODE は使用せず、 IETF のガイドラインにある 従来の URL エンコードを使用する」 と明言しています。

また、NN6( Mozilla )の仕様でも JavaScript エンジンでは ECMA の形式を採用していますが JavaScript から escape/unescape 関数を使用する際には window オブジェクトに 実装されている URL エンコードするものが呼び出されるようになっています。

私も、現状では(つまり、サーバ側の処理を考えると)escape/unescape 関数は ECMA-262 の仕様は間違いだと思います。もし、 UNICODE エンコーディングが必要なら 従来からある escape/unescape 関数ではなく、別の関数で対応すべきでしょう。

caution
このスクリプトは NN4.06,NN3.01,IE4.01sp1 ( Windows95版 )でのみ確認していますが、 それ以外の環境で動作は保証しません( 多分今まで以上に悪くなることはないと思いますが )。
caution
IE4.01 のステータス領域は極端に狭いので、 ステータス領域に文字などを表示するのはオススメしません。
因みに IE5.0 ではステータス領域は再び広がったようです。
いや〜めでたい。 ( 注 ステータス領域に文字が表示できるようになったことを喜んでるのではなく、 リンク先が見えるようになったことを喜んでるのです f(^^; )

Copyright(c) 1998 - 2001 ShinSoft. All rights reserved.