web-dev-qa-db-fra.com

Internet Explorer 9, 10 et 11 Le constructeur d'événements ne fonctionne pas

Je crée un événement, utilisez donc le constructeur DOM Event:

new Event('change');

Cela fonctionne très bien dans les navigateurs modernes, mais dans Internet Explorer 9, 10 et 11, il échoue avec:

Object doesn't support this action

Comment puis-je réparer Internet Explorer (idéalement via un polyfill)? Si je ne peux pas, y a-t-il une solution que je peux utiliser?

110
mikemaccana

Il y a un IE polyfill pour le constructeur CustomEvent chez MDN . Ajouter CustomEvent à IE et utiliser cela à la place fonctionne.

(function () {
  if ( typeof window.CustomEvent === "function" ) return false; //If not IE

  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
   }

  CustomEvent.prototype = window.Event.prototype;

  window.CustomEvent = CustomEvent;
})();
156
mikemaccana

Je pense que la meilleure solution pour résoudre votre problème et gérer la création d'événements entre navigateurs est la suivante:

function createNewEvent(eventName) {
    var event;
    if (typeof(Event) === 'function') {
        event = new Event(eventName);
    } else {
        event = document.createEvent('Event');
        event.initEvent(eventName, true, true);
    }
    return event;
}
44
michalduda

Ce paquet fait la magie:

https://www.npmjs.com/package/custom-event-polyfill

Incluez le paquet et envoyez l'événement comme suit:

window.dispatchEvent(new window.CustomEvent('some-event'))
4
fsavina

Si vous essayez simplement d'envoyer un événement simple tel que l'événement de basculement HTML, cela fonctionne dans Internet Explorer 11 ainsi que dans les autres navigateurs:

let toggle_event = null;
try {
    toggle_event = new Event("toggle");
}
catch (error) {
    toggle_event = document.createEvent("Event");
    let doesnt_bubble = false;
    let isnt_cancelable = false;
    toggle_event.initEvent("toggle", doesnt_bubble, isnt_cancelable);
}
// disclosure_control is a details element.
disclosure_control.dispatchEvent(toggle_event);
2
Patrick Dark

le custom-event Le paquet npm a fonctionné à merveille pour moi

https://www.npmjs.com/package/custom-event

var CustomEvent = require('custom-event');

// add an appropriate event listener
target.addEventListener('cat', function(e) { process(e.detail) });

// create and dispatch the event
var event = new CustomEvent('cat', {
  detail: {
    hazcheeseburger: true
  }
});
target.dispatchEvent(event);
2
Liran H

Personnellement, j'utilise une fonction wrapper pour gérer les événements créés manuellement. Le code suivant ajoutera une méthode statique à toutes les interfaces Event (toutes les variables globales se terminant par Event sera une interface événementielle) et vous permettra d’appeler des fonctions telles que element.dispatchEvent(MouseEvent.create('click')); sur IE9 +. .

(function eventCreatorWrapper(eventClassNames){
    eventClassNames.forEach(function(eventClassName){
        window[eventClassName].createEvent = function(type,bubbles,cancelable){
            var evt
            try{
                evt = new window[eventClassName](type,{
                    bubbles: bubbles,
                    cancelable: cancelable
                });
            } catch (e){
                evt = document.createEvent(eventClassName);
                evt.initEvent(type,bubbles,cancelable);
            } finally {
                return evt;
            }
        }
    });
}(function(root){
    return Object.getOwnPropertyNames(root).filter(function(propertyName){
        return /Event$/.test(propertyName)
    });
}(window)));

EDIT: La fonction permettant de rechercher toutes les interfaces Event peut également être remplacée par un tableau afin de ne modifier que les interfaces d'événement dont vous avez besoin (['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent' /*, etc... */]).

1
Kevin Drost

Il y a un service polyfill qui peut patcher ceci et d'autres pour vous

https://polyfill.io/v3/url-builder/

 <script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js"></script>
1
frumbert