Javascript safari中的EventTarget接口

Javascript safari中的EventTarget接口,javascript,safari,webkit,Javascript,Safari,Webkit,我开始扩展EventTarget界面,添加了一些有用的原型,但随后我在Safari 8上对其进行了测试,得到了: [Error] ReferenceError: Can't find variable: EventTarget 我在Safari的“窗口中发现。EventTarget不存在” 看起来很有趣,但它是关于IE8的 因此,我想知道在Safari上是否可以访问对EventTarget接口的引用,或者是否可以在Safari上使用类似于EventTarget.prototype.hasEve

我开始扩展
EventTarget
界面,添加了一些有用的
原型
,但随后我在Safari 8上对其进行了测试,得到了:

[Error] ReferenceError: Can't find variable: EventTarget
我在Safari的“
窗口中发现。EventTarget
不存在”

看起来很有趣,但它是关于IE8的

因此,我想知道在Safari上是否可以访问对EventTarget接口的引用,或者是否可以在Safari上使用类似于
EventTarget.prototype.hasEventListener
EventTarget.prototype.hasEventListener
的代码而不出现任何错误

编辑 我发现了一个有趣的例子,它是在2015年9月12日(从时间戳开始)实现的,但它在Safari 9.1中肯定不起作用: 我只是把它作为狩猎的后备

var EventTarget = EventTarget || Element;
EventTarget.prototype.addEventListener = function(){/*Some magic here*/};

我还检查了元素是否从EventTarget接口继承了
原型
,它确实继承了!(
document.body.addEventListener==EventTarget.prototype.addEventListener
返回
true

Safari不允许您在自己的对象(DOM元素除外)中使用
EventTarget
接口。所以我只是简单地复制了这个类来完成它

class EventDispatcher {

    constructor() {
        this._listeners = [];
    }

    hasEventListener(type, listener) {
        return this._listeners.some(item => item.type === type && item.listener === listener);
    }

    addEventListener(type, listener) {
        if (!this.hasEventListener(type, listener)) {
            this._listeners.push({type, listener, options: {once: false}});
        }
        // console.log(`${this}-listeners:`,this._listeners);
        return this
    }

    removeEventListener(type, listener) {
        let index = this._listeners.findIndex(item => item.type === type && item.listener === listener);
        if (index >= 0) this._listeners.splice(index, 1);
//        console.log(`${this}-listeners:`, this._listeners);
        return this;
    }

    removeEventListeners() {
        this._listeners = [];
        return this;
    }

    dispatchEvent(evt) {
        this._listeners
            .filter(item => item.type === evt.type)
            .forEach(item => {
                const {type, listener, options: {once}} = item;
                listener.call(this, evt);
                if (once === true) this.removeEventListener(type, listener)
            });
        // console.log(`${this}-listeners:`,this._listeners);
        return this
    }
}

如果在扩展EventTarget时这样做,我仍然会得到:“非法构造函数”。从EventTarget扩展似乎只在chrome中起作用。您使用的是哪种Safari版本?在哪种情况下使用它?是的,这太烦人了。我想从我想要的任何东西发出事件,而不仅仅是DOM元素。Safari 14现在支持
EventTarget
作为构造函数,请参阅.@J.RyanStinnett yes they didi,4年半后的文章哈哈(感谢您让我们知道