123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /* 跨页面通信js */
- /**
- *
- * @param {*} pageName 页面名称
- */
- function applicationListener(curPageName) {
- var cache = {
- opens: [],
- };
- function getPageName(pageName, type) {
- return '[channel-message]' + pageName + ':' + (type || '');
- };
- function getPageRunningName(pageName) {
- return getPageName(pageName, 'running');
- }
- function getMessage(e) {
- if(cache[e.key]) {
- cache[e.key].forEach(handler => {
- handler(JSON.parse(e.newValue));
- });
- }
- }
- function removeHandler() {
- window.localStorage.removeItem(getPageRunningName(location.pathname));
- window.removeEventListener('storage', getMessage);
- cache.opens.forEach(tab => {
- tab.close();
- });
- }
- // 持续监听状态
- window.addEventListener('storage', getMessage);
- window.addEventListener('beforeunload', removeHandler);
- // 当前页
- window.localStorage.setItem(getPageRunningName(location.pathname), 'true');
- return {
- // 判断是否打开当前页
- isOpen(pageName) {
- return !!window.localStorage.getItem(getPageRunningName(pageName));
- },
- // 页面在线状态
- open(url) {
- if(/^[\\/]/.test(url)) {
- url = location.origin + url;
- }
- var url = new URL(url);
- if(this.isOpen(url.pathname)) return;
- cache.opens.push(window.open(url));
- },
- // 广播自身状态
- dispatch(payload) {
- window.localStorage.setItem(getPageName(curPageName), JSON.stringify(payload));
- },
- // 接收其他页面状态
- addEventListener(pageName, handler) {
- var type = getPageName(pageName);
- if(!cache[type]) {
- cache[type] = [];
- }
- cache[type].push(handler);
- // 历史消息需要推一次(避免open后没有数据)
- var payload = window.localStorage.getItem(getPageName(pageName));
- if(payload !== null) {
- handler(JSON.parse(payload));
- }
- },
- };
- }
|