functioncrossWindowViaBrowser(url, target, opts, key, timeout) { let defer = Promise.defer() let resolve = defer.resolve.bind(defer) let reject = defer.reject.bind(defer) let promise = defer.promise let timing
let win = window.open(url, target, utils.buildOpenWindowOptions(opts))
let onMessage = e => { let data = e.data || {} if (data.type === 'cross-window' && data.key === key) { parseResult(data.result, resolve, reject) } }
// close(貌似)没有可用的事件,`win.addEventListener('close')`没用的样子 // `win.addEventListener`不好用的问题也可能是因为跨域,真是蛋疼啊 // 于是轮询`closed`属性吧 let pollingClosed = setInterval(() => { if (win.closed) { reject(newError(ErrorType.CANCELED)) } }, POLLING_INTERVAL)
functioncrossWindowViaCordovaIAB(url, target, opts, key, timeout) { let defer = Promise.defer() let resolve = defer.resolve.bind(defer) let reject = defer.reject.bind(defer) let promise = defer.promise let timing
let win = cordova.InAppBrowser.open(url, target, utils.buildOpenWindowOptions(opts)) // cordova的InAppBrowser没有window.opener对象,只能使用轮询罢。。 const code = `(function() { var key = '${key}' var data = localStorage.getItem(key) if (data !== null) { localStorage.removeItem(key) return data } return false })()`
let poll = () => { win.executeScript({ code: code }, ret => { if (ret[0] === false) { // 等待 } else { clearInterval(pollingData) parseResult(ret[0], resolve, reject) } }) } let pollingData = setInterval(poll, POLLING_INTERVAL)
// 窗口关闭时`reject` // 正常流程上面`resolve`后才会`win.close()`,所以这里再`reject`也不会有影响 win.addEventListener('exit', e => { reject(newError(ErrorType.CANCELED)) })