Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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