Конструктор событий в воркере в IE11?

new Event не работает в IE11, и, к сожалению, полифилл из MDN и этот вопрос: Конструктор событий Internet Explorer 9, 10 и 11 не работает, так как они полагаются на document.createEvent.

Существуют ли обходные пути для создания пользовательских событий в рабочем контексте?


person Felipe    schedule 10.01.2017    source источник
comment
Зачем вам нужно событие DOM в воркере?   -  person Bergi    schedule 10.01.2017
comment
Я использую надежный веб-сокет, и для его определения требуется CustomEvent.   -  person Felipe    schedule 10.01.2017


Ответы (1)


Используйте метод, который создает псевдоним реализации существующей системы событий. Например:

    sinon.Event = function Event(type, bubbles, cancelable, target) {
        this.initEvent(type, bubbles, cancelable, target);
    };

    sinon.Event.prototype = {
        initEvent: function (type, bubbles, cancelable, target) {
            this.type = type;
            this.bubbles = bubbles;
            this.cancelable = cancelable;
            this.target = target;
        },

        stopPropagation: function () {},

        preventDefault: function () {
            this.defaultPrevented = true;
        }
    };

    sinon.CustomEvent = function CustomEvent(type, customData, target) {
        this.initEvent(type, false, false, target);
        this.detail = customData.detail || null;
    };

    sinon.CustomEvent.prototype = new sinon.Event();

    sinon.CustomEvent.prototype.constructor = sinon.CustomEvent;

    sinon.EventTarget = {
        addEventListener: function addEventListener(event, listener) {
            this.eventListeners = this.eventListeners || {};
            this.eventListeners[event] = this.eventListeners[event] || [];
            push.call(this.eventListeners[event], listener);
        },

        removeEventListener: function removeEventListener(event, listener) {
            var listeners = this.eventListeners && this.eventListeners[event] || [];

            for (var i = 0, l = listeners.length; i < l; ++i) {
                if (listeners[i] === listener) {
                    return listeners.splice(i, 1);
                }
            }
        },

        dispatchEvent: function dispatchEvent(event) {
            var type = event.type;
            var listeners = this.eventListeners && this.eventListeners[type] || [];

            for (var i = 0; i < listeners.length; i++) {
                if (typeof listeners[i] === "function") {
                    listeners[i].call(this, event);
                } else {
                    listeners[i].handleEvent(event);
                }
            }

            return !!event.defaultPrevented;
        }
    };
}


/**
 * Used to bind event listeners to the worker. Internally it uses the jQuery `.on` method.
 * @method on
 * @param {Mixed} args* Lookup the jQuery `.on` API for argument list.
 * @chainable
 */

var worker = new WebWorker('./worker-script.js');
worker.on('my-custom-event', function () {
console.log('custom event triggered!');
});

Ссылки

person Paul Sweatte    schedule 30.08.2017