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; |