* [html5] fix call loop.
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/31411dd4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/31411dd4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/31411dd4 Branch: refs/heads/0.16-dev Commit: 31411dd4afd383cb4a25bd666830615c9c14e6d5 Parents: 902a1f7 Author: MrRaindrop <tekk...@gmail.com> Authored: Fri Aug 25 15:19:01 2017 +0800 Committer: MrRaindrop <tekk...@gmail.com> Committed: Fri Aug 25 15:19:01 2017 +0800 ---------------------------------------------------------------------- html5/render/vue/README.md | 2 +- html5/render/vue/core/node.js | 33 +++++++++++++++++++++++++----- html5/render/vue/env/event-manager.js | 19 ++++++++--------- package.json | 2 +- packages/weex-vue-render/README.md | 2 +- packages/weex-vue-render/package.json | 2 +- 6 files changed, 41 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/README.md ---------------------------------------------------------------------- diff --git a/html5/render/vue/README.md b/html5/render/vue/README.md index 41df16b..bcdd2de 100644 --- a/html5/render/vue/README.md +++ b/html5/render/vue/README.md @@ -142,7 +142,7 @@ vue: { * fix scanning style in production with uglified code. -#### 0.12.6 +#### 0.12.8 * optimize event binding. http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/core/node.js ---------------------------------------------------------------------- diff --git a/html5/render/vue/core/node.js b/html5/render/vue/core/node.js index d38cafd..4cef067 100644 --- a/html5/render/vue/core/node.js +++ b/html5/render/vue/core/node.js @@ -54,6 +54,30 @@ function getListeners (vnode, evt) { } /** + * Instead of vue's invoker, this function should check if the binding function + * has a _weex_hook flag. If there is one, the handler should not be triggered. + * @param {Array | Function} fns + */ +export function applyFns (fns, ...args) { + if (Array.isArray(fns)) { + const cloned = fns.slice() + const len = cloned.length + for (let i = 0; i < len; i++) { + const fn = cloned[i] + if (fn._weex_hook) { + continue + } + fn.apply(null, args) + } + } + else { + if (!fns._weex_hook) { + fns.apply(null, args) + } + } +} + +/** * emit native events to enable v-on. * @param {VComponent} context: which one to emit a event on. * @param {array | object} events: extra events. You can pass in multiple arguments here. @@ -90,11 +114,8 @@ export function createEventMap (context, ...events) { if (len > 0) { let idx = 0 while (idx < len) { - let on = ons[idx] - if (on && on.fn) { - on = on.fn - } - on && on.call(vm, e) + const on = ons[idx] + applyFns(on.fns, e) idx++ } // once a parent node (or self node) has triggered the handler, then @@ -107,6 +128,8 @@ export function createEventMap (context, ...events) { vm = vm.$parent } } + // flag to distinguish from user-binding listeners. + handler._weex_hook = true } if (!eventMap[evtName]) { eventMap[evtName] = [] http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/env/event-manager.js ---------------------------------------------------------------------- diff --git a/html5/render/vue/env/event-manager.js b/html5/render/vue/env/event-manager.js index 3ecf618..c19a649 100644 --- a/html5/render/vue/env/event-manager.js +++ b/html5/render/vue/env/event-manager.js @@ -19,6 +19,7 @@ import config from '../config' import { createEvent, supportsPassive } from '../utils' +import { applyFns } from '../core' const gestureEvents = config.gestureEvents const nativeEvents = ['click', 'touchstart', 'touchmove', 'touchend'] @@ -112,13 +113,11 @@ function _init (doc) { if (len > 0) { for (let i = 0; i < len; i++) { - let handler = ons[i] - if (handler && handler.fn) { - handler = handler.fn - } - // create a no bubble event. - const newEvt = createEvent(el, evt) - handler && handler.call(vm, newEvt) + const handler = ons[i] + const newEvt = evtName === 'click' + ? createEvent(el, evtName) + : e + applyFns(handler.fns, newEvt) } e._triggered = { target: vm.$el } disposed = true @@ -127,8 +126,8 @@ function _init (doc) { /** * if the handler is binding on a <a> element, should trigger * the handler first and then jump to href. - * NOTE: if target==='_blank' then do no jumping and dispatch the - * click event to document.body for further disposing. + * NOTE: if target==='_blank' then do no jumping and leave it + * to users binding handlers for further disposing. */ if (evtName === 'click' && isANode(elm)) { const href = elm.getAttribute('href') @@ -138,7 +137,7 @@ function _init (doc) { location.href = href } else { - document.body.dispatchEvent(e) + // do nothing. } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/package.json ---------------------------------------------------------------------- diff --git a/package.json b/package.json index 47b84dd..0b79cde 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "subversion": { "browser": "0.5.0", "framework": "0.21.11", - "vue-render": "0.12.7", + "vue-render": "0.12.8", "transformer": ">=0.1.5 <0.5" }, "description": "A framework for building Mobile cross-platform UI", http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/packages/weex-vue-render/README.md ---------------------------------------------------------------------- diff --git a/packages/weex-vue-render/README.md b/packages/weex-vue-render/README.md index 41df16b..bcdd2de 100644 --- a/packages/weex-vue-render/README.md +++ b/packages/weex-vue-render/README.md @@ -142,7 +142,7 @@ vue: { * fix scanning style in production with uglified code. -#### 0.12.6 +#### 0.12.8 * optimize event binding. http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/packages/weex-vue-render/package.json ---------------------------------------------------------------------- diff --git a/packages/weex-vue-render/package.json b/packages/weex-vue-render/package.json index 1262ef1..b29cfdc 100644 --- a/packages/weex-vue-render/package.json +++ b/packages/weex-vue-render/package.json @@ -1,6 +1,6 @@ { "name": "weex-vue-render", - "version": "0.12.7", + "version": "0.12.8", "description": "Weex built-in components for Vue 2.x.", "license": "Apache-2.0", "main": "dist/index.common.js",