admin管理员组文章数量:1291309
I started to extend the EventTarget
interface by adding some useful prototypes
but then I tested it on Safari 8 and get :
[Error] ReferenceError: Can't find variable: EventTarget
I found on MDN that "window.EventTarget
does not exist" for Safari.
This question looks really interesting but it's about IE8.
So, I want to know if a reference to the EventTarget interface is accessible on Safari, or a workaround to use code like EventTarget.prototype.hasEventListener
and EventTarget.prototype.hasEventListener
without getting any errors on Safari ?
Edit I found an interesting mit which says that it was implemented the 09/12/15 (from timestamp), but it sure doesn't work in Safari 9.1
I started to extend the EventTarget
interface by adding some useful prototypes
but then I tested it on Safari 8 and get :
[Error] ReferenceError: Can't find variable: EventTarget
I found on MDN that "window.EventTarget
does not exist" for Safari.
This question looks really interesting but it's about IE8.
So, I want to know if a reference to the EventTarget interface is accessible on Safari, or a workaround to use code like EventTarget.prototype.hasEventListener
and EventTarget.prototype.hasEventListener
without getting any errors on Safari ?
Edit I found an interesting mit which says that it was implemented the 09/12/15 (from timestamp), but it sure doesn't work in Safari 9.1
Share Improve this question edited May 23, 2017 at 11:53 CommunityBot 11 silver badge asked Apr 17, 2016 at 11:06 PaulCoPaulCo 1,4875 gold badges18 silver badges34 bronze badges2 Answers
Reset to default 6Workaround :
I simply used the Element
interface as a fallback for Safari
var EventTarget = EventTarget || Element;
EventTarget.prototype.addEventListener = function(){/*Some magic here*/};
I also checked that Element inherits prototypes
from the EventTarget interface and it does ! (document.body.addEventListener == EventTarget.prototype.addEventListener
returned true
)
Safari just doesn't allow you to use the EventTarget
interface in your own objects other than DOM elements. So I simply replicated the class to do it.
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
}
}
本文标签: javascriptEventTarget interface in safariStack Overflow
版权声明:本文标题:javascript - EventTarget interface in safari - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741529290a2383657.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论