Как определить, является ли объект Javascript событием? - PullRequest
42 голосов
/ 22 сентября 2009

Какой самый безопасный способ определить, является ли объект Javascript событием?

Ответы [ 7 ]

44 голосов
/ 22 сентября 2009

Хорошей практикой является поиск "неизвестных" объектов для свойств и методов, которые вы ожидаете найти.

Итак, предположим, что у есть объект события, и проверьте его, прежде чем воздействовать на него, например,

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(...)
}
30 голосов
/ 21 ноября 2014

Как насчет использования instanceof? Пока объект события был создан с использованием конструктора new Event(), например:

var e = new Event('click');
e instanceof Event; // true

В случае параметра события в обработчиках событий, хотя его типом является Object, он содержит собственное событие в качестве свойства, поэтому его можно использовать вместо:

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

Здесь следует отметить, что фактическое значение может варьироваться в зависимости от браузера, особенно если событие является событием касания, см. здесь и ссылки внутри. Не проблема в моем случае.

4 голосов
/ 10 июня 2015

Вы можете проверить, есть ли у объекта свойство 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!
}
3 голосов
/ 15 декабря 2011

Эта функция 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);  }
2 голосов
/ 04 апреля 2013

Старый вопрос, но, по-видимому, согласно этому, event.type является кросс-браузерным:

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

РамешВел добавил это в правку к своему ответу, но за него проголосовали.

Конечно, самый безопасный способ - следовать указаниям принятого ответа, но так получилось, что я хочу отказаться от объекта, если это событие.

0 голосов
/ 19 мая 2012

У меня такая же проблема. Поэтому я решил доказать, и я подошел к решению.

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

Надеюсь, это поможет.

0 голосов
/ 22 сентября 2009

Я не знаю, есть ли надежный способ сделать это, но я думаю, что ваш лучший выстрел - это утка.

В любом случае, в зависимости от ситуации, вы можете проверить, имеет ли данный объект ожидаемые свойства, которые вы хотите использовать, как указывал Пол .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...