2009-09-22 32 views

答えて

35

見つかると予想されるプロパティとメソッドについて、おそらく「不明な」オブジェクトを調べることは、かなり良い習慣です。

だから、には、イベントオブジェクトがあり、それに触れる前にそれを調べることができます。たとえば、

if (event.target) 
{ 
    //looks like we're an event, hide the target 
    var e=$(event.target); 
    e.hide(); 
} 

それは、私はあなたがそのイベントかどうかを確認するために「ターゲット」のテストを示唆しているじゃないことに注意することが重要です:あなたがそのプロパティを使用しようとしているので、あなたがターゲットのためにテストしています。私が目指しているのは、オブジェクトがイベントであるかどうかを調べる代わりに、オブジェクトが期待どおりに動作するかどうかを調べ、その動作を使用することです。

このようなコードは、サポートが異なるブラウザで正常に機能しなくなるか、ブラウザ固有の拡張機能を利用するようにしてください。

if (event.initKeyEvent) 
{ 
    //gecko 1.9+ 
    event.initKeyEvent(...) 
} 
+2

この例でも、ターゲットではなくsrcElementプロパティを持つIEでイベントの例は機能しません。 –

+3

あなたは誤解しています - あなたがそのプロパティを使用しようとしているため、ターゲットであるかどうかを確認するために 'ターゲット'をテストしていません。 私が主張しているのは、オブジェクトがイベントかどうかを調べる代わりに、オブジェクトを調べて期待通りに動作するかどうかを確認し、その動作を使用することです。 –

+0

十分に公正。私はそれが本当に元の質問に答えているとは思わないが、なぜオブジェクトがとにかくイベントであるかをテストする必要があるのか​​分からない。 –

0

これを行うには確実な方法があるかどうかわかりませんが、あなたのベストショットはダックタイピングです。

とにかく、状況に応じて、指定されたオブジェクトが使用する予定のプロパティを持っているかどうかを確認することができます。ちょうどPaulが指摘しています。

3

このisEvent機能は、未知のオブジェクトのコンストラクタをチェックする文字列に変換した後、知られているイベントタイプのためにすることを検索します。

function isEvent(o){ 
    //grab the constructor for the unknown object 
    var c=o.constructor; 
    //convert constructor to string 
    var s=c.toString(); 
    /* declare IE RegExp pattern to match for 'object [Event]' */ 
    if(document.all){ 
     //set regExp pattern for IE 
     var ptr=/\[object Event\]/;  
    }else{ 
     /* declare FIREFOX regExp pattern to match for 'object [*Event]' since it has 
      several event types: 
     UIEvent 
     KeyboardEvent 
     MouseEvent 
     FocusEvent 
     WheelEvent 
     CompositionEvent 
     StorageEvent 
     CustomEvent (Requires Gecko 6.0) 
     MutationEvent 

     Both Custom and Mutation events are not recognized prior to Gecko 6.0, 
     so if you want to use these, adjust regExp accordingly */ 
     var ptr=/\[object (Keyboard|Mouse|Focus|Wheel|Composition|Storage)Event\]/; 
    } 
return ptr.test(s); } 
0

私は同じ懸念を持っています。だから私は証明するために出発し、私は解決策に近づきました。

function isEvent(a){ 
    var txt, es=false; 
    txt = Object.prototype.toString.call(a).split('').reverse().join(''); 
    es = (txt.indexOf("]tnevE") == 0)? true: false; // Firefox, Opera, Safari, Chrome 
    if(!es){ 
     txt = a.constructor.toString().split('').reverse().join(''); 
     es = (txt.indexOf("]tnevE") == 0)? true: false; // MSIE 
    } 
    return es; 
} 

IはG.Chrome 19とWinXPの にMSIE 8

  • ワインのUbuntuのSafari 5.0
  • のUbuntu 11.64で

    • FFとオペラ12.0でこの機能をテスト

      こちらがお役に立てば幸いです。

    2

    古い質問が、どうやらこれによると、event.typeはクロスブラウザです:

    http://www.quirksmode.org/js/events_properties.html

    RameshVelは彼の答えに編集でこれを追加それは重くダウンに選ばれました。

    もちろん、最も安全な方法は、受け入れられた回答のガイダンスに従うことですが、イベントであればそのオブジェクトを破棄したいと思っていました。

    17

    instanceofはどうですか?限り、イベントオブジェクトは、例えば、コンストラクタnew Event()を使用して作成されたとおり

    イベントハンドラでイベント・パラメータの場合
    var e = new Event('click'); 
    e instanceof Event; // true 
    

    、その型がオブジェクトであるが、それはプロパティとしてネイティブイベントが含まれ、したがって、これを代わりに使用することができる:ここ

    function myEventHandler(e) { 
        e.originalEvent instanceof Event; //true 
    } 
    

    実際の値は、イベントがタッチイベントである特別な場合、ブラウザに依存して変化内hereおよび参考文献を参照することができることに留意すべきです。私の場合は問題ではありません。

    3

    オブジェクトにプロパティoriginalEventがあるかどうかを確認できます。

    event.hasOwnProperty('originalEvent') 
    

    例えば:

    // var event 
    var 
        isObject = typeof event ==='object', // is the given argument an object 
        isEvent = isObject ? event.hasOwnProperty('originalEvent') : false; 
    if(isEvent) { 
        // var `event` is an event! 
    } else { 
        // var event is NOT an event! 
    } 
    
    関連する問題