javascript - IE11上worker中的事件构造函数?

标签 javascript internet-explorer-11 web-worker polyfills custom-events

new Event 在 IE11 中不起作用,不幸的是 MDN 的 polyfill 和这个问题也不起作用:Internet Explorer 9, 10 & 11 Event constructor doesn't work ,因为它们依赖于 document.createEvent

是否有在工作上下文中创建自定义事件的解决方法?

最佳答案

使用一种为现有事件系统的实现添加别名的方法。例如:

    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!');
});

引用文献

关于javascript - IE11上worker中的事件构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41575405/

相关文章:

javascript - 如何让输入类型文件在打开文件选择器之前等待http请求的响应

javascript - React 应用程序中的路由问题

javascript - 如何在 Phonegap 应用程序中点击 map 获取坐标?

javascript - 访问嵌入式 JSON 的深层对象成员

javascript - 在 Bootstrap 中更改事件列表项的背景颜色

html - IE Flexbox justify-content center 溢出问题

(未知源位置)第 5 行第 9 列的 JavaScript 严重错误

处理大型数组时的 JavaScript 性能

javascript - 传递文档正文而不在网络 worker 中编辑它

javascript - Webpack 网络 worker 加载器不工作