| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /* @flow */
- import { isDef, isUndef } from 'shared/util'
- import { updateListeners } from 'core/vdom/helpers/index'
- import { isIE, supportsPassive } from 'core/util/index'
- 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) {
- /* istanbul ignore if */
- if (isDef(on[RANGE_TOKEN])) {
- // IE input[type=range] only supports `change` event
- const event = isIE ? 'change' : 'input'
- on[event] = [].concat(on[RANGE_TOKEN], on[event] || [])
- delete on[RANGE_TOKEN]
- }
- // This was originally intended to fix #4521 but no longer necessary
- // after 2.5. Keeping it for backwards compat with generated code from < 2.4
- /* istanbul ignore if */
- if (isDef(on[CHECKBOX_RADIO_TOKEN])) {
- on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || [])
- delete on[CHECKBOX_RADIO_TOKEN]
- }
- }
- let target: any
- function createOnceHandler (event, handler, capture) {
- const _target = target // save current target element in closure
- return function onceHandler () {
- const res = handler.apply(null, arguments)
- if (res !== null) {
- remove(event, onceHandler, capture, _target)
- }
- }
- }
- function add (
- event: string,
- handler: Function,
- capture: boolean,
- passive: boolean
- ) {
- target.addEventListener(
- event,
- handler,
- supportsPassive
- ? { capture, passive }
- : capture
- )
- }
- function remove (
- event: string,
- handler: Function,
- capture: boolean,
- _target?: HTMLElement
- ) {
- (_target || target).removeEventListener(
- event,
- handler._withTask || 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, createOnceHandler, vnode.context)
- target = undefined
- }
- export default {
- create: updateDOMListeners,
- update: updateDOMListeners
- }
|