Javascriptオブジェクトがイベントであるかどうかを判断する最も安全な方法は何ですか?Javascriptオブジェクトがイベントであるかどうかを判断する方法は?
答えて
見つかると予想されるプロパティとメソッドについて、おそらく「不明な」オブジェクトを調べることは、かなり良い習慣です。
だから、には、イベントオブジェクトがあり、それに触れる前にそれを調べることができます。たとえば、
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(...)
}
この例でも、ターゲットではなくsrcElementプロパティを持つIEでイベントの例は機能しません。 –
あなたは誤解しています - あなたがそのプロパティを使用しようとしているため、ターゲットであるかどうかを確認するために 'ターゲット'をテストしていません。 私が主張しているのは、オブジェクトがイベントかどうかを調べる代わりに、オブジェクトを調べて期待通りに動作するかどうかを確認し、その動作を使用することです。 –
十分に公正。私はそれが本当に元の質問に答えているとは思わないが、なぜオブジェクトがとにかくイベントであるかをテストする必要があるのか分からない。 –
これを行うには確実な方法があるかどうかわかりませんが、あなたのベストショットはダックタイピングです。
とにかく、状況に応じて、指定されたオブジェクトが使用する予定のプロパティを持っているかどうかを確認することができます。ちょうどPaulが指摘しています。
この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); }
私は同じ懸念を持っています。だから私は証明するために出発し、私は解決策に近づきました。
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
- FFとオペラ12.0でこの機能をテスト
こちらがお役に立てば幸いです。
古い質問が、どうやらこれによると、event.type
はクロスブラウザです:
http://www.quirksmode.org/js/events_properties.html
RameshVelは彼の答えに編集でこれを追加それは重くダウンに選ばれました。
もちろん、最も安全な方法は、受け入れられた回答のガイダンスに従うことですが、イベントであればそのオブジェクトを破棄したいと思っていました。
instanceof
はどうですか?限り、イベントオブジェクトは、例えば、コンストラクタnew Event()
を使用して作成されたとおり
var e = new Event('click');
e instanceof Event; // true
、その型がオブジェクトであるが、それはプロパティとしてネイティブイベントが含まれ、したがって、これを代わりに使用することができる:ここ
function myEventHandler(e) {
e.originalEvent instanceof Event; //true
}
実際の値は、イベントがタッチイベントである特別な場合、ブラウザに依存して変化内hereおよび参考文献を参照することができることに留意すべきです。私の場合は問題ではありません。
オブジェクトにプロパティ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!
}
- 1. ネイティブJavaScriptオブジェクトにプロパティ/メソッドがあるかどうかを判断する方法
- 2. varがjavascriptのelementFinderオブジェクトであるかどうかを判断する方法はありますか?
- 3. C++オブジェクトがtime_tであるかどうかを判断する方法
- 4. どのような種類のオブジェクトがイベントの送信者であるかを判断する方法は?
- 5. タイプがコレクションのタイプであるかどうかを判断する方法は?
- 6. ZonedDateTimeが「今日」であるかどうかを判断する方法は?
- 7. バックエンドデータベースがHANA DBであるかどうかを判断する方法は?
- 8. 子が無しであるかどうかを判断する方法
- 9. XMLが整形式であるかどうかを判断する方法
- 10. Django - モデルクラスが抽象であるかどうかを判断する方法
- 11. llvm:Typeがi8 *タイプであるかどうかを判断する方法?
- 12. 列が符号なしであるかどうかを判断する方法?
- 13. ServletRequestがPreflightRequestであるかどうかを判断する方法?
- 14. location.hashが戻るボタンかどうかを判断する方法
- 15. SSD上であるかどうかを判断するクロスプラットフォームの方法は?
- 16. オブジェクトが移動を停止したかどうかを判断する方法
- 17. Oracle:列が "ブール値"かどうかを判断する方法
- 18. パスワードが必要かどうかを判断する方法
- 19. Windowsフォームのテキストボックスにフォーカスがあるかどうかを判断する方法
- 20. コントロールがフォームCの外にあるかどうかを判断する方法#
- 21. あなたがBuddypressアクティビティストリームにいるかどうかを判断する方法
- 22. ポイントがQuad2DCurveにあるかどうかを判断する方法
- 23. RSSフィードがあるかどうかを判断する最も良い方法
- 24. パスが有効かどうかを判断するjavascript
- 25. STDINがシステムコールを通じてTTYであるかどうかを判断する方法はありますか?
- 26. デバイスにタッチスクリーンがあるかどうかを判断する
- 27. iPhoneがローミング中であるかどうかを判断する方法はありますか?
- 28. オペレーティングシステムがMacであるかどうかを判断
- 29. Uberがエリアをサービスするかどうかを判断する方法は?
- 30. フィールドがnullではないかどうかを判断する方法?
@Timダウン:私は、ランダムなJSのオブジェクト、HTML要素と私の関数へのパラメータとして送信されていたイベント間の違いを確認する必要があるため。 – Tom