event handling って難しい

JavaScriptのイベントハンドラに頭を悩ます。。

を見てさらに突っ込んでみた。ここでは便宜的にイベントハンドリングには以下の3つの方法があるものとする。

  1. HTML attribute
    • <a> とか
  2. DOM event listener
    • obj.addEventListener(), obj.attachEvent()
  3. DOM 0 property
    • obj.onlick = func とか

これを上の優先順位で付加した。実際には DOM 0 property は try catch で event listener のセットに失敗したときだけ試すことにした。

結果、意外なことが分かった。

手元の環境では

  • DOM event が優先
    • Gecko ブラウザのみ
  • HTML attribute が優先
    • WinIE 6, Opera 9.23, Safari 1.3, iCab 3.03

合わせ技で、HTML attribute と DOM event listener の両方で return false した場合、

  1. HTML attribute
  2. DOM event listener
  3. 停止
    • WinIE は DOM event listener の return false で停止
    • Safari 1.3, Opera 9.23, iCab 3.03 は HTML attribute の return false で停止(つまり event listener だけで return false しても止まらないでページ遷移してしまう。)

という流れになる。

ちなみに Firefox で同じことをすると DOM event listener が先に実行されて、その return false で停止する。

ただなんか Safari はよく分からなくて、手元の Safari 1.3 では

  • a タグは DOM event listener が優先
  • form タグは HTML attribute が優先

てな動きに。なんだかよく分からん。本当に一貫してこの通りの動きになるのかは分かりません。

ちなみに、どのブラウザでも DOM 0 property にセットしたものは HTML attribute を上書きする形で動くらしく、この中での return false によってページ遷移を抑止することができた。逆に言うと、onsubmit で submit の無効化とかしたい場合は、現状では DOM event listener は役に立たず、DOM 0 property の方にセットしないとダメっぽいです。 DOM 0 property の方にセットして false を返すか、DOM event listener にセットして event オブジェクトを通じて動作の停止を行うかのいずれか。

複数のイベントハンドラをセットする必要が今のところ自分にはないのでこれ以上細かくは調べてないけど、ページ遷移抑止をしつつ複数のイベントハンドラを a や form で動かそうと思ったら、どうするのが正解なんでしょうな event オブジェクトをちゃんと使えってことですな。

[2007-09-15 追記]

分かりました。以下、「イベントハンドラ」は DOM event listener の意味で用います。

  • イベントハンドラの return を見てくれるのは IE だけ
  • イベントハンドラからページ遷移を抑止するためには event オブジェクトに対してそのように指示を出さないとダメ
    • 明示の方法は event モデルに従う
  • イベントハンドラは黙ってても「イベントオブジェクト」を受け取る
    • 仕様になってるわけじゃないけど、そういう実装になってる
  • attachEvent() で動作する IE, Opera, iCab は window.event オブジェクトをいきなり参照できる
  • addEventListener() で動作する Firefox, Safari は明示的にイベントハンドラの方で引数を指定しておいて event オブジェクトを受け取る
    • かと思いきや Safari はなぜかイベントハンドラ function で引数を明示しておかなくても `event' リテラルが「W3C モデルの event オブジェクト」を意味してまともに動いちゃう
    • しかも addEventListener() で第3引数を省いても動くなどいい具合にアバウト

すっげ。Safari すっげ。どういうことかというと、こんなんでも動くってことです。

obj.addEventListener( 'click', function() {
  alert( event.target );
} );

Firefox だと event なんてオブジェクトは function() 内に存在しないので動きません。ふーむ。

登場人物は Opera 9.23, iCab 3.03, Safari 1.3(一部2), Firefox 2.0.7, WinIE 6 とワタクシ wtnabe、special thanks to odz ! でお送りしました。

WEBrick メモ

WEBrick をあれこれ調べていてもたいした情報がなく、

こんくらいか。eto 方式が自分の好み。

proxy の話を除けばいちばん充実してるのはこっちかな?

Gnome's Guide to WEBrick

ところでどうでもいい話だけど、tokuhirom さんて今は全然モンキーレンチが似合うように見えないよね。何があったのだろう。もしや別人?

たださんによる iPod Touch レビューがありがたい

ただのにっき(2007-10-12)

実はネット端末として DS とどっちが上かに興味がある。ソフト的なテクノロジというよりは単純にいちばん気になるのは速度かな。DS おせぇ。

でも。えーとあの。クレードル? あれの操作性もなかなかよいと思うんだけど、その部分がどうなのかも気になるところか。誰か比較してる人いないかな…。

そうだ。イアホン部分を抜くと一時停止するっていうのは知らなかった。基本的にトランスミッタを使って車で聴くスタイル1なので、とっさに音を切りたけりゃ車のオーディオを切っちゃえばいいんで。

  1. しかも遠出のときだけ 

手っ取り早く bind を黙らせる

実は今まで放置してて syslog がやたらと bind のメッセージでにぎやかになっていた。

logging {
        category default {
                error;
        };
        channel error {
               file "/var/log/named-error.log";
               print-time yes;
               severity error;
        };
};

こんな感じ。ほんとに寡黙になると困るのでエラーは教えてくれと。ログファイルは named の owner で作っておけ。

channel でログファイル名とか syslog に吐くとか設定する。channel 名は自由。category 名は決まっているので man named.conf 参照。category の中で目的の channel を指定する。しかし bind の設定ファイルは各行も } も全部 ; が要るのでけっこううっとぉしいな。

グループウェア探訪から iCal(RFC2445)

日本語対応で日本のいわゆるオフィスで使いやすいグループウェアでフリーのものってないなぁ、というのが長いこと感じていることなのです。

海外製でフリーのものは案外あります。日本語でも使えるものもいくつかあります。でも仕様が大げさすぎたり、必要なアプリがやたら多かったりするものが多い。全体をつかみきれないし、カスタマイズっていうか機能の取捨選択するだけでしんどそうなのがいや。

そこで、とりあえずスケジュールと施設予約だけできればいいんだよなーと考えていたらこんなものを見つけた。

今までも実は iCal 対応っていうツールは見かけたことがあった。iCal ってあの iCal だろう?と思っていたらそうではなくて RFC2445 の iCal のことだったのね。

今のところ RFC の日本語訳はないけど、これはもっと広まるべきですな! 対応ツールが増えれば工夫の仕様も広がるってもんだ。

talby 発売決定

第3弾か? と思ったらモビルスーツ風味なのって au design project だったんだ。そうか、忘れてたよ。

ほしい気もするけど、落ち着いたら飽きるかもしれない微妙なところ。でもストレート端末がよくて長いこと昔の機種を使っているけど、そろそろ新しい機種にもしたいなぁなんていう自分のような人間には向いてるのかな。質感とか分かると嬉しいんだけど。

参考

About

例によって個人のなんちゃらです