212 lines
5.0 KiB
JavaScript
212 lines
5.0 KiB
JavaScript
/**
|
||
* @author jianqiang3@staff.sina.com.cn
|
||
*/
|
||
(function(){
|
||
|
||
var count = 0, timer, callback;
|
||
|
||
var $E = function(id) {
|
||
if (typeof id === 'string') {
|
||
return document.getElementById(id);
|
||
}
|
||
else {
|
||
return id;
|
||
}
|
||
};
|
||
|
||
function trim(str) {
|
||
if(typeof str !== 'string'){
|
||
throw 'trim need a string as parameter';
|
||
}
|
||
if(typeof str.trim === 'function'){
|
||
return str.trim();
|
||
}else{
|
||
return str.replace(/^(\u3000|\s|\t|\u00A0)*|(\u3000|\s|\t|\u00A0)*$/g, '');
|
||
}
|
||
}
|
||
|
||
function addEvent (sNode, sEventType, oFunc) {
|
||
var oElement = $E(sNode);
|
||
if (oElement == null) {
|
||
return false;
|
||
}
|
||
sEventType = sEventType || 'click';
|
||
if ((typeof oFunc).toLowerCase() != "function") {
|
||
return;
|
||
}
|
||
if (oElement.attachEvent) {
|
||
oElement.attachEvent('on' + sEventType, oFunc);
|
||
}
|
||
else if (oElement.addEventListener) {
|
||
oElement.addEventListener(sEventType, oFunc, false);
|
||
}
|
||
else {
|
||
oElement['on' + sEventType] = oFunc;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* query to json
|
||
* @param {Object} QS
|
||
* @param {Object} isDecode
|
||
*/
|
||
function queryToJson(QS, isDecode) {
|
||
var _Qlist = trim(QS).split("&");
|
||
var _json = {};
|
||
var _fData = function(data){
|
||
if(isDecode){
|
||
return decodeURIComponent(data);
|
||
}else{
|
||
return data;
|
||
}
|
||
};
|
||
for(var i = 0, len = _Qlist.length; i < len; i++){
|
||
if(_Qlist[i]){
|
||
_hsh = _Qlist[i].split("=");
|
||
_key = _hsh[0];
|
||
_value = _hsh[1];
|
||
|
||
// 如果只有key没有value, 那么将全部丢入一个$nullName数组中
|
||
if(_hsh.length < 2){
|
||
_value = _key;
|
||
_key = '$nullName';
|
||
}
|
||
// 如果缓存堆栈中没有这个数据
|
||
if(!_json[_key]) {
|
||
_json[_key] = _fData(_value);
|
||
}
|
||
// 如果堆栈中已经存在这个数据,则转换成数组存储
|
||
else {
|
||
if($.core.arr.isArray(_json[_key]) != true) {
|
||
_json[_key] = [_json[_key]];
|
||
}
|
||
_json[_key].push(_fData(_value));
|
||
}
|
||
}
|
||
}
|
||
return _json;
|
||
}
|
||
|
||
function jsonToQuery(JSON,isEncode) {
|
||
var _fdata = function(data,isEncode){
|
||
data = data == null? '': data;
|
||
data = trim(data.toString());
|
||
if(isEncode){
|
||
return encodeURIComponent(data);
|
||
}else{
|
||
return data;
|
||
}
|
||
};
|
||
|
||
var _Qstring = [];
|
||
if(typeof JSON == "object"){
|
||
for(var k in JSON){
|
||
if(JSON[k] instanceof Array){
|
||
for(var i = 0, len = JSON[k].length; i < len; i++){
|
||
_Qstring.push(k + "=" + _fdata(JSON[k][i],isEncode));
|
||
}
|
||
}else{
|
||
if(typeof JSON[k] != 'function'){
|
||
_Qstring.push(k + "=" +_fdata(JSON[k],isEncode));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(_Qstring.length){
|
||
return _Qstring.join("&");
|
||
}else{
|
||
return "";
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 初始化监听程序
|
||
*/
|
||
var init = function(){
|
||
if (window.postMessage) {
|
||
addEvent(window, "message", messageHanlder);
|
||
} else {
|
||
messagePoll(window, "name");
|
||
};
|
||
};
|
||
|
||
/**
|
||
* window.name监听方式
|
||
* @param {Object} oWindow
|
||
* @param {Object} sName
|
||
*/
|
||
var messagePoll = function(oWindow, sName) {
|
||
var hash = "";
|
||
/**
|
||
* 处理处理
|
||
* @param {Object} name 返回的window.name
|
||
*/
|
||
function parseData(name) {
|
||
var oData = name.split("^").pop().split("&");
|
||
return {
|
||
domain: oData[0], //域名
|
||
data: window.unescape(oData[1]) //数据
|
||
}
|
||
}
|
||
/**
|
||
* 获取window.name
|
||
*/
|
||
function getWinName() {
|
||
var name = oWindow[sName]; //=window.name
|
||
|
||
//如果和上次不一样,则获取新数据
|
||
if (name != hash) {
|
||
hash = name;
|
||
messageHanlder(parseData(name));
|
||
}
|
||
}
|
||
timer = setInterval(getWinName, 1000 / 20);
|
||
};
|
||
|
||
/**
|
||
* 消息监听函数
|
||
* @param {Object} oEvt 监听到的数据对象
|
||
*/
|
||
var messageHanlder = function(oEvt) {
|
||
oEvt = oEvt || window.event;
|
||
var data = unescape(oEvt.data);
|
||
var args = queryToJson(data);
|
||
//执行回调
|
||
callback && callback(args);
|
||
};
|
||
init();
|
||
|
||
|
||
/*---------------------------公开函数------------------------------*/
|
||
|
||
window.XD = {};
|
||
/**
|
||
* 发送跨域消息
|
||
* @param {Object} target //iframe或parent,如果为iframe,则需要传iframe.contentWindow对象
|
||
* @param {Object} oArgs
|
||
*/
|
||
XD.sendMessage = function(target, oArgs) {
|
||
if(!target) return;
|
||
if(typeof target != 'object') return;
|
||
|
||
var data = jsonToQuery(oArgs);
|
||
data = escape(data);
|
||
|
||
if (window.postMessage) {
|
||
// 此处一定要用“*”,否则数据不能返回,参考:http://dev.w3.org/html5/postmsg/#dom-window-postmessage
|
||
target.postMessage(data, "*");
|
||
} else {
|
||
target.name = (new Date()).getTime() + (count++) + "^" + document.domain + "&" + window.escape(data);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 接收跨域传递的消息,只需开发者重写即可
|
||
* @param {Object} data json数据
|
||
*/
|
||
XD.receiveMessage = function(oCallback) {
|
||
callback = oCallback;
|
||
};
|
||
|
||
})(); |