You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by da...@apache.org on 2017/09/26 04:23:37 UTC
[38/46] incubator-weex git commit: * [html5] fix trigger click
problem.
* [html5] fix trigger click problem.
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b7fa6b0f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b7fa6b0f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b7fa6b0f
Branch: refs/heads/0.16-dev
Commit: b7fa6b0ff7af1b4d18823709fe43569cc5b69b9a
Parents: 6ec5a50
Author: MrRaindrop <te...@gmail.com>
Authored: Sat Sep 23 18:51:20 2017 +0800
Committer: MrRaindrop <te...@gmail.com>
Committed: Sat Sep 23 18:51:20 2017 +0800
----------------------------------------------------------------------
html5/render/vue/README.md | 4 ++
html5/render/vue/env/event-manager.js | 88 +++++++++++++++---------------
package.json | 2 +-
packages/weex-vue-render/README.md | 4 ++
packages/weex-vue-render/package.json | 2 +-
5 files changed, 55 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b7fa6b0f/html5/render/vue/README.md
----------------------------------------------------------------------
diff --git a/html5/render/vue/README.md b/html5/render/vue/README.md
index 0554334..31646a2 100644
--- a/html5/render/vue/README.md
+++ b/html5/render/vue/README.md
@@ -172,6 +172,10 @@ vue: {
* fix loading & refresh: pulling down wrongly triggered.
+#### 0.12.15
+
+* not to prevent default behaviour of click events unless the click-binding element is inside a `<a>` link, or it is a `<a>` link and has a `prevent` attribute on it.
+
## component -> dom map
| component | dom element | children | note |
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b7fa6b0f/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 16057ca..e637b7d 100644
--- a/html5/render/vue/env/event-manager.js
+++ b/html5/render/vue/env/event-manager.js
@@ -35,6 +35,15 @@ function isANode (el) {
return el.tagName.toLowerCase() === 'a'
}
+function isInANode (el) {
+ let parent = el.parentElement
+ while (parent && parent !== document.body) {
+ if (parent.tagName === 'A') { return true }
+ parent = parent.parentElement
+ }
+ return false
+}
+
/**
* get listeners from on config and v-on binding.
* v-on binding has a priority over on config.
@@ -87,72 +96,65 @@ function _init (doc) {
return
}
let disposed = false
- let evtName = e.type
- /**
- * take full control of redirection of <a> element.
- */
- if (evtName === 'click') {
- // use '_triggered' to control bubbles event.
- e._triggered = { target: vm.$el }
- e.preventDefault()
- return
- }
+ const evtName = e.type
if (evtName === 'tap' && e._for !== 'weex') {
return
}
- else if (evtName === 'tap') {
- evtName = 'click'
- }
while (vm) {
const vnode = vm._vnode || vm.$vnode
const elm = vm.$el
- const ons = getListeners(vnode, evtName)
+ const ons = getListeners(vnode, evtName === 'tap' ? 'click' : evtName)
const len = ons && ons.length
if (len > 0) {
- for (let i = 0; i < len; i++) {
- const handler = ons[i]
- const newEvt = evtName === 'click'
- ? createEvent(el, evtName)
- : e
- applyFns(handler.fns, newEvt)
+ if (evtName !== 'click') {
+ for (let i = 0; i < len; i++) {
+ const handler = ons[i]
+ const newEvt = evtName === 'tap'
+ ? createEvent(el, 'click')
+ : e
+ newEvt._triggered = { target: elm }
+ applyFns(handler.fns, newEvt)
+ }
}
- e._triggered = { target: vm.$el }
+ e._triggered = { target: elm }
disposed = true
}
- /**
- * 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 leave it
- * to users binding handlers for further disposing.
- */
- if (evtName === 'click' && isANode(elm)) {
+ if (isANode(elm)
+ && (evtName === 'click' || evtName === 'tap')) {
const href = elm.getAttribute('href')
const voidHrefReg = /^\s*javascript\s*:\s*void\s*(?:\(\s*0\s*\)|0)\s*;?\s*$/
const prevent = elm.getAttribute('prevent')
- disposed = true
- /**
- * Give the chance to the listeners binding on doc or doc.body for
- * handling the a-jump.
- * Should set a _should_intercept_a_jump function on window to test
- * whether we should intercept the a-jump.
- */
- if (window._should_intercept_a_jump && window._should_intercept_a_jump(elm)
- || href.match(voidHrefReg)
- || prevent === '' || prevent === 'true') {
- // do nothing. leave it to the intercept handler.
+ if (window._should_intercept_a_jump && window._should_intercept_a_jump(elm)) {
+ // e._triggered should not be true since we left the intercepter to handle the event.
+ e._triggered = false
+ e.preventDefault()
+ disposed = true
}
- else if (href) {
- location.href = href
+ else if (href.match(voidHrefReg)
+ || prevent === '' || prevent === 'true') {
+ e._triggered = false
+ e.preventDefault()
}
- else if (process.env.NODE_ENV === 'development') {
- console.warn('[vue-render] If you want to use the A tag jump, set the href attribute')
+ else {
+ e._triggered = { target: elm }
+ disposed = true // handled by default behavior for clicking on a element.
}
}
+ /**
+ * If the click handler is binding on a element inside a <a> element,
+ * then should prevent default.
+ */
+ if (disposed && evtName === 'click' && isInANode(elm)) {
+ e._triggered = { target: elm }
+ e.preventDefault()
+ return
+ }
+
if (disposed) {
return
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b7fa6b0f/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 7176a73..cd90c76 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"subversion": {
"browser": "0.5.0",
"framework": "0.21.11",
- "vue-render": "0.12.14",
+ "vue-render": "0.12.15",
"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/b7fa6b0f/packages/weex-vue-render/README.md
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/README.md b/packages/weex-vue-render/README.md
index 0554334..31646a2 100644
--- a/packages/weex-vue-render/README.md
+++ b/packages/weex-vue-render/README.md
@@ -172,6 +172,10 @@ vue: {
* fix loading & refresh: pulling down wrongly triggered.
+#### 0.12.15
+
+* not to prevent default behaviour of click events unless the click-binding element is inside a `<a>` link, or it is a `<a>` link and has a `prevent` attribute on it.
+
## component -> dom map
| component | dom element | children | note |
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b7fa6b0f/packages/weex-vue-render/package.json
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/package.json b/packages/weex-vue-render/package.json
index b07535d..a08b4ce 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.14",
+ "version": "0.12.15",
"description": "Weex built-in components for Vue 2.x.",
"license": "Apache-2.0",
"main": "dist/index.common.js",