MessengerMoudle.js 4.8 KB
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;