Debug- Official Website -


犬土偶日記

海の近くに住みたい

Debug日記の使い方

話題:Webプログラミングとか

2004年02月15日

極悪な風邪とJavaScript

公開日時: 不明

昼まで爆睡・・・と思ったら夜まで爆睡。ていうかダウンした。風邪っぽい。もしかしたらCHOSANGもやられたという、最近流行りのインフルエンザか?と怯えてみたが、今のところ高熱が出たりする気配はないのでただの風邪だろう。そうであって欲しい。起きた時に猛烈に眩暈がした。この日記に書いたことあるような気もするが無いような気もするので書こうと思う。以前、何が原因かわからんが突然フルパワーの眩暈に襲われて毎日何度か倒れそうになるという事態が発生した。遊園地のコーヒーカップで最強に目が回ったような状態に突然なるので高確率で立っていられなくなる。同じような文章を書いた記憶があるから以前にも書いたかもしれない。でも登山日記の方に書いたのかもしれないし自分のサイトの掲示板に書いたのかもしれないので、ここにも書いた保証はない。かと言って確認する気も起きないのでまた書いている。とにかくしばらくしたら治ったので安心してたんだが、何故か今日突然再発した。いつ来るかわからんから怖い。階段を下りてる最中に来ると死ぬかもしれないし、原付の運転中に来れば高確率で死ぬだろう。また完治するまでしばらく強制的なヒキコモリ生活か。鬱陶しいな。早く名港水族館にシャチを見に行きたいのに。眩暈はともかく、起きた時、妙にだるかった。喉が痛かった。これはちょっとヤバイなと思った。毎日家に篭っててしかも起きてる時間がズレてるせいで家族すらほとんど交流がないような状態で何故突然風邪に感染するのか。どう考えても週末に行ったパチ屋で移されたとしか思えん。あのアホどもめ!風邪ひいてまでパチンコが打ちたいのか!死ね!もう許さん!あんな地獄を味わわされた上に風邪まで移されて大人しくしてるわけにはいかん。毎日パチ屋に通って朝から晩まで菌をバラ撒き続けてやる。奴らに復讐だ。ゴミどもめ!全員死ね!

バンドのサイト作りがまたしても泥沼にハマってきた。もうこれで決まり!って感じで一度は固定されたはずなのだが、ちょっとこれもやってみようかな〜とか思って新たにJavaScriptを書き始めたのが間違いだった。自身満々に書いてIEで表示したらバッチリOK!当たり前だ!俺がミスるはずがない!!と思い、念のためNetscapeとOperaで表示してみたら凄惨な状態になっていた。何をやったのかというと、TABLE(表)のTR(行)のスタイルを最初はdisplay:none;で非表示にしておいて、他の場所でonmouseoverのイベント発生時にその行を表示するという単純なもの。displayの初期値はinline(CSS1ではblock)なので、イベント時にJavaScriptのDOM参照でその要素のスタイルをnoneからinlineに、という発想だった。別におかしくないだろ?でもNetscapeとOperaではぐちゃぐちゃになった。blockにしてみても酷い。1行のはずなのに2つ以上の行が無理矢理1行に押し込まれてたり、CELLSPACING(セルの隙間)の値を無視してmarginやpaddingの値が変な風に表示されてるような感じ。これはダメだ!と思い、TRのdisplayではなく、TD(セル)のdisplayを弄ることにしたが結果は同じ。行をグループ化してTBODYのdisplayを弄ることにしたがこれもダメ。JavaScriptの部分はどう考えても間違えてない。見た目があれだけ変わるということはCSSの部分がおかしいに違いない。TBODYでやった時、IEでは普通だったが、OperaではCELLSPACINGとmargin-rightがデカくなっておかしい。Netscapeでは基本的にOperaと同じだが、表示と非表示を繰り返すとそのブロックのHEIGHT(縦方向の長さ)分だけどんどん空行が追加されて長いTABLEになってしまう。どうしたもんか、あれこれ考えまくったのだが、今までどうせ無駄と思って避けてたのをダメモトでやってみた。displayの値でTABLE関連の値がいくつかCSS2では規格されているんだが、IEでは全くサポートしていない。NetscapeやOperaでは一部対応しているらしい。その値を指定してやったらどうなるだろう。うまくいけばIEでは未知の値だからと無視して勝手にinlineとして処理してくれないだろうか。そう考えた。ためしにTBODY(グループ化した行)のIDをJavaScriptで参照してdisplayプロパティをnoneからtable-row-groupに書き換えることにした。そしてIEで表示。特定の場所にonmouseover・・・の瞬間、スクリプトエラーが通知された。プロパティを取得できませんでしただと。アホか!死ね!で、とりあえずNetscapeとOperaで表示してみた。こっちは完璧に俺の期待した通りの動作になって感動。でもIEで動かないんじゃ全く話にならん。世の中の9割の人はIEを使ってるらしいからな。そうなればJavaScriptのブラウザ判別という常套手段を使って条件分岐するしかない。IEならdisplay:inline;にして、それ以外ならdisplay:table-row-group;にする。JavaScriptでブラウザ判別する場合、ブラウザが申告するUSER AGENT名で判別することもできるが、詐称可能なので正確に判定することができない。だから一般的にDHTMLでのブラウザ判定には特定のオブジェクトやメソッドが使用可能かどうかで判断する。そうすれば未対応ブラウザ用の処理と対応してるブラウザの処理を分ける事ができるからだ。で、一般的にIE4以上かNNかを判別する時にdocument.allというオブジェクトを参照する。これはIE独自拡張なので、これが有効ならIE4以上、無効ならそれ以外ということになる。当然これで試した。if(document.all){IE時の処理;}else{それ以外の時の処理;}こんな感じで至極簡単に条件分岐できる。で、実際にやってみたら、IEでは当然OK、そしてNetscapeでもOK、この調子なら全部OKか!?と思ったらOperaで引っ掛かりやがった。display:inline;の時と同じグチャグチャな表示。どう考えてもIE独自のdocument.allをOperaが勝手に善意で解釈してるとしか思えん。余計な事を・・・。そうなると大変だ。100%絶対にIEでしか解釈しないオブジェクトやメソッドを探して条件に組み込まねばならん。Googleで「IE独自拡張 メソッド オブジェクト」とかで検索しまくりだが、どこ見てもIEとネスケについてしか書いてなくてdocument.allはIE専用って書いてある。Operaでも動作するぞゴルァ!document.all.innerHTMLでやったらどうかと思ってやってみた。自信のほどは80%ってとこか。これもIE独自拡張のやつだ。こんなのはOperaでも対応してねぇだろ・・・と思った。確かにOperaでは対応してなくてdisplay:table-row-group;の処理をしてくれた。しかし今度はNetscapeがダメだった。innerHTMLを解釈するなんてことは流石に無かったんだが、何故かスクリプトが実行されない。document.all.innerHTMLが使えるならこの処理、使えないならこの処理、っていう2択の条件分岐なのに両方とも実行されねぇ。何故だ。Netscapeはどういう状態にあるんだ・・・。innerHTMLを実装してるわけではないが、してないわけでもないっていう状態?もう意味わからん。殺すぞボケ!!で、片っ端から色んなIE独自拡張を試したのです。そしてついに発見!document.charsetというドキュメントの文字コードセットのオブジェクト。これがIE4独自拡張で少なくともNetscape7.1、Opera7.23まででは未対応。これで条件分岐すればIE、Netscape、Operaで期待通りに動作させることができる。長かった。なんでこんなくだらないことで悩みまくってたんだろう。ちなみにHTML内の特定のタグを参照するDOM1に対応してないブラウザ(NN4系?、Opera5以前、IE4以前)では初っ端の処理で弾くから全く実行されません。エラーも出ない。見た目上は何もないのと同じに処理されますです。別に問題はないけどな。動く奴だけの特典さ。代替文書を用意する必要も無い装飾的なもの。ただ、display:none;を処理できないブラウザだと最初は隠れてるはずのものが最初から表示されてたりして・・・。そうなると消すためのリンクのJavaScriptが実行できない。つまり全く動かないリンクが出てきてしまうという可能性もあるにはある。NN4とIE3で問題ありそう。でも今時そんな古いの使ってる人いるのかな。自分のサイトの掲示板のアクセスログ見ても4年間ぐらいで数えるほどしか来てないしな。でもまぁUSER AGENTは偽装可能だから何とも言えんが。しかし字が読めないとか、特定のコンテンツにアクセスできないとか、そういう致命的な不具合は無いはずだよ。まぁそんな感じで。もうハマるのはイヤだからこれ以上は弄らない。あとは問い合わせフォームとかサイトマップのページを作って完成かな。またフォームとかでハマりそうだな。そっちはCGI使うからな。今度はPerlとCGIの地獄が待ってたりして。笑い事じゃねぇよ。

◇犬土偶 Selection #025
ROSIER / LUNA SEA
3rd Single「ROSIER」
4th Album「MOTHER」
Best Album「SINGLES」disc1
Best Album「NEVER SOLD OUT」disc1
Best Album「PERIOD」収録

LUNA SEAは解散直前にライブに行った。なんと昨日の日記に書いたSADSライブの前日に。2日連続だよ。アホだね。LUNA SEAのライブは今まで行ったライブの中で一番音がデカかった。マシンガンズよりも音量キツかった。バスドラとかベースとかが腹に響き過ぎてヤバかった。軽く殴られてる感じ。耳もやられてしばらく耳鳴りが治らなかった。翌日のSADSも音デカかったからな。1週間ぐらい治らなかったよ。それにしても俺って色んなライブ行きまくってるな。数えたら56公演も行ってるよ。初めて行ったのはジュンスカ。一番最近行ったのは松浦亜弥。オススメはB'z、SURFACE、藤本美貴、徳永英明、MISIA、河村隆一、T.M.Revolution。やめといた方が無難なのはHello!Project。人気の割に意外とライブは期待はずれ(だと俺が思った)のは、浜崎あゆみ、ミスチル、安室奈美恵。話が少し逸れたが、LUNA SEAのライブはなかなか良かった。ROSIERはアンコール前に激しく盛り上がる辺りで出てきた。解散寸前ってこともあって激しくコスプレしたヤバそうなお姉さん達が暴れていた。LUNA SEAまた行きてぇな〜と思うけどもう行けんな。

話題:Webプログラミングとか

Info.
公開日時不明
本文文字数4674文字 (タグ込み)
URLhttps://orca.xii.jp/debug/diary/diary.cgi?id=dogoo;date=20040215
RSS1.0https://orca.xii.jp/info/diary-dogoo.rdf
Comments

コメントはありません。

コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しDebugger」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。