MessengerMoudle.js
4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import Emiter from 'Emiter';
import Loger from 'Loger';
let loger = Loger.getLoger('MessengerMoudle');
class MessengerMoudle {
// 信使类
// 创建Messenger实例时指定, 必须指定Messenger的名字, (可选)指定项目名, 以避免Mashup类应用中的冲突
// !注意: 父子页面中projectName必须保持一致, 否则无法匹配
constructor(messengerName, projectName){
this.prefix = "[PROJECT_NAME]";
this.supportPostMessage = 'postMessage' in window;
this.targets = {};
this.name = messengerName;
this.listenFunc = [];
this.prefix = projectName || this.prefix;
this.initListen();
}
// Target 类, 消息对象
Target(target, name, prefix) {
let errMsg = '';
if (arguments.length < 2) {
errMsg = 'target error - target and name are both required';
} else if (typeof target != 'object') {
errMsg = 'target error - target itself must be window object';
} else if (typeof name != 'string') {
errMsg = 'target error - target name must be string type';
}
if (errMsg) {
//throw new Error(errMsg);
loger.warn(errMsg);
}
this.target = target;
this.name = name;
this.prefix = prefix;
}
targetSend(_targetObj,_msg,_supportPostMessage,_prefix,_name){
loger.log('_supportPostMessage',_supportPostMessage,'_prefix:'+_prefix,'_name:'+_name);
if (_supportPostMessage) {
// IE8+ 以及现代浏览器支持
if(_targetObj&&_targetObj.target){
_targetObj.target.postMessage(_prefix + '|' + _name + '__Messenger__' + _msg, '*');
}else{
loger.warn('第三方消息通道发送消息失败->target->',_targetObj);
}
}else {
// 兼容IE 6/7
try{
let targetFunc = window.navigator[_prefix + _name];
if (typeof targetFunc == 'function') {
targetFunc(_prefix + _msg, window);
} else {
//throw new Error("target callback function is not defined");
loger.warn('第三方消息通道发送消息失败->target callback function is not defined');
}
}catch (err){
loger.warn('第三方消息通道发送消息失败->',err.message);
}
}
}
// 添加一个消息对象
addTarget(target, name) {
let errMsg = '';
if (arguments.length < 2) {
errMsg = 'target error - target and name are both required';
} else if (typeof target != 'object') {
errMsg = 'target error - target itself must be window object';
} else if (typeof name != 'string') {
errMsg = 'target error - target name must be string type';
}
if (errMsg) {
loger.warn(errMsg);
}
//let targetObj = new Target(target, name, this.prefix);
this.supportPostMessage = 'postMessage' in window;
loger.log('addTarget->supportPostMessage',this.supportPostMessage);
let targetObj = new Object();
targetObj.target = target;
targetObj.name = name;
targetObj.targetSend=this.targetSend;
targetObj.prefix = this.prefix;
this.targets[name] = targetObj;
};
// 初始化消息监听
initListen () {
let self = this;
let generalCallback = function (_msg) {
let msgData;
if (typeof _msg == 'object' && _msg.data) {
msgData = _msg.data;
}
let msgPairs = msgData.split('__Messenger__');
let msg1 = msgPairs[1];
let pairs = msgPairs[0].split('|');
let prefix = pairs[0];
let name = pairs[1];
for (let i = 0; i < self.listenFunc.length; i++) {
if (prefix + name === self.prefix + self.name) {
self.listenFunc[i](msg1);
}
}
};
if (this.supportPostMessage) {
if ('addEventListener' in document) {
window.addEventListener('message', generalCallback, false);
} else if ('attachEvent' in document) {
window.attachEvent('onmessage', generalCallback);
}
} else {
// 兼容IE 6/7
window.navigator[this.prefix + this.name] = generalCallback;
}
};
// 监听消息
listen (callback) {
let i = 0;
let len = this.listenFunc.length;
let cbIsExist = false;
for (; i < len; i++) {
if (this.listenFunc[i] == callback) {
cbIsExist = true;
break;
}
}
if (!cbIsExist) {
this.listenFunc.push(callback);
}
};
// 注销监听
clear () {
this.listenFunc = [];
};
// 广播消息
send (msg) {
let targets = this.targets;
let target;
for (target in targets) {
if (targets.hasOwnProperty(target)) {
let targetObj= targets[target];
//console.log('target->', targetObj);
//targets[target].send(msg);
if(targetObj){
targetObj.targetSend(targetObj,msg,this.supportPostMessage,targetObj.prefix,targetObj.name);
}
}
}
};
}
export default MessengerMoudle;