2013-01-18 11 views
6

Od wewnątrz funkcji jaktest, czy obiekt jest wydarzeniem DOM

function eventHandler(e) { 
    // ... 
} 

jest jakiś niezawodny i skuteczny sposób, aby określić, czy e to wydarzenie DOM?

+0

Jak wywoływane jest 'eventHandler'? –

+0

@TravisJ, który nie jest naprawdę istotny, prawda? Pytanie brzmi, jak możemy sprawdzić, czy "e" jest zdarzeniem DOM. – Shmiddty

+0

@Shmiddty - Rozumiem, myślę, że źle zrozumiałem to pytanie. –

Odpowiedz

3

Nie sądzę, że istnieje wiarygodny sposób określenia, czy dany obiekt jest NOT wydarzenie DOM.

  1. typeof e zawsze zwróci 'object' dla prawdziwych obiektów Event, co nie jest pomocne.
  2. Każda właściwość, którą możesz sprawdzić na obiekcie, może istnieć zarówno w oryginalnym obiekcie Event, jak i dowolnym obiekcie nie będącym obiektem zdarzenia.
  3. Można by pomyśleć, że łańcuch prototypów może być użyteczny do określenia tego, ale ma ten sam problem co # 2 (może być łatwo replikowany).
  4. Nieruchomość contructor może wydawać się obiecująco, ale można to zrobić:
function DummyEvent(){ 
    this.constructor.toString = function(){ 
     return "function MouseEvent() { [native code] }"; 
    } 
} 

Ten kończy się dokonywania console.log(e.constructor) Wydrukuj "function MouseEvent() { [native code] }"

Tak, jest tam "niezawodny" sposób stwierdzić, czy obiekt to wydarzenie? nr.

Edytuj — Pamiętaj, że wszystko to jest nieistotne, jeśli chcesz zapobiec fałszowaniu wydarzeń, ponieważ możesz łatwo tworzyć prawdziwe wydarzenia.

var evt = new Event('click'); 
var evt2 = document.createEvent('MouseEvents'); 
evt2.initMouseEvent('click', ...); 
//etc 

Edit2 — Utworzyłem test jsFiddle próbując znaleźć jakiś sposób, aby odróżnić obiekty, ale nie znalazłem jeszcze nic pewnego. Zauważ, że nie zadałem sobie trudu, aby określić właściwości na DummyEvent, ponieważ te mogą oczywiście łatwo zostać sfałszowane.

+0

Dzięki za dokładną odpowiedź. Zaznaczam to jako zaakceptowane. –

0

Być może, jeśli bańki zdarzeń event.bubbles się wydarzenie DOM DOM. Ale nawet jeśli to stwierdzenie jest prawdziwe, jego propagacja może zostać zatrzymana.

AKTUALIZACJA:

OK własnością szukasz jest e.target i dla IE e.srcElement. Obie właściwości zwracają element HTML, w którym miało miejsce zdarzenie, co definiuje je jako zdarzenie DOM z .

Może jednak powinieneś określić, co interpretujesz jako zdarzenie DOM. Czy chodziło Ci o rodzimych imprez przeglądarce, ponieważ jest to zdarzenie DOM też:

var zoo = jQuery('#zoo'); 
zoo.bind('moo'); 
zoo.trigger('moo'); 

Jest zbindowanych do węzła DOM

+0

'var spoof = {target: someDOMNode, srcElement: someDOMNode};' nie jest obiektem Event. – Shmiddty

+0

Funkcja ta nie jest funkcją obsługi zdarzeń ani nie jest funkcją – kidwon

+0

Funkcja jest funkcją. Możesz wywołać funkcję z dowolnego miejsca (gdzie jest w zasięgu). – Shmiddty

-1

w jQuery I stworzył funkcję testującą, coś takiego:

function isEvent(e) { 
    try { 
     e.PreventDefault(); 
     return true; 
    } 
    catch (err) { 
     return false; 
    } 

}

i testowanie Kod:

var o = new Object(); 
var e = $.Event('click'); 
alert(isEvent(o)); 
alert(isEvent(e)); 

Poprzedni alert pokazuje wartość false, a drugi pokazuje wartość true. Zobacz fiddle.

AKTUALIZACJA: Bezpieczniej jest wywołać coś takiego jak preventDefault zamiast wyzwalacza.

+0

Jeśli przypisujesz typ, ten test kończy się niepowodzeniem: 'e.type = 'click';' http://jsfiddle.net/eh6W7/1/ – Shmiddty

+0

Zmodyfikowałem post. – AlecTMH

+0

Ten sam problem ... po prostu dodaj do obiektu metodę "PreventDefault" i nie dostaniesz błędu odniesienia. – Shmiddty

Powiązane problemy