JavaScriptオブジェクトがイベントであるかどうかを判断する最も安全な方法は何ですか?
おそらく「不明」なオブジェクトを調べて、期待するプロパティとメソッドを探すことは、かなり良い習慣です。
したがって、haveがイベントオブジェクトを取得し、アクションを実行する前にそれを調査するとします。
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(...)
}
instanceof
を使用するのはどうですか?イベントオブジェクトがコンストラクタnew Event()
を使用して作成されている限り、たとえば:
var e = new Event('click');
e instanceof Event; // true
イベントハンドラーのイベントパラメーターの場合、その型はObjectですが、プロパティとしてネイティブイベントが含まれているため、これを代わりに使用できます。
function myEventHandler(e) {
e.originalEvent instanceof Event; //true
}
ここで、実際の値はブラウザーによって異なる場合があることに注意してください。特に、イベントがタッチイベントの場合は、 ここ とその中の参照を参照してください。私の場合は問題ありません。
オブジェクトにプロパティ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!
}
古い質問ですが、明らかにこれによると、event.type
はクロスブラウザです:
http://www.quirksmode.org/js/events_properties.html
RameshVelはこれを編集の中で彼の回答に追加しましたが、かなり反対票が投じられました。
もちろん、最も安全な方法は、受け入れられた回答のガイダンスに従うことですが、たまたま、それがイベントである場合はオブジェクトを破棄したいと思いました。
この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); }
それを確実に行う方法があるかどうかはわかりませんが、ベストショットはダックタイピングだと思います。
とにかく、状況に応じて、 Paul が指摘するように、特定のオブジェクトに使用したい期待されるプロパティがあるかどうかを確認できます。
私も同じ懸念を抱いています。それで私は証明に着手し、解決策に近づきました。
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;
}
私はこの機能をテストしました
これがお役に立てば幸いです。