const PICKER_ID = '__UNIAPP_PICKER' export const PICKER_PATH = '_www/__uniapppicker.html' let pickerWebview = null let pickerWebviewCreated = false let _exists = null let callbacks = null export function exists (callback) { if (_exists !== null) { callback(_exists) return } if (callbacks) { callbacks.push(callback) return } callbacks = [callback] function success (exists) { _exists = exists callbacks.forEach(callback => callback(exists)) callbacks = null } plus.io.resolveLocalFileSystemURL(PICKER_PATH, () => { success(true) }, () => { success(false) }) } let _pickerHideCallback export function initPicker () { if (pickerWebview) { return } pickerWebview = plus.webview.getWebviewById(PICKER_ID) if (pickerWebview) { pickerWebviewCreated = true } else { pickerWebview = plus.webview.create(PICKER_PATH, PICKER_ID, { popGesture: 'none', background: 'transparent', backButtonAutoControl: 'hide', render: 'always', kernel: 'WKWebview', bounce: 'none', cachemode: 'noCache' }) window.__pickerCallback = function () { delete window.__pickerCallback pickerWebviewCreated = true } } pickerWebview.addEventListener('hide', () => { _pickerHideCallback && _pickerHideCallback() _pickerHideCallback = null }) } export function showPicker (data = {}, callback) { data.id = plus.webview.currentWebview().id pickerWebview.show('fade-in') let res _pickerHideCallback = function () { callback(res || { event: 'cancel' }) } window.__pickerCallback = function ({ event = 'cancel', column, value = -1 }) { if (event === 'created' && pickerWebview) { pickerWebviewCreated = true pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`) return } if (event === 'columnchange' && pickerWebview) { callback({ event, column, value }) } if (event === 'change' || event === 'cancel') { // 赋值为空函数避免 picker-webview 产生多余通讯报错 window.__pickerCallback = function () { } res = { event, value } pickerWebview.hide('fade-out', 100) } } if (pickerWebviewCreated) { pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`) } } export function updatePicker (data) { if (pickerWebviewCreated) { pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`) } }