Какой самый безопасный способ определить, является ли объект Javascript событием?
Как определить, является ли объект Javascript событием?
Ответ 1
Это довольно хорошая практика, чтобы исследовать возможные "неизвестные" объекты для свойств и методов, которые вы ожидаете найти.
Итак, предположим, что у вас есть объект события, и исследуйте его, прежде чем действовать на него, например.
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
Как насчет использования instanceof
? Пока объект события был создан с использованием конструктора new Event()
, например:
var e = new Event('click');
e instanceof Event; // true
В случае параметра события в обработчиках событий, хотя его типом является Object, он содержит собственное событие как свойство, поэтому его можно использовать вместо:
function myEventHandler(e) {
e.originalEvent instanceof Event; //true
}
Здесь следует отметить, что фактическое значение может варьироваться в зависимости от браузера, особенно когда событие является событием касания, см. здесь и ссылки внутри. Не проблема в моем случае.
Ответ 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); }
Ответ 4
Вы можете проверить, имеет ли объект свойство 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!
}
Ответ 5
Старый вопрос, но, по-видимому, согласно этому, event.type
является кросс-браузерным:
http://www.quirksmode.org/js/events_properties.html
RameshVel добавил это в редактирование своего ответа, но он был сильно проголосован.
Конечно, самый безопасный способ - следовать руководству принятого ответа, но так получилось, что я хочу отбросить объект, если это событие.
Ответ 6
Я не знаю, есть ли верный способ сделать это, но я думаю, что ваш лучший снимок - это утка.
В любом случае, в зависимости от ситуации, вы можете проверить, есть ли у данного объекта ожидаемые свойства, которые вы хотите использовать, как указано Paul.
Ответ 7
У меня такая же озабоченность. Поэтому я решил доказать, и я приблизился к решению.
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;
}
Я тестировал эту функцию в
- FF и Opera 12.0 на Ubuntu 11.64
- Safari 5.0 на Wine-Ubuntu
- G.Chrome 19 и MSIE 8 на WinXP
Надеюсь, это поможет.