5 votes

Pourquoi triggerHandler() de jQuery ne prévient-il pas les événements en ligne?

J'ai créé ce code de test pour la question : https://jsfiddle.net/5phqm/1/

D'après ce que je comprends, si la méthode triggerHandler() de jQuery empêche le comportement par défaut du navigateur, alors les événements JavaScript natifs ne seront pas déclenchés et gérés (ce qui est vrai pour addEventListener() dans mon code), mais les événements inline, ajoutés via l'attribut onclick="" de la balise, seront tout de même déclenchés ! Pourquoi cela se produit-il ? Est-ce que je comprends mal quelque chose sur le déclenchement des événements dans le navigateur ?

2voto

pimvdb Points 66332

Il peut être confirmé que les gestionnaires en ligne sont exécutés car c'est explicitement codé :

handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
    event.preventDefault();
}

ontype est dans ce cas "onclick". Ainsi, il récupère la propriété onclick de l'élément et l'exécute ensuite. Ce morceau de code est toujours appelé, indépendamment de .trigger/.triggerHandler.

Cependant, les actions natives, comme elem.click(), ne sont exécutées que à l'intérieur d'un bloc if :

if ( !onlyHandlers && !event.isDefaultPrevented() ) {
    // ...
    elem[ type ]();

onlyHandlers est true pour triggerHandle et false pour .trigger, et donc triggerHandler n'exécute pas par exemple elem.click() (alors que .trigger le fait). Ainsi, l'action native est empêchée.

Ainsi, les gestionnaires en ligne et les actions natives sont des choses distinctes et sont également gérées séparément. Seules les actions natives sont empêchées par .triggerHandler.

0voto

Nicola Peluchetti Points 38948

Je pense (mais c'est une supposition, j'ai jeté un coup d'œil rapide au code source de jQuery et cela pourrait être totalement faux) que jQuery récupère les événements attachés aux éléments dans jQuery.trigger.event en appelant quelque chose comme

   $(elem).data("events");

puis décide s'il faut les déclencher/les arrêter. Les événements en ligne ne peuvent pas être collectés de cette manière et donc ils ne peuvent pas être arrêtés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X