diff --git a/packages/taro-components/src/utils/touchable.js b/packages/taro-components/src/utils/touchable.js
index bcca25075e7b..fb96f540cc27 100644
--- a/packages/taro-components/src/utils/touchable.js
+++ b/packages/taro-components/src/utils/touchable.js
@@ -16,23 +16,24 @@ const touchable = (opt = {
       }
       timer = null
 
-      onTouchStart () {
+      onTouchStart = () => {
         const { bindTouchStart, bindLongTap } = this.props
         bindTouchStart && bindTouchStart()
-        setTimeout(() => {
+        this.timer = setTimeout(() => {
           bindLongTap && bindLongTap()
         }, opt.longTapTime)
       }
-      onTouchMove () {
+      onTouchMove = () => {
+        this.timer && clearTimeout(this.timer)
         const { bindTouchMove } = this.props
         bindTouchMove && bindTouchMove()
       }
-      onTouchEnd () {
+      onTouchEnd = () => {
         this.timer && clearTimeout(this.timer)
         const { bindTouchEnd } = this.props
         bindTouchEnd && bindTouchEnd()
       }
-      onTouchCancel () {
+      onTouchCancel = () => {
         this.timer && clearTimeout(this.timer)
         const { bindTouchCancel } = this.props
         bindTouchCancel && bindTouchCancel()
diff --git a/packages/taro-h5/src/api/canvas/canvasToTempFilePath.js b/packages/taro-h5/src/api/canvas/canvasToTempFilePath.js
index 4ef1732bbf97..0917fb7e890e 100644
--- a/packages/taro-h5/src/api/canvas/canvasToTempFilePath.js
+++ b/packages/taro-h5/src/api/canvas/canvasToTempFilePath.js
@@ -1,3 +1,4 @@
+import { findDOMNode } from 'nervjs'
 /**
  * @typedef {Object} Param
  * @property {Number} [x] 指定的画布区域的左上角横坐标,默认值 0
@@ -17,10 +18,32 @@
 /**
  * 把当前画布指定区域的内容导出生成指定大小的图片。在 draw() 回调里调用该方法才能保证图片导出成功。
  * @param {Param} opt 参数
+ * @param {Object} componentInstance 在自定义组件下,当前组件实例的this,以操作组件内 <canvas> 组件
+ * @todo 暂未支持尺寸相关功能
  */
 
-const canvasToTempFilePath = opt => {
-  
+const canvasToTempFilePath = ({ canvasId, fileType, success, fail, complete }, componentInstance) => {
+  const dom = findDOMNode(componentInstance)
+
+  /** @type {HTMLCanvasElement} */
+  const canvas = dom.querySelector(`[canvasId=${canvasId}]`);
+
+  try {
+    // /** @type {CanvasRenderingContext2D} */
+    const dataURL = canvas.toDataURL(`image/${fileType || 'png'}`, opt.quality)
+
+    success && success({
+      tempFilePath: dataURL
+    })
+  } catch (e) {
+    fail && fail({
+      errMsg: e.message
+    })
+  }
+  complete && complete({
+    res: 'canvasToTempFilePath:ok'
+  })
+
 }
 
 export default canvasToTempFilePath
diff --git a/packages/taro-h5/src/api/canvas/createCanvasContext.js b/packages/taro-h5/src/api/canvas/createCanvasContext.js
index 88b499961052..7fce61a3d10c 100644
--- a/packages/taro-h5/src/api/canvas/createCanvasContext.js
+++ b/packages/taro-h5/src/api/canvas/createCanvasContext.js
@@ -8,6 +8,7 @@ import { isFunction } from '../utils/index'
 */
 const createCanvasContext = (canvasId, componentInstance) => {
   const dom = findDOMNode(componentInstance)
+  /** @type {HTMLCanvasElement} */
   const canvas = dom.querySelector(`[canvasId=${canvasId}]`);
   
   /** @type {CanvasRenderingContext2D} */