Firefoxでのwindow.event

category-icon

 ワールドカップの準決勝ポルトガル-フランスのせいで寝むれないmartinです。

以前のエントリで「Firefoxでの擬似window.eventLink 」として、

function windowEvent(){
 if(window.event) return window.event;
 var caller = arguments.callee.caller;
 while(caller){
  var ob = caller.arguments[0];
  if(ob && ob.constructor == MouseEvent) return ob;
  caller = caller.caller;
 }
 return null;
}

というのを載せていましたが、どうせなら、Firefox(および、その他のモダンなブラウザ)にも、window.eventを認識させたいです。window.eventは使い勝手が良いので。で、このwindow.eventを簡単に認識させる方法があったので、今はこれを使っています。もともとのソースは、JavaScript使いなら誰でも知っている、昔からの有名サイトWebFXLink 内にある「Classic Event Handlers - IE EmuLink 」で紹介してあった方法です。リンク先を見れば分かりますが、これ以上ないくらいシンプルでスマートなやり方ですねぇ。最初は、__defineGetter__あたりを使ってエミュレートしようとしていたのですが。いやはや。

 js/lib.jsでは、次のようにしています。

if(w3c){ // IE以外のモダンなブラウザなら.
 (function(){
  for (var property in Event.prototype){
   if(property.match(/MOUSE|CLICK/)){
    window.addEventListener(property.toLowerCase(), function(e){
     window.event = e;
    }, true);
   }
  }
 }());
};

 イベントリスナーに逐一マウスイベントを列挙して登録しても良いのですが、Eventオブジェクトにある組み込み定数を利用してみました。マウスイベントを列挙するなら、次のような感じになると思います。

if(w3c){ // IE以外のモダンなブラウザなら.
 (function(){
  var events = ["mousedown", "mouseover", "mouseout", "mousemove",
                "mousedrag", "click", "dblclick"];  
  for (var i = 0; i < events.length; i++){
   window.addEventListener(events[i], function(e){
    window.event = e;
   }, true);
  }
 }());
};

 まぁ、こちらの方が記述も短めでオーソドックスなやり方ですが、イベントを列挙するのがメンドかったので、別のアプローチを取ってみました。お好きな方でよいと思います。

 こうすると何が嬉しいかって、例えば、次のようなスクリプトにおいて、

document.onclick = function(e){
 alert("Event X:"+e.clientX + ", Event Y:"+e.clientY);
}

この引数のeは、Mozilla系のブラウザでは必須のもので省略は出来ません。こういうシンプルな例ならいいのですが、引数がいくつかあるような関数で、いちいちこのeを付けて回るのはメンドいものです。こういうときに、上記のエミュレーションを用いれば、

document.onclick = function(){ //eが不要
 alert("Event X:"+event.clientX+", Event Y:"+event.clientY);
}

みたいに書けるわけです

   

— posted by martin at 05:34 am   commentComment [1]  pingTrackBack [1]

この記事に対するコメント・トラックバック [2件]

scrollUp1. PukiWiki (PukiWiki/TrackBack 0.3) Website — 2006/07/14@13:31:06

VNの構成 (smatsumoto) 注意点 概要 構成 多言語化対応 冗長化 更新履歴 Visual Nexus 3.0-3 Visual Nexus 3.2 注意点 † 一覧を JavaScript で作成している時、値に ',",¥ 等が入っているとエラーになる AJAX で JavaScript の...
続き »

2. じょにい — 2015/11/06@14:39:22

参考にさせて頂きました。

当方では利用するイベントの種類が多く、精査するのが面倒だったので、window.eventにgetterを定義する方針を採りました。
イベントの種類は__proto__のコンストラクタをチェックする事で解決してみました。

参考にさせて頂いたお礼までに、ソース貼らせて頂きます。
邪魔なようならば削除して下さいませ。

if( ! window.event ){
var isEvent = function( targ ){
for( var wk = targ ; wk != Object ; wk = wk.__proto__ ){
if( wk.constructor == Event )return true;
};
return false;
};
Object.defineProperty(
window,"event",{ get : function(){
var caller = arguments.callee.caller;
while(caller){
var ob = caller.arguments[0];
if(ob && isEvent( ob )) return ob;
caller = caller.caller;
};
return null;
},set : function( ){ },enumerable : true,configurable : true} );
};

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~

     
T: Y: ALL: Online:
Created in 0.0042 sec.
prev
2024.3
next
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31