保护他人遗留的老我的项目相当头疼,遇到一个遗留的ifram模式做的一个我的项目,每次的交互都采纳一个一个来,本人保护的相当解体,重构客户也不违心。好吧,工夫紧急,简略封装一个事件机制来略微加重本人的麻烦吧。利用了localStorage的监听机制联合简略的事件总线机制来实现。
创立引入全局js
1.父页面引入parent.js
/** * @author DLLCN * @time 2020/8/28 4:57 下午 * @title 利用间事件交互 * @desc * */ window.gos = {event: {}}; gos.event.eventMap = new Map() gos.event.emit = function (eventType, data) { const time = new Date().getTime(); const event = {key: eventType, data: data, timestamp: time} const detail = JSON.stringify(event); localStorage.setItem(`gos.event.${eventType}`, detail) } gos.event.addEventListener = function (eventType, func) { let evtSet = gos.event.eventMap.get(eventType) if (!evtSet) { evtSet = new Set() gos.event.eventMap.set(eventType, evtSet) } evtSet.add(func) } gos.event.removeEventListener = function (eventType, func) { let evtSet = gos.event.eventMap.get(eventType) if (evtSet) { evtSet.delete(func) } } let oriSetItem = localStorage.setItem; localStorage.setItem = function (key, value) { //这里抛出自定义事件 var event = new Event("setItemEvent"); event.newValue = value; event.key = key; window.dispatchEvent(event); //实现原办法 oriSetItem.apply(this, arguments); } window.addEventListener('setItemEvent', e => { var str = e.key; if (/^gos\.event\..{1,}$/.test(str)) { const data = JSON.parse(e.newValue); let evtSet = gos.event.eventMap.get(data.key) if (evtSet) { for (let item of evtSet.values()) { item(data); } } } }, false)
2.子页面引入children.js
window.gos = top.gos || {};if(!top || !top.gos || JSON.stringify(top.gos) === '{}'){ console.error('主界面未引入js,只能应用本地事件服务,无奈父子交互!')}if (!gos.event) { // console.log('渲染本地事件服务!') gos.event = {}; /** * 事件 * @param {*} eventType * @param {*} data */ gos.event.eventMap = new Map() gos.event.emit = function (eventType, data) { const time = new Date().getTime(); const event = { key: eventType, data: data, timestamp: time } const detail = JSON.stringify(event); localStorage.setItem(`gos.event.${eventType}`, detail) } gos.event.addEventListener = function (eventType, func) { let evtSet = gos.event.eventMap.get(eventType) if (!evtSet) { evtSet = new Set() gos.event.eventMap.set(eventType, evtSet) } evtSet.add(func) } gos.event.removeEventListener = function (eventType, func) { let evtSet = gos.event.eventMap.get(eventType) if (evtSet) { evtSet.delete(func) } }}const oriSetItem = localStorage.setItem;localStorage.setItem = function (key, value) { //这里抛出自定义事件 var event = new Event("setItemEvent"); event.newValue = value; event.key = key; window.dispatchEvent(event); //实现原办法 oriSetItem.apply(this, arguments);}window.addEventListener('setItemEvent', e => { var str = e.key; if (/^gos\.event\..{1,}$/.test(str)) { const data = JSON.parse(e.newValue); let evtSet = gos.event.eventMap.get(data.key) if (evtSet) { for (let item of evtSet.values()) { item(data); } } }}, false)
应用办法
// 发送事件 gos.event.emit('test', { key: 'parent' }) // 接管事件 gos.event.addEventListener('test', () => { console.log('接管到事件。'); })
源码
原始链接:http://dllcny.com:10020/2021/03/18/ifram下的父子交互事件封装/
许可协定: 转载请保留原文链接及作者。