const mediaQueryObservers = {} const listeners = {} // 用公用对象存储监听器 // 拼接媒体查询条件 function handleMediaQueryStr ($props) { let mediaQueryStr = [] const propsMenu = [ 'width', 'minWidth', 'maxWidth', 'height', 'minHeight', 'maxHeight', 'orientation' ] for (const item of propsMenu) { if (item !== 'orientation' && $props[item] !== '' && Number($props[item]) >= 0) { mediaQueryStr.push(`(${humpToLine(item)}: ${Number($props[item])}px)`) } if (item === 'orientation' && $props[item]) { mediaQueryStr.push(`(${humpToLine(item)}: ${$props[item]})`) } } mediaQueryStr = mediaQueryStr.join(' and ') return mediaQueryStr } function humpToLine (name) { return name.replace(/([A-Z])/g, '-$1').toLowerCase() } // 请求媒体查询对象 export function requestMediaQueryObserver ({ reqId, options }) { // 创建一个媒体查询对象 const mediaQueryObserver = mediaQueryObservers[reqId] = window.matchMedia(handleMediaQueryStr(options)) // 创建一个监听器 const listener = listeners[reqId] = e => { UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', { reqId, res: e.matches }) } listener(mediaQueryObserver) // 监听前执行一次媒体查询 mediaQueryObserver.addListener(listener) } // 销毁媒体查询对象 export function destroyMediaQueryObserver ({ reqId }) { const listener = listeners[reqId] // 需要移除的某个监听 const mediaQueryObserver = mediaQueryObservers[reqId] if (mediaQueryObserver) { mediaQueryObserver.removeListener(listener) // 移除监听 delete mediaQueryObservers[reqId] UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', { reqId, reqEnd: true }) } }