Je me demande comment utiliser addEventListener
respectivement attachEvent
correctement?
window.onload = function (myFunc1) { /* do something */ }
function myFunc2() { /* do something */ }
if (window.addEventListener) {
window.addEventListener('load', myFunc2, false);
} else if (window.attachEvent) {
window.attachEvent('onload', myFunc2);
}
// ...
ou
function myFunc1() { /* do something */ }
if (window.addEventListener) {
window.addEventListener('load', myFunc1, false);
} else if (window.attachEvent) {
window.attachEvent('onload', myFunc1);
}
function myFunc2() { /* do something */ }
if (window.addEventListener) {
window.addEventListener('load', myFunc2, false);
} else if (window.attachEvent) {
window.attachEvent('onload', myFunc2);
}
// ...
?
Ce navigateur est-il sécurisé ou devrais-je mieux utiliser quelque chose comme ceci:
function myFunc1(){ /* do something */ }
function myFunc2(){ /* do something */ }
// ...
function addOnloadEvent(fnc){
if ( typeof window.addEventListener != "undefined" )
window.addEventListener( "load", fnc, false );
else if ( typeof window.attachEvent != "undefined" ) {
window.attachEvent( "onload", fnc );
}
else {
if ( window.onload != null ) {
var oldOnload = window.onload;
window.onload = function ( e ) {
oldOnload( e );
window[fnc]();
};
}
else
window.onload = fnc;
}
}
addOnloadEvent(myFunc1);
addOnloadEvent(myFunc2);
// ...
Et dis myfunc2
est destiné à IE 7 uniquement. Comment modifier la méthode correcte/préférée en conséquence?
L'utilisation des deux est similaire, bien que les deux utilisent une syntaxe légèrement différente pour le paramètre event:
obj.addEventListener('click', callback, false);
function callback(){ /* do stuff */ }
Liste des événements pour addEventListener
.
obj.attachEvent('onclick', callback);
function callback(){ /* do stuff */ }
Liste des événements pour attachEvent
.
Pour les deux méthodes, les arguments sont les suivants:
1. Est le type d'événement.
2. Est-ce la fonction à appeler une fois que l'événement a été déclenché?.
3. (addEventListener
seulement) Si la valeur est true, indique que l'utilisateur souhaite lancer capture .
Les deux méthodes sont utilisées pour atteindre le même objectif consistant à attacher un événement à un élément.
La différence étant que attachEvent
ne peut être utilisé que sur des moteurs de rendu plus anciens trident ( IE5 + IE5-8 *) et addEventListener
est un standard W3 qui est implémenté dans la plupart des autres navigateurs (FF, Webkit, Opera, IE9 +).
Pour une prise en charge solide des événements interserveurs, y compris les normalisations que vous n’obtenez pas avec la solution Diaz, utilisez framework .
* IE9-10 prend en charge les deux méthodes, pour une compatibilité ascendante.
Merci à Luke Puplett pour avoir signalé que attachEvent
a été supprimé de IE11.
Comme Smitty recommandé, vous devriez jeter un coup d'œil à ceci Dustin Diaz addEvent pour une mise en œuvre multi-navigateur solide sans l'utilisation d'un framework:
function addEvent(obj, type, fn) {
if (obj.addEventListener) {
obj.addEventListener(type, fn, false);
}
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj[type+fn] = function() {obj["e"+type+fn](window.event);}
obj.attachEvent("on"+type, obj[type+fn]);
}
else {
obj["on"+type] = obj["e"+type+fn];
}
}
addEvent( document, 'click', function (e) {
console.log( 'document click' )
})
Quiconque continue de participer à cette discussion sans trouver la réponse recherchée:
http://dustindiaz.com/rock-solid-addevent
C’est l’une des solutions les plus élégantes que j’ai trouvées pour ceux d’entre nous qui ont des restrictions quant à l’utilisation des frameworks.
function addEvent(obj, type, fn) {
if (obj.addEventListener) {
obj.addEventListener(type, fn, false);
EventCache.add(obj, type, fn);
} else if (obj.attachEvent) {
obj["e" + type + fn] = fn;
obj[type + fn] = function() {
obj["e" + type + fn](window.event);
}
obj.attachEvent("on" + type, obj[type + fn]);
EventCache.add(obj, type, fn);
} else {
obj["on" + type] = obj["e" + type + fn];
}
}
var EventCache = function() {
var listEvents = [];
return {
listEvents: listEvents,
add: function(node, sEventName, fHandler) {
listEvents.Push(arguments);
},
flush: function() {
var i, item;
for (i = listEvents.length - 1; i >= 0; i = i - 1) {
item = listEvents[i];
if (item[0].removeEventListener) {
item[0].removeEventListener(item[1], item[2], item[3]);
};
if (item[1].substring(0, 2) != "on") {
item[1] = "on" + item[1];
};
if (item[0].detachEvent) {
item[0].detachEvent(item[1], item[2]);
};
item[0][item[1]] = null;
};
}
};
}();
addEvent(window, 'unload', EventCache.flush);