UNPKG

vue

Version:

Reactive, component-oriented view layer for modern web interfaces.

83 lines (75 loc) 2.25 kB
/* @flow */ import { isDef, isUndef } from 'shared/util' import { updateListeners } from 'core/vdom/helpers/index' import { isChrome, isIE, supportsPassive } from 'core/util/env' import { RANGE_TOKEN, CHECKBOX_RADIO_TOKEN } from 'web/compiler/directives/model' // normalize v-model event tokens that can only be determined at runtime. // it's important to place the event as the first in the array because // the whole point is ensuring the v-model callback gets called before // user-attached handlers. function normalizeEvents (on) { let event /* istanbul ignore if */ if (isDef(on[RANGE_TOKEN])) { // IE input[type=range] only supports `change` event event = isIE ? 'change' : 'input' on[event] = [].concat(on[RANGE_TOKEN], on[event] || []) delete on[RANGE_TOKEN] } if (isDef(on[CHECKBOX_RADIO_TOKEN])) { // Chrome fires microtasks in between click/change, leads to #4521 event = isChrome ? 'click' : 'change' on[event] = [].concat(on[CHECKBOX_RADIO_TOKEN], on[event] || []) delete on[CHECKBOX_RADIO_TOKEN] } } let target: HTMLElement function add ( event: string, handler: Function, once: boolean, capture: boolean, passive: boolean ) { if (once) { const oldHandler = handler const _target = target // save current target element in closure handler = function (ev) { const res = arguments.length === 1 ? oldHandler(ev) : oldHandler.apply(null, arguments) if (res !== null) { remove(event, handler, capture, _target) } } } target.addEventListener( event, handler, supportsPassive ? { capture, passive } : capture ) } function remove ( event: string, handler: Function, capture: boolean, _target?: HTMLElement ) { (_target || target).removeEventListener(event, handler, capture) } function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) { if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) { return } const on = vnode.data.on || {} const oldOn = oldVnode.data.on || {} target = vnode.elm normalizeEvents(on) updateListeners(on, oldOn, add, remove, vnode.context) } export default { create: updateDOMListeners, update: updateDOMListeners }