662 Stimmen

Wie löst man ein Ereignis in JavaScript aus?

Ich habe ein Ereignis an ein Textfeld angehängt mit addEventListener . Es funktioniert gut. Mein Problem trat auf, als ich das Ereignis programmatisch von einer anderen Funktion aus auslösen wollte.

Wie kann ich das tun?

2 Stimmen

Bitte ändern Sie die akzeptierte Antwort in este ist sie aktueller.

2 Stimmen

@RickyStam Es sieht aus wie der MDN-Artikel hierher verschoben

510voto

Alsciende Punkte 25697

Anmerkung: Die initEvent Methode ist jetzt veraltet. Andere Antworten enthalten aktuelle und empfohlene Praktiken.


Sie können verwenden fireEvent en IE 8 oder niedriger, und W3C's dispatchEvent en más anderen Browsern. Um das auszulösende Ereignis zu erstellen, können Sie entweder createEvent o createEventObject je nach Browser.

Hier ist ein selbsterklärendes Stück Code (aus dem Prototyp), das ein Ereignis auslöst dataavailable an einem 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 Stimmen

Vergessen Sie nicht, dass nur bei der IE-Version das "on" vorangestellt ist (das habe ich zuerst übersehen).

50 Stimmen

Was bedeutet die Variable eventName hier enthalten?

0 Stimmen

@Alsciende wie kann ich meinen Event-Handler an dieses benutzerdefinierte Ereignis anhängen?

416voto

Dorian Punkte 20663

Ein praktisches Beispiel:

// 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);

Bei älteren Browsern Polyfill und komplexere Beispiele, siehe MDN-Dokumente .

Siehe Unterstützungstabellen für EventTarget.dispatchEvent y CustomEvent .

12 Stimmen

Eine Sache, die man hinzufügen sollte: wenn es ein know-typed Ereignis geben sollte (wie TransitionEvent , ZwischenablageEreignis usw.) könnte der entsprechende Konstruktor aufgerufen werden.

0 Stimmen

Funktioniert nicht mit jeder Version des IE ( caniuse.com/#feat=customevent ). Siehe mein Antwort für einen Fix.

4 Stimmen

Hinweis für zukünftige Leser, detail ist eine Eigenschaft der Event zu, also weisen Sie ihm alle Daten zu, auf die Sie am anderen Ende zugreifen wollen, und greifen Sie mit event.detail . +1

156voto

e18r Punkte 6410

Wenn Sie jQuery nicht verwenden möchten und sich nicht besonders um die Abwärtskompatibilität sorgen, verwenden Sie einfach:

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

Siehe die Dokumentation aquí y aquí .

EDITAR: Je nach Ihrer Einrichtung sollten Sie Folgendes hinzufügen bubbles: true :

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

10 Stimmen

Dies sollte die akzeptierte Antwort sein, da sie keine veralteten Methoden wie initEvent() verwendet

4 Stimmen

Nette Lösung, aber beachten Sie, dass dies nicht auf IE11 funktionieren wird. Sie sollten dann verwenden CustomEvent und das entsprechende Polyfill.

0 Stimmen

Wir sollten uns keine Sorgen mehr um den Internet Explorer machen. Microsoft sagt, dass er tot ist, und das tun wir auch. Jeder, der den IE noch benutzt, verdient die tote Version seiner Webseite.

51voto

Wenn Sie jQuery verwenden, können Sie einfach tun

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

und behandeln es mit

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

wobei "[arg0, arg1, ..., argN]" bedeutet, dass diese Args optional sind.

5 Stimmen

Die richtige Syntax ist $('#IhrElement').trigger('customEventName', [ arg0, arg1, ..., argN ]); Sie haben das [] beim zweiten Parameter vergessen

30voto

Mr. Polywhirl Punkte 34960

Anmerkung: Die initCustomEvent Methode ist jetzt veraltet. Andere Antworten enthalten aktuelle und empfohlene Praktiken.


Wenn Sie IE9+ unterstützen, können Sie folgendes verwenden. Das gleiche Konzept ist enthalten in Sie brauchen vielleicht kein 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...'
});

Wenn Sie bereits jQuery verwenden, finden Sie hier die jQuery-Version des obigen Codes.

$(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>

1 Stimmen

Dies funktioniert nicht für jede Version des IE, da eine window.CustomEvent existiert, aber er kann nicht als Konstruktor aufgerufen werden: caniuse.com/#search=CustomEvent ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X