* [html5] add touch events & fix event mapping.

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/c4f461f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/c4f461f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/c4f461f3

Branch: refs/heads/0.16-dev
Commit: c4f461f34929a6c2f733047698ee4d565db001c1
Parents: 736772b
Author: MrRaindrop <tekk...@gmail.com>
Authored: Mon Jul 3 17:37:04 2017 +0800
Committer: MrRaindrop <tekk...@gmail.com>
Committed: Mon Jul 3 17:37:04 2017 +0800

----------------------------------------------------------------------
 .../vue/components/scrollable/list/index.js     |  3 +-
 .../vue/components/scrollable/scroller.js       |  3 +-
 .../vue/components/scrollable/waterfall.js      |  3 +-
 .../render/vue/components/slider/slideMixin.js  | 17 ++++---
 html5/render/vue/core/node.js                   | 51 ++++++++++++++++----
 html5/test/render/vue/core/node.js              |  4 +-
 6 files changed, 57 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/render/vue/components/scrollable/list/index.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/list/index.js 
b/html5/render/vue/components/scrollable/list/index.js
index e781fe9..79e6d7d 100644
--- a/html5/render/vue/components/scrollable/list/index.js
+++ b/html5/render/vue/components/scrollable/list/index.js
@@ -19,7 +19,6 @@
 import { extractComponentStyle, createEventMap } from '../../../core'
 import { scrollable } from '../../../mixins'
 // import { validateStyles } from '../../../validator'
-import { extend } from '../../../utils'
 import listMixin from './listMixin'
 
 export default {
@@ -66,7 +65,7 @@ export default {
       ref: 'wrapper',
       attrs: { 'weex-type': 'list' },
       staticClass: this.wrapperClass,
-      on: extend(createEventMap(this), {
+      on: createEventMap(this, {
         scroll: this.handleListScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/render/vue/components/scrollable/scroller.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/scroller.js 
b/html5/render/vue/components/scrollable/scroller.js
index 3151fae..1eebab3 100644
--- a/html5/render/vue/components/scrollable/scroller.js
+++ b/html5/render/vue/components/scrollable/scroller.js
@@ -19,7 +19,6 @@
 import { extractComponentStyle, createEventMap } from '../../core'
 import { scrollable } from '../../mixins'
 // import { validateStyles } from '../../validator'
-import { extend } from '../../utils'
 import listMixin from './list/listMixin'
 
 export default {
@@ -80,7 +79,7 @@ export default {
     return createElement('main', {
       ref: 'wrapper',
       attrs: { 'weex-type': 'scroller' },
-      on: extend(createEventMap(this), {
+      on: createEventMap(this, {
         scroll: this.handleScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/render/vue/components/scrollable/waterfall.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/scrollable/waterfall.js 
b/html5/render/vue/components/scrollable/waterfall.js
index 2239f00..012c1d2 100644
--- a/html5/render/vue/components/scrollable/waterfall.js
+++ b/html5/render/vue/components/scrollable/waterfall.js
@@ -23,7 +23,6 @@
  */
 import { extractComponentStyle, createEventMap } from '../../core'
 import { scrollable } from '../../mixins'
-import { extend } from '../../utils'
 
 const NORMAL_GAP_SIZE = 32
 const DEFAULT_COLUMN_COUNT = 1
@@ -325,7 +324,7 @@ export default {
     return createElement('main', {
       ref: 'wrapper',
       attrs: { 'weex-type': 'waterfall' },
-      on: extend(createEventMap(this), {
+      on: createEventMap(this, {
         scroll: this.handleScroll,
         touchstart: this.handleTouchStart,
         touchmove: this.handleTouchMove,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/render/vue/components/slider/slideMixin.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/components/slider/slideMixin.js 
b/html5/render/vue/components/slider/slideMixin.js
index 73960e5..2b7bfa1 100644
--- a/html5/render/vue/components/slider/slideMixin.js
+++ b/html5/render/vue/components/slider/slideMixin.js
@@ -19,7 +19,6 @@
 import './slider.css'
 import {
   throttle,
-  extend,
   createEvent,
   fireLazyload,
   addTransform,
@@ -116,12 +115,16 @@ export default {
         {
           ref: 'wrapper',
           attrs: { 'weex-type': this.isNeighbor ? 'slider-neighbor' : 'slider' 
},
-          on: extend(createEventMap(this, ['scroll', 'scrollstart', 
'scrollend']), {
-            touchstart: this._handleTouchStart,
-            touchmove: throttle(bind(this._handleTouchMove, this), 25),
-            touchend: this._handleTouchEnd,
-            touchcancel: this._handleTouchCancel
-          }),
+          on: createEventMap(
+            this,
+            ['scroll', 'scrollstart', 'scrollend'],
+            {
+              touchstart: this._handleTouchStart,
+              touchmove: throttle(bind(this._handleTouchMove, this), 25),
+              touchend: this._handleTouchEnd,
+              touchcancel: this._handleTouchCancel
+            }
+          ),
           staticClass: 'weex-slider weex-slider-wrapper weex-ct',
           staticStyle: extractComponentStyle(this)
         },

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/render/vue/core/node.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/node.js b/html5/render/vue/core/node.js
index 8edc608..d07f3ed 100644
--- a/html5/render/vue/core/node.js
+++ b/html5/render/vue/core/node.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { extend } from '../utils'
+import { extend, isArray } from '../utils'
 
 /**
  * remove text nodes in the nodes array.
@@ -25,7 +25,7 @@ import { extend } from '../utils'
  * @return {Array} nodes without text nodes.
  */
 export function trimTextVNodes (vnodes) {
-  if (Array.isArray(vnodes)) {
+  if (isArray(vnodes)) {
     return vnodes.filter(vnode => !!vnode.tag)
   }
   return vnodes
@@ -55,7 +55,7 @@ function getListeners (vnode, evt) {
 
 const supportedEvents = [
   'longpress', 'appear', 'disappear',
-  // 'touchstart', 'touchmove', 'touchend',
+  'touchstart', 'touchmove', 'touchend',
   'panstart', 'panmove', 'panend', 'swipe', 'longpress'
 ]
 
@@ -76,9 +76,9 @@ function isInANode (el) {
 /**
  * emit native events to enable v-on.
  * @param {VComponent} context: which one to emit a event on.
- * @param {array} extras: extra events.
+ * @param {array | object} extras: extra events. You can pass in multiple 
arguments here.
  */
-export function createEventMap (context, extras = []) {
+export function createEventMap (context, ...extras) {
   const eventMap = {}
   /**
    * Bind some original type event to your specified type event handler.
@@ -88,11 +88,11 @@ export function createEventMap (context, extras = []) {
   const bindFunc = (originalType) => {
     return listenTo => {
       let handler
+      const evtName = originalType || listenTo
       if (typeof listenTo === 'function') {
         handler = listenTo
       }
       else if (typeof listenTo === 'string') {
-        if (!originalType) { originalType = listenTo }
         handler = function (e) {
           /**
            * allow original bubbling.
@@ -115,7 +115,7 @@ export function createEventMap (context, extras = []) {
                   on = on.fn
                 }
                 let evt = e
-                if (originalType === listenTo) {
+                if (originalType && evtName !== listenTo) {
                   evt = extend({}, { type: listenTo })
                   // weex didn't provide these two methods for event object.
                   delete event.preventDefault
@@ -135,10 +135,43 @@ export function createEventMap (context, extras = []) {
           }
         }
       }
-      eventMap[originalType] = handler
+      if (!eventMap[evtName]) {
+        eventMap[evtName] = []
+      }
+      eventMap[evtName].push(handler)
     }
   }
-  supportedEvents.concat(extras).forEach(bindFunc())
+
+  /**
+   * 1. Dispatch default supported events directly to user's event listeners. 
These
+   * listeners will be triggered before extras event handlers.
+   */
+  supportedEvents.forEach(bindFunc())
+
+  /**
+   * 2. component's extra event bindings. This is mostly for the needs of 
component's
+   * own special behaviours. These handlers will be processed after the user's
+   * corresponding event handlers.
+   */
+  if (extras) {
+    const len = extras.length
+    for (let i = 0; i < len; i++) {
+      const extra = extras[i]
+      if (isArray(extra)) {
+        extra.forEach(bindFunc())
+      }
+      else if (typeof extra === 'object') {
+        for (const key in extra) {
+          bindFunc(key)(extra[key])
+        }
+      }
+    }
+  }
+
+  /**
+   * 3. special binding for click event, which should be a fastclick event 
without
+   * 300ms latency.
+   */
   bindFunc('tap')('click')
   /**
    * Special treatment for click event:

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c4f461f3/html5/test/render/vue/core/node.js
----------------------------------------------------------------------
diff --git a/html5/test/render/vue/core/node.js 
b/html5/test/render/vue/core/node.js
index 910e390..8076e4c 100644
--- a/html5/test/render/vue/core/node.js
+++ b/html5/test/render/vue/core/node.js
@@ -31,7 +31,7 @@ init('core node', (Vue, helper) => {
        * child vnode -> parent vnode.
        *  e.g.  div -> foo (whoes root element is the div.)
        */
-      const evt = new Event('click', { bubbles: true })
+      const evt = new Event('tap', { bubbles: true })
       el.dispatchEvent(evt)
 
       helper.registerDone(id, (tracker) => {
@@ -49,7 +49,7 @@ init('core node', (Vue, helper) => {
        * click inner div. should just trigget the inner handler and
        * shouldn't bubbe to outter div.
        */
-      const evt = new Event('click', { bubbles: true })
+      const evt = new Event('tap', { bubbles: true })
       inner.dispatchEvent(evt)
 
       helper.registerDone(id, (tracker) => {

Reply via email to