Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,29 @@ Since modern browsers have native cross-document communication method(the PostMe
messenger.send(msg);

6. 现在看到iframe收到消息的alert提示了吗?

## Demo ##
<a href="http://biqing.github.io/labs/messenger/parent.html">http://biqing.github.io/labs/messenger/parent.html</a>


或者用Node.js开启测试服务器,在`test`文件夹内的:
``
$ node server
``
然后打开该地址:<a href="http://locallhost:80/">locallhost:80</a>进行测试。
## 关于消息安全性 ##
由于任何iframe都可以收到广播的消息,建议传递消息时使用JSON String的形式,使用一个字段做消息有效性的验证。如果怕一个固定值(如项目名)不安全,可以使用一个简单的加密算法,并对业务脚本进行压缩混淆,此时的安全风险可以降到最低。

## 问题与建议 ##
使用中难免遇到问题,欢迎提问与建议 : )

[提交Issue](https://github.com/biqing/MessengerJS/issues/new)
[提交Issue](https://github.com/biqing/MessengerJS/issues/new)

# 根据前辈的Messenger写成了Messenger2 #
支持消息标记,比如监听一个名为 `test`的消息名称,发送的时候只发送消息个`test`的监听事件。

//iframe 1
ifr.listen('test',function(data){
console.log('post'+data+'from test');
});
//iframe 2
ifr2.to('ifr',0).post('test','test1');
99 changes: 99 additions & 0 deletions messenger2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
window.Messenger = (function(w,jQuery){
var prefix = '[_Project_Name]';

var ie = w.navigator.appName !== 'Netscape';
var parent = w.parent;
var nv = ie ? parent.navigator : void(0);

var Messenger = function (myName){
if(ie)this.self = nv[myName] = new Watcher();
this.evNames = {};
this.data = [];
return this;
};

var iePostMessage = {};
var usePostMessage = {};
//ie下的通信
//监视器
function Watcher(){
this.targets = {};
}
Watcher.prototype.addListener = function(evName,callback){
var targets = this.targets;
targets[evName] = callback;
};
Watcher.prototype.emit = function(evName,msg){
var targets = this.targets;
targets[evName](msg);
};
//ie post
iePostMessage.to = function(target,n){
this.tName = target;
return this;
};
iePostMessage.post = function(evName,msg){
var self = this;
var name = self.tName;
parent['ifr'].onload = function(){
self.target = nv[name];
self.target.emit(evName,msg);
}
return this;
};
iePostMessage.listen = function(evName,callback){
this.self.addListener(evName,callback);
return this;
};
//post message
usePostMessage.post = function(evName,msg){
var self = this;
var data = self.data;
var tg = self.target;
data.push({name:evName,msg:msg});
self._onload(function(){
tg.contentWindow.postMessage(data,tg.src);
});
return this;
};
usePostMessage.to = function(target,n){
var self = this;
self.tName = target;
if(n === void(0)){
self.target = document.querySelector('#'+self.tName);
}else{
self.ftf = !0;
self.target = {contentWindow : parent.frames[n],src:'*'}
}
return this;
};
usePostMessage.listen = function(evName,callback){
var self = this;
var name = evName;
var names = self.evNames;
names[name] = callback;
var wrap = function(event){
var data = event.data;
var ns = names;
var n = name;
data.forEach(function(v){
var evN = v.name;
if(n && n!==evN)return;
var msg = v.msg;
if(n==evN || (!n && ns[evN]))ns[evN](msg);
});
};
w.onmessage = wrap;
return this;
};
Messenger.prototype = ie ? iePostMessage : usePostMessage;
Messenger.prototype._onload = function(fn){
var self = this;
if(self.ftf){
fn();
}else if(w == parent){
self.target.onload = fn;
}
}
return Messenger;
})(window,window.jQuery);
86 changes: 43 additions & 43 deletions demo/child.html → test/child.html
Original file line number Diff line number Diff line change
@@ -1,44 +1,44 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>iframe communication (child window page)</title>
<script src="messenger.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<p>
<span class="label label-danger">child window</span>
This is a child window under the domain:
<script>document.write('(' + location.protocol + '//' + location.host + ')');</script>
</p>
<p>
<input type="text" placeholder="输入消息" id="message" />
<button type="button" class="btn btn-info" onclick="sendMessage('parent');">send to parent</button>
</p>
<pre id="output" class="alert alert-warning"></pre>
</div>
<script>
var messenger = new Messenger('childWindow', 'MessengerDemo'),
input = document.getElementById('message');
messenger.listen(function (msg) {
var newline = '\n';
var text = document.createTextNode(msg + newline);
document.getElementById('output').appendChild(text);
});
messenger.addTarget(window.opener, 'parent');
function sendMessage(name) {
var msg = input.value;
messenger.targets[name].send("message from childWindow: " + msg);
input.value = '';
}
</script>
</body>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>iframe communication (child window page)</title>
<script src="messenger.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<p>
<span class="label label-danger">child window</span>
This is a child window under the domain:
<script>document.write('(' + location.protocol + '//' + location.host + ')');</script>
</p>

<p>
<input type="text" placeholder="输入消息" id="message" />
<button type="button" class="btn btn-info" onclick="sendMessage('parent');">send to parent</button>
</p>
<pre id="output" class="alert alert-warning"></pre>
</div>

<script>
var messenger = new Messenger('childWindow', 'MessengerDemo'),
input = document.getElementById('message');

messenger.listen(function (msg) {
var newline = '\n';
var text = document.createTextNode(msg + newline);
document.getElementById('output').appendChild(text);
});

messenger.addTarget(window.opener, 'parent');

function sendMessage(name) {
var msg = input.value;
messenger.targets[name].send("message from childWindow: " + msg);
input.value = '';
}
</script>
</body>
</html>
106 changes: 53 additions & 53 deletions demo/iframe1.html → test/iframe1.html
Original file line number Diff line number Diff line change
@@ -1,53 +1,53 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>iframe communication (iframe page)</title>
<script src="messenger.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<p>
<span class="label label-danger">iframe1</span>
This is a iframe under the domain:
<script>document.write('(' + location.protocol + '//' + location.host + ')');</script>
</p>
<p>
<input type="text" placeholder="输入消息" id="message" />
<button type="button" class="btn btn-primary" onclick="sendMessage('parent');">send to parent</button>
<button type="button" class="btn btn-primary" onclick="sendMessage('iframe2');">send to iframe2</button>
<button type="button" class="btn btn-success" onclick="sendAll();">send to all</button>
</p>
<pre id="output" class="alert alert-warning"></pre>
</div>
<script>
var messenger = new Messenger('iframe1', 'MessengerDemo'),
input = document.getElementById('message');
messenger.listen(function (msg) {
var newline = '\n';
var text = document.createTextNode(msg + newline);
document.getElementById('output').appendChild(text);
});
messenger.addTarget(window.parent, 'parent');
messenger.addTarget(window.parent.frames[1], 'iframe2');
function sendMessage(name) {
var msg = input.value;
messenger.targets[name].send("message from iframe1: " + msg);
input.value = '';
}
function sendAll() {
var msg = input.value;
messenger.send("message from iframe1: " + msg);
input.value = '';
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>iframe communication (iframe page)</title>
<script src="messenger.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<p>
<span class="label label-danger">iframe1</span>
This is a iframe under the domain:
<script>document.write('(' + location.protocol + '//' + location.host + ')');</script>
</p>

<p>
<input type="text" placeholder="输入消息" id="message" />
<button type="button" class="btn btn-primary" onclick="sendMessage('parent');">send to parent</button>
<button type="button" class="btn btn-primary" onclick="sendMessage('iframe2');">send to iframe2</button>
<button type="button" class="btn btn-success" onclick="sendAll();">send to all</button>
</p>
<pre id="output" class="alert alert-warning"></pre>
</div>

<script>
var messenger = new Messenger('iframe1', 'MessengerDemo'),
input = document.getElementById('message');

messenger.listen(function (msg) {
var newline = '\n';
var text = document.createTextNode(msg + newline);
document.getElementById('output').appendChild(text);
});

messenger.addTarget(window.parent, 'parent');
messenger.addTarget(window.parent.frames[1], 'iframe2');

function sendMessage(name) {
var msg = input.value;
messenger.targets[name].send("message from iframe1: " + msg);
input.value = '';
}

function sendAll() {
var msg = input.value;
messenger.send("message from iframe1: " + msg);
input.value = '';
}
</script>
</body>
</html>
Loading