|
|
@@ -2,21 +2,50 @@
|
|
|
|
|
|
import { updateListeners } from 'core/vdom/helpers/update-listeners'
|
|
|
|
|
|
+let target: any
|
|
|
+
|
|
|
+function add (
|
|
|
+ event: string,
|
|
|
+ handler: Function,
|
|
|
+ once: boolean,
|
|
|
+ capture: boolean
|
|
|
+) {
|
|
|
+ if (capture) {
|
|
|
+ console.log('Weex do not support event in bubble phase.')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ 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, null, null, _target)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ target.addEvent(event, handler)
|
|
|
+}
|
|
|
+
|
|
|
+function remove (
|
|
|
+ event: string,
|
|
|
+ handler: any,
|
|
|
+ capture: any,
|
|
|
+ _target?: any
|
|
|
+) {
|
|
|
+ (_target || target).removeEvent(event)
|
|
|
+}
|
|
|
+
|
|
|
function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) {
|
|
|
if (!oldVnode.data.on && !vnode.data.on) {
|
|
|
return
|
|
|
}
|
|
|
const on = vnode.data.on || {}
|
|
|
const oldOn = oldVnode.data.on || {}
|
|
|
- updateListeners(on, oldOn, (event, handler, capture) => {
|
|
|
- if (capture) {
|
|
|
- console.log('Weex do not support event in bubble phase.')
|
|
|
- return
|
|
|
- }
|
|
|
- vnode.elm.addEvent(event, handler.bind(vnode.context))
|
|
|
- }, (event) => {
|
|
|
- vnode.elm.removeEvent(event)
|
|
|
- }, vnode.context)
|
|
|
+ target = vnode.elm
|
|
|
+ updateListeners(on, oldOn, add, remove, vnode.context)
|
|
|
}
|
|
|
|
|
|
export default {
|