616 votes

Comment déclencher un événement en JavaScript ?

J'ai attaché un événement à une zone de texte en utilisant addEventListener . Cela fonctionne bien. Mon problème est apparu lorsque j'ai voulu déclencher l'événement de manière programmatique à partir d'une autre fonction.

Comment puis-je le faire ?

13 votes

Mozilla a publié un article très intéressant expliquant Créer et déclencher des événements en Javascript . J'espère que cela vous aidera !

1 votes

Veuillez changer la réponse acceptée en este c'est plus actuel.

2 votes

@RickyStam On dirait que cet article de MDN déplacé ici

496voto

Alsciende Points 11508

Remarque : le initEvent est désormais obsolète. Les autres réponses présentent des pratiques actualisées et recommandées.


Vous pouvez utiliser fireEvent sur IE 8 ou moins, et la norme du W3C dispatchEvent sur le plus d'autres navigateurs. Pour créer l'événement que vous souhaitez déclencher, vous pouvez utiliser l'une des deux méthodes suivantes createEvent o createEventObject en fonction du navigateur.

Voici un morceau de code auto-explicatif (du prototype) qui déclenche un événement dataavailable sur un element :

var event; // The custom event that will be created
if(document.createEvent){
    event = document.createEvent("HTMLEvents");
    event.initEvent("dataavailable", true, true);
    event.eventName = "dataavailable";
    element.dispatchEvent(event);
} else {
    event = document.createEventObject();
    event.eventName = "dataavailable";
    event.eventType = "dataavailable";
    element.fireEvent("on" + event.eventType, event);
}

6 votes

N'oubliez pas que seule la version IE a le 'on' devant (j'ai manqué cela au début).

50 votes

Que signifie la variable eventName contiennent ici ?

0 votes

@Alsciende comment puis-je attacher mon gestionnaire d'événement à cet événement personnalisé ?

393voto

Dorian Points 2384

Un exemple concret :

// Add an event listener
document.addEventListener("name-of-event", function(e) {
  console.log(e.detail); // Prints "Example of an event"
});

// Create the event
var event = new CustomEvent("name-of-event", { "detail": "Example of an event" });

// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);

Pour les navigateurs plus anciens polyfill et des exemples plus complexes, voir Documents MDN .

Voir les tableaux de soutien pour EventTarget.dispatchEvent y CustomEvent .

11 votes

Cette réponse est plus actuelle maintenant. Une chose à ajouter : s'il doit y avoir un événement de type "connaissance" (tel que TransitionEvent , ClipboardEvent etc.) le constructeur approprié pourrait être appelé.

6 votes

@AngelPolitis : Parce qu'elle a été écrite après que la précédente ait été acceptée et que la personne qui a écrit la question (@KoolKabin) n'a probablement pas relu les réponses.

4 votes

Et parce qu'elle a été posée en 2010

119voto

Emi Points 11

Si vous ne voulez pas utiliser jQuery et que vous n'êtes pas particulièrement préoccupé par la rétrocompatibilité, utilisez simplement :

let element = document.getElementById(id);
element.dispatchEvent(new Event("change")); // or whatever the event type might be

Voir la documentation aquí y aquí .

EDITAR: En fonction de votre configuration, vous pouvez ajouter bubbles: true :

let element = document.getElementById(id);
element.dispatchEvent(new Event('change', { 'bubbles': true }));

48voto

Vitor Lima Points 88

Si vous utilisez jQuery, vous pouvez simplement faire

$('#yourElement').trigger('customEventName', [arg0, arg1, ..., argN]);

et le traiter avec

$('#yourElement').on('customEventName',
   function (objectEvent, [arg0, arg1, ..., argN]){
       alert ("customEventName");
});

où "[arg0, arg1, ..., argN]" signifie que ces args sont optionnels.

5 votes

La syntaxe correcte est $('#votreElement').trigger('customEventName', [ arg0, arg1, ..., argN ]) ; Vous avez oublié le [] au deuxième paramètre.

29voto

Mr. Polywhirl Points 3677

Remarque : le initCustomEvent est désormais obsolète. Les autres réponses présentent des pratiques actualisées et recommandées.


Si vous utilisez IE9+, vous pouvez utiliser ce qui suit. Le même concept est incorporé dans Vous n'avez peut-être pas besoin de jQuery .

function addEventListener(el, eventName, handler) {
  if (el.addEventListener) {
    el.addEventListener(eventName, handler);
  } else {
    el.attachEvent('on' + eventName, function() {
      handler.call(el);
    });
  }
}

function triggerEvent(el, eventName, options) {
  var event;
  if (window.CustomEvent) {
    event = new CustomEvent(eventName, options);
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, options);
  }
  el.dispatchEvent(event);
}

// Add an event listener.
addEventListener(document, 'customChangeEvent', function(e) {
  document.body.innerHTML = e.detail;
});

// Trigger the event.
triggerEvent(document, 'customChangeEvent', {
  detail: 'Display on trigger...'
});

Si vous utilisez déjà jQuery, voici la version jQuery du code ci-dessus.

$(function() {
  // Add an event listener.
  $(document).on('customChangeEvent', function(e, opts) {
    $('body').html(opts.detail);
  });

  // Trigger the event.
  $(document).trigger('customChangeEvent', {
    detail: 'Display on trigger...'
  });
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

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