2010-10-09 3 views
5

Ich möchte überprüfen, ob ein Ereignis verfügbar ist oder nicht, bevor eine Funktion an es gebunden wird. Das Problem ist, dass Google Chrome das Ereignis "loadedmetadata" im Video-Element unterstützt, während FireFox dies nicht tut.Wie überprüft man, ob ein Event-Handler mit jQuery oder JS existiert?

Ich habe die folgende

$('video').bind('loadedmetadata', videoloaded); 
videoloaded(); 

Es ist gut in Firefox gearbeitet, aber wenn ich in Chrome versucht, wurde die Funktion zweimal ausgeführt (was logisch ist). Ich möchte überprüfen, ob loadedmetadata Event-Handler vorhanden ist oder nicht, um die Funktion nur einmal in jedem Browser auszuführen.

Wenn solch eine Möglichkeit nicht existiert, arbeitet irgendeine intelligente dafür?

Antwort

5

Überprüfen Sie die $video.data("events"), wenn dieses Objekt Ihr Ereignis enthält, da Sie .bind verwenden, werden alle Ereignisse dieses Elements in diesem Objekt gespeichert.

var $video = $("#video"); 
var $ve = $video.data("events"); 

// checking if a `loadedmetadata` object exists in `data("events")` 
if ($ve != null && typeof($ve.loadedmetadata) !== undefined) 
{ 
    // has loadedmetadata event 
} 

Vollarbeits example on jsFiddle

+0

@ Peter: Ich habe ein Beispiel davon arbeiten an jsFiddle hinzugefügt. – BrunoLM

+0

@Bruno - Ich bin jetzt etwas verwirrter als beim Start :( –

+1

@Peter: Angenommen, er verwendet immer jQuery, um Ereignisse zu binden, bedeutet dies, dass alle Eventhandler auf 'element.data (" events ") gespeichert sind ist ein Objekt, das mehrere Objekte enthält, die Informationen über das Ereignis enthalten, zB das Ereignis 'x' auf einem Element, das' element.data ("events") 'wird zurückgeben:' ({x: [{handler: (function() {}), data: (void 0), namespace: "", tippe: "x", guid: 31}]}) ' – BrunoLM

Verwandte Themen