2010-05-19 10 views
4

Existe-t-il un moyen de détecter les gestionnaires d'événements disponibles en mode natif pour un élément HTML?Les gestionnaires d'événements de détection de Javascript sont disponibles sur l'élément HTML

Par exemple:

isAvailable(img.onload) === true; // All browsers 
isAvailable(script.onload) === true; // Non-IE only (Webkit, Firefox, Opera) 
isAvailable(link.onload) === true; // IE (and I think Opera) only 

Idéalement je veux faire la détection de fonctionnalité dans mon script, où se onload est disponible pour un élément à utiliser qui, sinon fallback. Actuellement je dois faire des forks de navigateur (basé sur IE) ce qui est gênant car IE peut commencer à supporter script.onload, et Webkit/Firefox peut commencer à supporter link.onload. Malheureusement, l'affectation de element.onload rend l'événement non plus indéfini, qu'il soit ou non déclenché.

Merci!

Répondre

0

(Modifier Voir ci-dessous, cela ne fonctionne pas.) Vous pouvez vérifier si l'élément a une propriété onload:

var img = document.createElement('img'); 
alert("img onload? " + ('onload' in img)); 
var script = document.createElement('script'); 
alert("script onload? " + ('onload' in script)); 

sur IE7, je reçois true pour le img et false pour la script.

Modifier Cela ne fonctionne pas pour Firefox. Laissant cela juste pour que les autres ne descendent pas sur le même chemin.

+0

Merci, qui est un nouveau test, mais comme vous le dites: pas de bananes! – mummybot

+0

@mummybot: Oui, j'ai été détruit. :-(Il y a beaucoup d'autres choses que vous pouvez tester d'une manière similaire, mais apparemment pas. Vous pouvez toujours en vedette test en ajoutant des éléments temporairement et de voir s'ils tirent l'événement, mais qui pourrait bien être surpuissant. –

+0

aussi lourde parce que vous devez faire l'hypothèse que si l'élément testé n'a pas été déclenché après une période indéterminée, il ne supporte pas le chargement On ne pourrait pas vérifier si un serveur est tombé ou si les internets allaient lentement. cela ajouterait tout à fait un retard ... Gah :( – mummybot

0

Je ne sais pas si c'est ce que vous demandiez, mais cela vous permettra de savoir si vous avez une méthode ou une propriété spécifique disponible pour un objet donné.

var apple = new Object; 
    apple.load = function() { alert("I am a method.") }; 
    apple.color = "red" 

function isAvailable(obj, mp) { 
    // obj = element to test for method or property. 
    // mp = name of method or property. 

    if (obj[mp]) { 
     return true; 
    } else { 
     return false; 
    } 
} 

if (isAvailable(apple, "color")) { 
    alert("apple object has a 'color' property"); 
} 

if (isAvailable(apple, "load")) { 
    alert("apple object has a 'load' method"); 
} 

Edit: Re-travaillé la réponse à montrer un exemple.

+0

Merci John, mais pas. Je spécifiquement cherche à détecter si un objet DOM a une méthode particulière (charge), pas des objets javascript en général. Je suis assez sûr que cela est impossible. – mummybot

+0

je retravaillé ma réponse pour montrer qu'il trouve une méthode ou une propriété dans un objet, pas si un objet existe ou non. – John

0

J'ai fait quelque chose comme ça avant; lorsque vous écrivez des choses pour l'écart téléphonique sur l'iphone, selon que vous exécutez l'application dans le simulateur ou sur différentes versions de l'appareil, vous avez souvent des gestionnaires différents pour gérer le clic des boutons d'entrée (et la plupart des autres) de mon script, je fais juste une vérification rapide;

var m_clickEvent = ''; 

if ($('input').click != 'undefined') 
    m_clickEvent = 'click' 
else if ($('input').tap != 'tap') 
    m_clickEvent = 'tap' 
else if ($('input').touchstart!= 'touchstart') 
    m_clickEvent = 'touchstart' 
else 
    // some kind of error handling.. 

alors je peux aller de l'avant et de lier mon gestionnaire d'événements;

$('.myButton').bind(m_clickEvent, function(e) { ... }); 
+0

Salut Shawson, merci pour votre réponse, malheureusement, il ne semble pas être cette option pour les gestionnaires onload (re ma question initiale) - « Malheureusement, l'affectation element.onload rend l'événement plus « indéfini », peu importe si elle finira par feu ou pas. " – mummybot

0

Voici un exemple distillé de la façon dont Modernizr fait la détection d'événements:

var tmp = document.createElement('script'); 
tmp.setAttribute('onload', ''); 
isSupported = typeof tmp.onload == 'function'; 
+0

Je ne suis pas sûr que cela fonctionne comme vous l'avez copié là-haut. Le code suivant dans la console Firefox indique que l'élément cheese aura un événement onload: var tmp = document.createElement ('cheese'); tmp.setAttribute ('onload', ''); console.log (tmp, tmp.onload); IsSupported = typeof tmp.onload === 'fonction' console.log (isSupported); – mummybot

+0

Intéressant. Eh bien, peut-être que Firefox supporte les écouteurs d'événements 'load' sur tous les éléments bien qu'il n'y ait aucun moyen de charger du contenu et donc de le déclencher;). Je dirais que c'est un bug dans Firefox en fait. Le code fonctionne très bien dans Chrome et Opera. – hallvors

0

Une façon que je l'ai fait dans le passé est d'utiliser l'ancienne « dans » boucle, et vérifier chaque valeur de clé pour voir si elle commence par « on » (chaque gestionnaire d'événements natif que j'ai jamais vu commence de cette façon ...) Ainsi, par exemple:

var el = document.querySelector("*"), //this is the element (use whatever selector text) 
elEventHandlers = [];     //set up an array to hold 'em all 

for (var prop in el)     //loop through each prop of the element 
    if (prop.substring(0,2)=="on") //if the prop starts with "on" it's an event handler 
     elEventHandlers.push(prop); //so, add it to the array 

console.log(elEventHandlers);   //then dump the array to the console (or whatever) 

le tour est joué! Vous savez maintenant quels gestionnaires d'événements peuvent être enregistrés sur cet élément!

0

Essayez celui-ci:

var d = document.createElement('div'); 

if(d.hasOwnProperty('onclick')) { 
    //then onclick is supported 
} 

vous pouvez également boucle à travers les propriétés de div (ou prendre tout autre élément HTML) pour vérifier dynamiquement:

var d = document.createElement('div'), 
    el = 0; 

for(el in d) { 
    if(d.hasOwnProperty(el)) { 
     console.log(d[el]); //or do anything else you like 
    } 
} 

Vous pouvez vérifier plus sur hasOwnProperty sur mozilla's dev blog

0
isEventSupported = 
    function(tag, event){ 
    return document.createElement(tag)[event]===null; 
    }; 

>> isEventSupported("script", "onload"); 
true //on my current browser 

Il y a de faux rapports sur cet événement. Les vétérans de rom comme ..., ne mentionnons pas les noms - mais il n'est PAS évident que l'événement onload ne se déclenchera probablement pas sur les éléments SCRIPT des éléments IMG et similaires, car la source a déjà été encaissée et les éléments dont les ressources sont tirées du l'argent ne déclenchera pas l'événement onload.

Exception: l'élément de document déclenche l'événement onload, même lorsque vous travaillez avec des fichiers encaissées, car cela dépend de readystate complète.