152 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const upNativeComm = {};
 | ||
| const cmdQueue = {};
 | ||
| const SCHEME = "up";
 | ||
| 
 | ||
| let count = new Date().getTime();
 | ||
| 
 | ||
| upNativeComm.exec = function exec(cmd, option) {
 | ||
|   option = option || {};
 | ||
|   count += 1;
 | ||
|   const callbackId = count;
 | ||
|   option.callbackId = callbackId;
 | ||
|   cmdQueue[callbackId] = option.callback || function callback() {};
 | ||
|   delete option.callback;
 | ||
|   const url = `${SCHEME}://["${cmd}",${callbackId},${JSON.stringify(option)}]`;
 | ||
|   prompt("TITLE", url);
 | ||
| };
 | ||
| 
 | ||
| window.nativeCallback = function nativeCallback(callbackId, code, option) {
 | ||
|   if (cmdQueue[callbackId]) {
 | ||
|     cmdQueue[callbackId](code, option);
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| // /////////////////////////////////// 浜嬩欢鏈哄埗 ///////////////////////////////////
 | ||
| 
 | ||
| // 閫氱煡瀹㈡埛绔簨浠朵俊鎭<E4BF8A>
 | ||
| function notifyEvent(option) {
 | ||
|   const cmd = "up.event";
 | ||
|   upNativeComm.exec(cmd, option);
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * 鍒涘缓鍘熺敓鐨別vent瀵硅薄(鍏ㄥ眬鍑芥暟)
 | ||
|  * @param type 绫诲瀷
 | ||
|  * @param data 鏁版嵁
 | ||
|  * @returns {Event}
 | ||
|  */
 | ||
| window.gCreateEvent = function gCreateEvent(type, data) {
 | ||
|   const event = document.createEvent("Events");
 | ||
|   event.initEvent(type, false, false);
 | ||
|   if (data) {
 | ||
|     for (const i in data) {
 | ||
|       if (Object.prototype.hasOwnProperty.call(data, i)) {
 | ||
|         event[i] = data[i];
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   return event;
 | ||
| };
 | ||
| 
 | ||
| // 涓€涓被鍨嬩簨浠跺搴斾竴涓狤ventMeta瀹炰緥
 | ||
| const EventMeta = function EventMeta(type) {
 | ||
|   this.type = type;
 | ||
|   this.handleMap = {}; // 澶勭悊鍑芥暟Map
 | ||
|   this.count = 0;
 | ||
|   this.onHandleCountChange = null;
 | ||
| };
 | ||
| 
 | ||
| // 鍏ㄥ眬鍑芥暟
 | ||
| window.gEventHandleMap = {
 | ||
|   create(type) {
 | ||
|     window.gEventHandleMap[type] = new EventMeta(type);
 | ||
|     return window.gEventHandleMap[type];
 | ||
|   },
 | ||
|   count: 0, // 鍙ユ焺鏍囪瘑
 | ||
| };
 | ||
| 
 | ||
| EventMeta.prototype.addEvent = function addEvent(handle) {
 | ||
|   let flag = handle.upEventFlag;
 | ||
|   if (!flag) {
 | ||
|     window.gEventHandleMap.count += 1;
 | ||
|     flag = window.gEventHandleMap.count;
 | ||
|     handle.upEventFlag = flag;
 | ||
|   }
 | ||
| 
 | ||
|   // 鍚屼竴涓被鍨嬩簨浠剁粦瀹氬涓浉鍚岀殑澶勭悊鍑芥暟锛屽彧鎵ц涓€娆★紝鑻ユ兂鎵ц澶氭锛屽繀椤婚噰鐢ㄥ尶鍚嶇殑鏂瑰紡
 | ||
|   if (!this.handleMap[flag]) {
 | ||
|     this.handleMap[flag] = handle;
 | ||
|     this.count += 1;
 | ||
|     if (this.count === 1) {
 | ||
|       if (this.onHandleCountChange) {
 | ||
|         this.onHandleCountChange();
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| EventMeta.prototype.removeEvent = function removeEvent(handle) {
 | ||
|   const flag = handle.upEventFlag;
 | ||
|   if (this.handleMap[flag]) {
 | ||
|     delete this.handleMap[flag];
 | ||
|     this.count -= 1;
 | ||
|     if (this.count === 0) {
 | ||
|       if (this.onHandleCountChange) {
 | ||
|         this.onHandleCountChange();
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| EventMeta.prototype.fire = function fire(e) {
 | ||
|   if (this.count) {
 | ||
|     // copy澶勭悊鍑芥暟锛岄槻姝㈠湪璋冪敤澶勭悊鍑芥暟鐨勮繃绋嬩腑handleMap鍙戠敓鏀瑰彉
 | ||
|     const handles = [];
 | ||
|     let i = 0;
 | ||
|     const keys = Object.keys(this.handleMap);
 | ||
|     for (i = 0; i < keys.length; i += 1) {
 | ||
|       handles.push(this.handleMap[keys[i]]);
 | ||
|     }
 | ||
| 
 | ||
|     for (i = 0; i < handles.length; i += 1) {
 | ||
|       handles[i](e);
 | ||
|     }
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| // 娉ㄥ唽浜嬩欢(瀵瑰API)
 | ||
| upNativeComm.addEventListener = function addEventListener(type, handle) {
 | ||
|   let eventInstance = window.gEventHandleMap[type];
 | ||
|   if (!eventInstance) {
 | ||
|     eventInstance = window.gEventHandleMap.create(type);
 | ||
|     eventInstance.onHandleCountChange = function onHandleCountChange() {
 | ||
|       // 閫氱煡瀹㈡埛绔<E59F9B>
 | ||
|       notifyEvent({
 | ||
|         count: this.count,
 | ||
|         type,
 | ||
|       });
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   eventInstance.addEvent(handle);
 | ||
| };
 | ||
| 
 | ||
| // 绉婚櫎浜嬩欢(瀵瑰API)
 | ||
| upNativeComm.removeEventListener = function removeEventListener(type, handle) {
 | ||
|   const eventInstance = window.gEventHandleMap[type];
 | ||
|   if (eventInstance) {
 | ||
|     eventInstance.removeEvent(handle);
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| // 鍏ㄥ眬鍑芥暟浜嬩欢瑙﹀彂鍚庯紝瀹㈡埛绔皟鐢ㄧ殑鍑芥暟
 | ||
| window.nativeFireEvent = function nativeFireEvent(type, param) {
 | ||
|   const instance = window.gEventHandleMap[type];
 | ||
|   if (instance) {
 | ||
|     const evt = window.gCreateEvent(type, param);
 | ||
|     instance.fire(evt);
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| window.upPCNativeComm = upNativeComm;
 | 
