2010-10-09 5 views
5

Je veux vérifier si un événement est disponible ou non avant de lier une fonction à celui-ci. Le problème est que Google Chrome prend en charge l'événement "loadedmetadata" dans l'élément vidéo, contrairement à FireFox.Comment vérifier si un gestionnaire d'événement existe avec jQuery ou JS?

j'ai fait ce qui suit

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

Il a bien fonctionné dans Firefox, mais quand j'ai essayé dans Chrome, la fonction a été exécutée deux fois (ce qui est logique). Je veux vérifier si le gestionnaire d'événements loadedmetadata existe ou non pour n'exécuter la fonction qu'une seule fois dans chaque navigateur.

Si une telle possibilité n'existe pas, tout travail intelligent pour cela?

Répondre

5

Cochez $video.data("events") si cet objet contient votre événement, puisque vous utilisez .bind tous les événements de cet élément seront stockés dans cet objet.

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 
} 

travaillant à plein example on jsFiddle

+0

@Peter: J'ai ajouté un exemple de ce travail sur jsFiddle. – BrunoLM

+0

@Bruno - Je suis légèrement plus confus maintenant que quand j'ai commencé :( –

+1

@Peter: En supposant qu'il utilise toujours jQuery pour lier des événements, cela signifie que tous les gestionnaires d'événements sont stockés sur 'element.data (" events ")'. est un objet qui contient plusieurs objets, où ceux-ci contiennent des informations sur l'événement, par exemple l'événement 'x' sur un élément, le' element.data ("events") 'retournera:' ({x: [{handler: (function() {}), data: (void 0), espace de nommage: "", tapez: "x", guid: 31}]}) ' – BrunoLM