Error Workarounds//エラー回避


は涙の数だけ人にやさしくなれると言ったのは確か武田てつやだったと思うけど、プログラムもエラー出した数だけ人にやさしいものが書けるようになるってことはあるわけです。で、エラーがでなくなるまでがんばってやっと完成版が人様の手にとどくというのが普通のプログラムですね。
 でも、
いきなり人様の手にとどいてしまうホームページ作るのにそんな悠長なこと言ってたらJavaScriptは一生書けないかもしれません。だって、ブラウザ自体がバグだらけで改良?につぐ改良?を重ね続けているのですから。完成などいつのことかわかりません。今は、世の中に与えられている条件の中でベストを尽くすしかないのです(ま、今の時代に限らないけど)。
 ただ、
やっぱり、エラー出したら人の迷惑だよね。ということで、err回避策をリストアップしていくことにしました。作ってしばらくたつと結構忘れてしまうんで便利かも。おいおい追加していきたいと思います。
 もし、
もっといい回避策とかあったら是非教えてください(^^)/。あ〜window関係のerr回避もあったっけ...
p.s.エラーについてもやはり古旗さんのページがNO1っ!です。


10●.jsファイル内のfunction
杉田さんに教えてもらった(^^)、もしかすると裏技?かもしれないerr回避です。.jsファイルは大変便利で私も多用しはじめていますが、Netscape2.0x及びExplorer3.0では、 その.jsファイルの中のファンクションをHTML内に書くと.js内から呼び出すことが出来なくてエラーが出てしまいます。で、このエラーを出なくする対策のひとつです。こまめにバージョンチェックするより簡単な方法ですね。

<script language="javascript" src="test.js">
function test(){} //.jsファイルの中にも同じファンクションあり
</script>

くわしくは、杉田さんのページをみてください(^^)/

9●Netscape4.0b1でimages[index番号]がおかしい
*****このバグは4.0b2では直っています(^^)***** //これはMacとUNIX版4.0b1が出そろうまでの暫定回避処理です。

12.21に出たWin版4.0b1ですが、document.images配列の[0]がなくて[1]からはじまってしまっているようです。その結果、今まで通りimagesの[0]に何かしようとするとerrがでたり画像が1つずれて表示されてしまったりということになるそうです(なにしろMacではまだ4.0b1がでていないのでメールで知った話です^^;;)。
そこで、これを下記8●イメージ配列についてのimages.lengthカウントと組み合わせて回避してみました。

//document.write('')などの画像構築の直前で....

il=document.images.length;//ここまでの画像枚数を調べる。 if(navigator.appVersion.charAt(0)==4){il=il+1}
//バージョンが4ならilに1を加える。4以外はそのまま。

こうしておいて、

document.images[il+画像構築後何枚目かを表わす数字].src= 画像.gifなど

というわけです。

この回避方法の確認にはmassageボ〜ド上で森山さんと杉田さんのご協力を頂きました(_ _)。

8●イメージ配列について
Imageオブジェクトを扱う時にdocument.images[index番号]の表記方法は便利なものですが、Scriptの用途によっては注意が必要です。2度と変更しないページならいいんですが、たとえば、後になって新しい画像をそのページに追加しようとすると、追加する画像の場所によっては[index番号]が全部変わってしまってall書き換え(;_;)なんてことになったりします。将来、IEがIMGを扱えるようになったときに、[index番号]のふり方がNetscapeと同じ(読み込み順)ではない可能性も高いので、なるべく 画像名 でScriptを記述しておいたほうが良いかもしれません。と、思いつつ、昨日また失敗してしまったので自戒の意味を込めてここに書いときます。特に汎用性の高い.js外部スクリプトの中では注意しましょう。....(_ _b。と、書きながら気がついた(^^;;んですが、 IMGを構築する直前でIMGlength=document.images.lengthをカウントしておいて、images[IMGlength+xx]としてやればok かも(^^)/。p.s.一応、クリスマスツリーと牛パズルはokでした。

7●指定したサブウィンドウが閉じている時
サブウィンドウを開いた後、意図せずcloseしてしまうことがあります。そんな時にScript中のサブウィンドウへの命令を実行すると、当然、「サブウィンドウがないのに〜(~~;」ということでエラーとなります。これを回避するには、

たとえば、
takuw1 = window.open('','w1','toolbar=0,loction=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=137,height=250')
こういうサブウィンドウだとすると....

function wfl(takuwin){
fl=takuwin.name+''; return fl
}
ウィンドウ名を返すファンクションを作っておくなどして...

if(wfl(takuw1)=='w1'){
//サブウィンドウ'w1'が開いている時だけすること
}

のようにすれば(^^)/okです。けど、自分のページでやってない^^;。

以上はNN2.0までの方法ですが、
NN3.0からはwindowが閉じているかどうかを返すclosedというプロパティが
追加されており、if(win1.closed){命令1}else{命令2}だけで分岐ができます。

例: 

<SCRIPT>

var win1=window.open('','','width=150,height=200')
win1.document.write("closedのテスト<BR>")

  function test(){
   if(win1.closed){alert('閉じてるよ')}else{alert('開いてるよ')}
   }
 
</SCRIPT>

<FORM>
  <INPUT TYPE="button" VALUE=" 押す "
    onClick="test()">
</FORM>

クリックしたときにwindowが開いていると'開いてるよ'、閉じていると'閉じてるよ'
のダイアログが出ます。
Example: 

6●MacのbgColorバグ回避
NetscapeのMac版には3.0b5以前のものにbgColorのバグがあります。これはScriptでbgColor="xxxxxx"と指定してやると背景色で全部塗りつぶされて何もみえなくなる(^^;というものです。これを、scrollなどで回避できればまあスマートな方だと思うのですが、なにしろ2.xにもバグがありますからscrollは使えません。そこで、かなり力業ですが、大きなwindowをopenしてすぐcloseする(笑)という方法を試して見ました。3.0b6以降はokなので、それ以前を分岐しています。(それにしても強引だなこりゃ^^;。スマートな方法募集中^^)/
//たとえば背景を赤にしたあと.....
document.bgColor='red'

bwrch=navigator.appVersion.charAt(0)
bwrch4=navigator.appVersion.charAt(4)
bwr=navigator.appVersion
if ((bwrch4!='b'||bwrch<=2||bwrch4=='1'||
bwrch4=='2'||bwrch4=='3'||bwrch4=='4'||
bwrch4=='5')&&bwr.indexOf('Mac')!=-1){
nwin =window.open
("","",'width=800,height=800');
nwin.window.close();}

こうすると、一応なんとかなります(^^;。どうしても、bgColorを使わなきゃならない時のおまじないとしてコピーしてご利用ください。

5●JavaScriptのエラーメッセージをoffにする
どうして、JavaScriptはエラーメッセージを見えないようにできないんだろう?と疑問だったのですが、NS3.xからこの機能が追加されました。
window.onerror=nullというのをスクリプトの最初に入れるだけでokです。

<SCRIPT LANGUAGE="JavaScript">
<!--
window.onerror=null
<!-->
</SCRIPT>
もちろん、エラーメッセージが出ないからといってもエラーがあればスクリプトは機能しません。あの目障りなエラーダイアログをせっかくページを見てくれている人の目にふれないようにしてくれると言うだけです。エラーメッセージが出なくたって、フリーズしたりクラッシュしたりはするわけです。
それに、NS2.xでは当然使えませんし、IE3.0もたぶんだめでしょう。更に、当然のことながら、対象はJavaScriptのエラーだけでそれ以外のエラー、たとえばwindow.location.href="うその.html"とかやった時にでてくるエラーなどは止められません。
やはり、正しく書くというのが原則です。<人のことがいえるかっ^^;
でも、最善を期すためにこれからは必ず入れとくべきでしょう。でも、ホントはデフォルトをonerror=nullにしておくべきじゃないのかなぁ。ユーザーの99%はプログラマーじゃないんだから。>Netscapeさん。
このスクリプト自体はNS3.xの機能ですが分岐しなくてもNS2.xでエラーは出ませんでした。IEはわかりません。

4●カレントフレーム
カレントフレームがparent.frames[0]の時にたとえばparent.frames[0].document.write('どかんがどかん')などと記述するとparent is not defined.というエラーがでます。普通はただdocument.write('どかんがどかん')と書いてやれば問題ないんですが、複数のフレームに同じページを使い回してフレーム間でやりとりする時など(サンプル)はこんな記述が必要になる場合もあるわけです。あまり無いかな^^;。で、そんな時、

if(parent.frames[0].name==self.frames.name)
{
//カレントフレームがparent.frames[0]の時の処理
//たとえば、alert('ここは通れません')など
}
else
{
//parent.frames[0]に行う処理
//たとえばparent.frames[0].document.write('どかんがどかん')
}
とすれば、このエラーは出なくなります(^^)/。ちょっと、マイナーだったかな^^;。

3●NS3.x分岐
NS3.xから、かなりの数の命令が追補されています。たとえばImageオブシェクトなども魅力的でこれからおそらくポピュラーになっていくと思われる機能ですが、むきだしで記述すると、IEだけでなくNS2.xでもエラーがでます。NS3.x用の命令を使うときはかならず

if (navigator.appVersion.charAt(0)>=3)
{
//NS3.x用の命令文
}
などでくくってやることが必要だと思います。

2●IE分岐
IE3.0のJavaScriptはNetscape2.0に互換のはずなのですが、現状ではまだ残念ながら不完全といわざるを得ません。その結果、これまで正常に機能していたページに入ってもエラーの嵐を巻き起こし、様々なScriptを機能停止に陥らせています。
IE3.0のシェアは今のところ微々たるものに過ぎませんが、せっかく訪れてくれる訪問者のことを思うとScriptを作る際に厳密に分岐する方法も考慮しておく必要があるかもしれません (めんどくさいけど)。
次のScriptは[JavaHouse:4394](井関さんwrote:)からの引用+改編です。

if (navigator.appName=="Microsoft Internet Explorer")
{

//IEでやること。たとえば、
document.write("このページはNetscape2.x以上でご覧ください。
")
document.write("(IE3.0では安全のためScriptが動作しないように設定してあります。)")

}
else
{

//NSでやること。

}
1●未入力.空白入力対策
数値入力フォームで間違えて未入力や空白を入力したままonClickなどをすると通常のScriptならエラーがでます。慣れたオペレーター以外の人を入力者と想定するなら、このエラーダイアログは回避したほうが無難でしょう。*このほかprompt()の未入力でもerrが出ます。
たとえば計算書などのフォーム入力時に次のようにすると
<FORM> <INPUT TYPE="text" NAME="a">空白か未入力でクリック。 <INPUT TYPE="button" VALUE="計算" onClick="form.b.value=Math.abs(form.a.value)">errが出るよ^^; <INPUT TYPE="text" NAME="b">ここにMath.abs()絶対値が出るよ。 <INPUT TYPE="reset"></FORM>
以下のフォームができあがります。
空白か未入力でクリック。
errが出るよ^^;
ここにMath.abs()絶対値が出るよ。

このフォームに未入力のままクリックするとNS3.xは大丈夫ですがNS2.xではis not a numeric literalのerrが出ます。
空白や文字を入れてクリックするとNS3.xも2.xも共に"文字"is not a numeric literalとなります。
これを回避するにはisNaN(v)関数(vが数値でなければtrue、数値ならfalseを返す)を使いたいところですが、今のところこれはUNIXでしか使えません。
そこで、文字の誤入力判定はちょっと置いといて^^;、次のようにして未入力や空白の入力によるエラーは多少^^;回避できます。(!=NULLを使う場合もあります。) <INPUT TYPE="button" VALUE="計算" onClick="if(form.a.value!=''&&form.a.value!=' '&&form.a.value!=' ')form.b.value=Math.abs(form.a.value)">
errはでないはず? (^^; です。

JvaScriptExampls

Maintained by
tato@fureai.or.jp works1996takahashi factory
BR> BR> BR>