Echart折线图手柄触发事件示例详解


Posted in Javascript onDecember 16, 2018

前言

这是我准备在这个项目中使用的图形库,这也是一款基于HTML5的图形库。图形的创建也比较简单,直接引用Javascript即可。使用这个库的原因主要有三点,一个是因为这个库是百度的项目,而且一直有更新,目前最新的是EChart 3;第二个是这个库的项目文档比较详细,每个点都说明的比较清楚,而且是中文的,理解比较容易;第三点是这个库支持的图形很丰富,并且可以直接切换图形,使用起来很方便。

下面话不多说了,来一起看看详细的介绍吧

1 环境:

vue-cli(2.0)+ vue-echarts (git地址:https://github.com/ecomfe/vue-echarts(本地下载))

2 场景:

最近项目用echarts来展示图标,其中有一个需求,需要拖动手柄,等松开手柄时,要根据手柄所在的位置(获取手柄在的x轴信息),重新发送请求,来渲染数据。

echarts的手柄实例地址:http://echarts.baidu.com/examples/editor.html?c=line-tooltip-touch

3图:

Echart折线图手柄触发事件示例详解

4遇到的bug:

4.1 手柄上的label信息,有时会刷新不出来。即上图中的2016-10-07消失。

4.2 echarts的点击事件对折线图并不友好,必须点在折线图的点坐标上才会触发事件。so,要实现点击图中任意位置来即可实现触发自己的事件。

4.3 echarts提供了可以拖动的手柄,但是并没有松开手柄后触发的事,这个没有满足我们产品的需求。当然有可能是我没有找到,若有请告知,谢谢。

5解决以上的bug:

页面的展示如下:

<template>
 <div>
 <div id='line' @touchend='touchs' @mouseup='touchs'>
  <v-chart auto-resize class='zhexian' :options='lineOption' :initOptions='initOptions' ref='line' />
 </div>
 </div>
</template>
<script>
 //初始化折线的数据
 import lineoption from '@/assets/js/handleline.js'
 export default{
  data(){
   return{
    lineOption:lineoption,
    initOptions:{
     renderer: 'svg' || 'canvas'
    },
    date:'',//发送Ajax时所需的参数
    reFlag:'',//避免重复发送请求时的中间变量
   }
  }, 
  }
</script>

拖动手柄时,会实时触发formater,

解决第一个bug ,label有时会消失,因为我以后的代码会用到formatter,第一次要用formater ,我是这样写的,

this.lineOption.xAxis.axisPoint.label.formatter=function(param){ 
   //param是X轴的信息
 let value = _this.$echart.format.formatTime('yyyy-MM-dd', params.value);
 _this.date =value;
 console.log('实时获取的X轴的事件'+_this.date)
 return value;
},

,axisPoint对象的其他数据写在了handleline.js中,解决方案就是把axisPoint的其他数据也重新setOption了,

mounted(){
   //
   let _this = this;
   this.lineOption.xAxis.axisPointer={
   value: '2016-10-7',
   snap: true,
   lineStyle: {
    color: '#004E52',
    opacity: 0.5,
    width: 2
   },
   label: {
    show: true,
    formatter: function (params) {
     let value = _this.$echart.format.formatTime('yyyy-MM-dd', params.value);
     _this.date =value;
     console.log('实时获取的X轴的事件'+_this.date)
     return value;
    },
    backgroundColor: '#004E52'
   },
   handle: {
    show: true,
    color: '#004E52'
   }
   }
  },

解决第三个bug,结合了formatter 和 vue的touchend事件,单独的formatter并没有用,因为手指离开时,formatter的param数据会获取多个,也有可能会是多个重复的数据。效果并不好。so结合了touchend事件,手指离开时获取最终的date.

methods:{
   touchs(){
    //手指离开手柄事件,因为手柄滑动时,就会触发formatter,这时,this.date 就会发生改变。当你手指触发其他的地方时
    //并不会改变this.date的值,so。为了避免手指离开时重复发送请求,需要一个中间变量。只有两个值不相等才会去做自己想做的事。
    if (this.reFlag == this.date) {
     return
     }
    this.reFlag = this.date
    //重新发送请求,渲染数据,这时已经或得了X轴的时间。
    console.log(this.date)
    // this.getPieData()
   },
  }

解决第二个bug ,这是从网上找到的。实现点击折线图的任意地方获取x轴的信息,发送请求。同时,要让lineOption中的tooltip:{triggerOn:'click'} ,否则点击无效。

sendTime() {
    //写在mounted中调用
     var chart = this.$echart.init(this.$refs.line.$el)
     chart.getZr().on('click', params => {
     var pointInPixel = [params.offsetX, params.offsetY]
     if (chart.containPixel('grid', pointInPixel)) {
      let xIndex = chart.convertFromPixel({ seriesIndex: 0 }, [
       params.offsetX,
       params.offsetY
     ])[0];
     let a =this.$echart.format.formatTime('yyyy-MM-dd', xIndex);
     /*事件处理代码书写位置*/
     // xIndex是个重要信息,用的时候最好打印看下具体的内容再用
     console.log(xIndex);
    // this.date = this.linedata[xIndex + 1][0];
    // 手指点击后,让这两个值相等,避免触发touchend事件,
    this.reFlag = this.date=a;
    //重新发送请求
    //this.getPieData()
  }
  })
 },

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
激活 ActiveX 控件
Oct 09 Javascript
jquery $(document).ready() 与window.onload的区别
Dec 28 Javascript
JQuery获取各种宽度、高度(format函数)实例
Mar 04 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
使用AngularJS创建单页应用的编程指引
Jun 19 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
又一枚精彩的弹幕效果jQuery实现
Jul 25 Javascript
使用JS正则表达式 替换括号,尖括号等
Nov 29 Javascript
JavaScript队列函数和异步执行详解
Jun 19 Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 #Javascript
antd Upload 文件上传的示例代码
Dec 14 #Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 #Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 #Javascript
Angular2 自定义表单验证器的实现方法
Dec 14 #Javascript
JavaScript模板引擎应用场景及实现原理详解
Dec 14 #Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 #Javascript
You might like
php使用json_encode对变量json编码
2014/04/07 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
JS实现购物车特效
2017/02/02 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
详解用node.js实现简单的反向代理
2017/06/26 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python数据类型学习笔记
2016/01/13 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
婚前协议书怎么写
2014/04/15 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
花木兰观后感
2015/06/10 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书