Je me bats avec ça depuis quelques heures maintenant.
Je souhaite ajouter un écouteur d'événement à tous les <select>
s d'une page et j'ai ce code jusqu'à présent:
onload = function(e) {
sels = document.getElementsByTagName('select');
for(i=0; i<sels.length; i++) {
sels[i].addEventListener('change', alert('test!'), false);
}
}
Cela ne déclenche l'alerte que lorsque la page est chargée et non lorsque je modifie la valeur dans l'un de mes <select>
s.
Puis-je obtenir un coup de pouce dans la bonne direction, s'il vous plaît? :-)
Vous devez avoir une fonction anonyme pour cela car vous appelez la fonction alert()
immédiatement dans votre exemple:
... .addEventListener('change', function() { alert('test!')}, false ...
Pour l'instant, selon votre code, addEventListener
tente d'ajouter le résultat de undefined
(retour de la fonction alert()
).
Ou vous pouvez simplement passer le gestionnaire de fonctions pour cela:
function alertMe() {
alert( 'test!' );
}
...
... .addEventListener('change', alertMe, false ...
Remarque: en faisant somefunction(arg[, arg...])
, vous appelez non pas fonction, mais la fonction retournée.
En plus d'encapsuler la alert
dans une fonction, comme mentionné précédemment, n'utilisez pas getElementsByTagName
pour chaque itération de la boucle:
onload = function(e) {
sels = document.getElementsByTagName('select');
for(i=0; i<sels.length; i++) {
sels[i].addEventListener('change', function(){alert('test!')}, false);
}
}
Vous avez la liste des éléments select
sauvegardés dans une variable, ce n'est pas nécessaire, pour ne pas mentionner inefficace à get
tous ces éléments, à chaque itération de boucle.
J'ai créé la fonction simple suivante, qui parcourt tous les éléments qui correspondent à la variable selector
, et ajoute un écouteur d'événement pour la variable event
avec la variable handler
passée.
Ceci est une fonctionnalité similaire pour la fonction $(selector).on(event, handler)
de jQuery
function addEventListeners(selector, event, handler, useCapture){
useCapture = useCapture || false;
Array.prototype.forEach.call(
document.querySelectorAll(selector)
,function(el, ix) {
el.addEventListener(event, handler, useCapture);
}
);
}
Donc, pour le PO, la manière d’utiliser cette fonction serait la suivante:
addEventListeners("select", "change", function(evt){ console.log(evt); });
Voir aussi ma réponse pour écouteur d'événement pour les éléments actuels et futurs
Vous exécutez la fonction alert () immédiatement, vous devez transmettre une fonction à la fonction addEventListener à la place:
onload = function(e) {
sels = document.getElementsByTagName('select');
for(i=0; i<sels.length; i++) {
document.getElementsByTagName('select')[i].addEventListener('change', function () { alert('test!'); }, false);
}
}
Event Bubbling est le concept important en javascript. Par conséquent, si vous pouvez ajouter un événement directement sur DOM, vous pouvez enregistrer quelques lignes de code:
document.addEventListener('change', function(e){
if(e.target.tagName=="SELECT"){
alert('SELECT CHANGED');
}
})