Skip to content

Instantly share code, notes, and snippets.

@Caldis
Created March 1, 2017 17:11
Show Gist options
  • Save Caldis/446369be7614820f02ef10b9d0249daf to your computer and use it in GitHub Desktop.
Save Caldis/446369be7614820f02ef10b9d0249daf to your computer and use it in GitHub Desktop.
GlobalEvent.js
// 全局事件工具类
// 放全局事件的对象
const eventDOM = document.querySelector('html');
// 全局事件的数据
window["eventOBJ"] = {}; const eventOBJ = window.eventOBJ;
// 全局事件的回调函数引用
window["eventCAB"] = {}; const eventCAB = window.eventCAB;
export const GlobalEvent = {
// 添加对应事件的 Handler
addEventHandler: (type, handler, cleanBeforeAdd) => {
// 定义事件名
const typeName = "on" + type;
// 初始化对应类型的全局事件的回调函数引用
if (!eventCAB[typeName]) eventCAB[typeName] = [];
// 如果有存在的事件, 则先移除
if (cleanBeforeAdd && eventCAB[typeName].length) {
eventCAB[typeName].forEach(eventHandler => {
GlobalEvent.removeEventHandler(type, eventHandler);
});
eventCAB[typeName] = [];
}
// 保存 handler 的句柄, handler 接受的的参数是全局对象中的 eventOBJ.type 的对应值
const eventHandler = () => { handler(window.eventOBJ[type]) };
eventCAB[typeName].push(eventHandler);
// 绑定事件
if (eventDOM.addEventListener) {
eventDOM.addEventListener(typeName, eventHandler, false);
} else if (eventDOM.attachEvent) {
eventDOM.attachEvent(typeName, eventHandler);
} else {
eventDOM[typeName] = eventHandler;
}
},
dispatchEvent: (type, data) => {
// 先把数据存到全局变量中
window.eventOBJ[type] = data;
// 再发送事件
const typeName = "on" + type;
if (eventDOM.dispatchEvent) {
const event = new Event(typeName);
eventDOM.dispatchEvent(event);
} else if (document.createEvent) {
const event = document.createEvent('Event');
event.initEvent(typeName, true, true);
eventDOM.dispatchEvent(event);
}
},
// 移除对应事件的Handler
removeEventHandler: (type, handler) => {
// 定义事件名
const typeName = "on" + type;
// 移除事件
if (eventDOM.removeEventListener) {
eventDOM.removeEventListener(typeName, handler, false);
} else if (eventDOM.detachEvent) {
eventDOM.detachEvent(typeName, handler);
} else {
eventDOM[typeName] = null;
}
},
// 获取事件 (浏览器兼容)
getEvent: function (event) {
return event ? event : window.event;
},
// 获取事件目标 (浏览器兼容)
getTarget: function (event) {
return event.target || event.srcElement;
},
// 阻止事件默认行为
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 阻止事件冒泡
stopPropagation: function (event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment