J'utilise les cases à cocher Prototype pour surveiller, afin que je puisse leur ajouter des vérifications javascript. Lorsque le tr ou le td dans lequel se trouve la case à cocher est cliqué, la case à cocher doit être cochée.
Lorsque vous cliquez directement sur une case à cocher, l'événement onchange est déclenché et vous recevez une alerte. Lorsque la valeur de la case à cocher est modifiée par javascript (lorsque vous cliquez sur le tr ou le td), onchange n'est pas activé. Pourquoi onchange n'est pas déclenché lorsque la case à cocher est modifiée indirectement?Pourquoi onchange sur une case à cocher n'est pas déclenché lorsque la case à cocher est modifiée indirectement
Ceci est le javascript que j'utilise.
Element.observe(window, 'load', function() {
/* If a tr or td is clicked, change the value of the checkbox. */
$$('#results tr').each(function(el) {
el.observe('click', function(e) {
if(!e.target) { e.target = e.srcElement; }
if(e.target.nodeName == 'TD' || e.target.nodeName == 'TR') {
$('compare-product'+this.id).checked = ($('compare-product'+this.id).checked === false) ? true : false;
}
});
});
/* Monitor if the status of a checkbox has changed. */
$$('#results tr td input').each(function(el) {
el.observe('change', function(e) {
alert('!');
}
);
}
);
}
);
Je l'ai testé dans Firefox et IE7, les deux ne fonctionnent pas. Je ne cherche pas une solution de contournement, je suis simplement curieux de savoir pourquoi cela ne fonctionne pas.
Si c'était le cas, que se passerait-il si dans votre code de gestion d'événement vous avez changé l'état de la case à cocher? –
Je ne comprends pas ce que vous voulez dire. – Robin
Si vous modifiez l'état dans votre même gestionnaire, le même gestionnaire d'événements sera à nouveau appelé. Si c'est le cas, vous pourriez avoir une boucle d'infini. –