vimo
Version:
A Vue2.x UI Project For Mobile & HyBrid
64 lines (58 loc) • 2.15 kB
JavaScript
/**
* 判断的当前浏览器是否支持isPassive属性
* @return {Boolean}
* */
function isPassive () {
var supportsPassiveOption = false
try {
/* istanbul ignore next */
window.addEventListener(
'test',
null,
Object.defineProperty({}, 'passive', {
get: function () {
supportsPassiveOption = true
}
})
)
} catch (e) {}
return supportsPassiveOption
}
/**
*
* 给addEventListener增加passive属性, 如果不支持将降级使用!!opts.capture, 事件的关闭需要自己手动解除, 切记!!
* @param {Element|Window} ele - 监听的元素
* @param {string} eventName - 监听的名称
* @param {function} callback - 回调
* @param {object} [opts] - addEventListener的第三个参数 EventListenerOptions
* @param {object} [opts.capture] - capture
* @param {object} [opts.passive] - passive
* @param {Array} [unregisterListenersCollection=[]] - 如果提供Function[], 则unReg将压如这个列表中
* @return {Function} - 返回removeEventListener的函数
*/
export default function registerListener (ele,
eventName,
callback,
opts = {},
unregisterListenersCollection = []) {
// use event listener options when supported
// otherwise it's just a boolean for the "capture" arg
const listenerOpts = isPassive()
? {
capture: !!opts.capture,
passive: !!opts.passive
}
: !!opts.capture
// use the native addEventListener
ele['addEventListener'](eventName, callback, listenerOpts)
let unReg = function unregisterListener () {
ele['removeEventListener'](eventName, callback, listenerOpts)
}
if (
unregisterListenersCollection &&
Array.isArray(unregisterListenersCollection)
) {
unregisterListenersCollection.push(unReg)
}
return unReg
}