echarts tooltip绑定点击事件并弹出弹框

1.问题描述
实现如图效果,当鼠标悬浮/点击小脚位置时,弹出tooltip框,并且鼠标点击查看更多按钮弹出弹框。

 

2. 实现步骤
2.1 问题汇总

样式不生效(提示框设置样式必须为全局样式)

按钮点击无响应(按钮样式增加 pointer-events: auto)

按钮点击方法不执行(需增加全局作用域的样式, tooltip无法使用vue组件的方法, 必须定义windows全局上)

tooltip字段主要配置如下

 tooltip: {
            // 鼠标是否可以进入悬浮框
            enterable: true,
            // 触发方式 mousemove, click, none, mousemove|click
            triggerOn: `mousemove`, 
            // item 图形触发, axis 坐标轴触发, none 不触发
            trigger: `item`, 
            // 浮层隐藏的延迟
            hideDelay: 800,
            // 背景色
            backgroundColor: `rgba(0,0,0,0)`,
            formatter: function (params) {
               return `<div class=chartLabel>
              <div class=title>${params.name}</div>
              <div class=label>到达时间:2020.10.11</div>
              <button id="btn-tooltip">查看更多</button>
            </div>`
            }
          },
3.实现方式1
问题: tooltip绑定的事件需要在全局作用域下,当前使用vue开发不想将方法定义在window, 并且如果定于在window下的话弹框也需要与其在同一作用域下。

解决

1.增加一个变量hookToolTip用来保存当前点击的位置名称(数据改变的时候, 动态设置options)

 this.options.tooltip.formatter = function (params) {
        if (params.seriesType === `scatter`) {
          setTimeout(() => {
            this.hookToolTip = params.name
          }, 1000)
          const label =
            `<div class=chartLabel>
              <div class=title>${params.name}</div>
              <div class=label>到达时间:2020.10.11</div>
              <div class=label>离开时间:2020.11.11</div>
              <button id="btn-tooltip">监控视频</button>
            </div>`
            return label
        }
      }.bind(this)
}
 

2.位置改变时,监听hookToolTip获取Dom绑定事件

 watch: {
    hookToolTip: function (name) {
      this.$nextTick(() => {
        const html_ = document.querySelector(`#btn-tooltip`)
          html_ && html_.addEventListener(`click`, () => {
            // 点击事件弹框显示
            this.dialogVisible = true
          })
      })
    }
  },
这种方式的缺陷: 虽然能实现功能, 但是需要设置setTimeOut, 这里由于hookToolTip改变的时候,提示框不一定已经渲染,会导致获取不到DOM

4.实现方式2
参考: 参考DEMO

1.在当前vue组件中定义一个全局的事件及 一个全局的对象(为一个对象,保存所有实例的tooltip按钮的回调事件)注意:全局需要定义在default export {} 外

// params 当前tooltip数据, key: 当前实例的键值
window.onClickSeries = function (params, key) {
  // 获取当前id地图的回调方法并执行
  globalMap[key.trim()](params, key)
}
// 用来保存所有的地图实例
const globalMap = {}
2. 当数据改变时, 在修改options的方法中设置formatter 

注意:1. onclick绑定方法参数的拼接方式,2. 按钮css样式必须设置pointer-events: auto  3.formatter方法需要重新绑定this 

methods:{
 setOptionsValue () {
      this.options.tooltip.formatter = function (params) {
        if (params.seriesType === `scatter`) {
          /* eslint-disable */
          const label =
            `<div class=chartLabel>
              <div class=title>${params.name}</div>
              <div class=label>到达时间:2020.10.11</div>
              <div class=label>离开时间:2020.11.11</div>
              <button id="btn-tooltip" οnclick="onClickSeries(\'` + params.name + `\',\' ` + this.id  + `\')">监控视频</button>
            </div>`
          return label
          /* eslint-enable */
        }
      }.bind(this)
      this.mapChart.setOption(this.options, true)
    }
}
3. 在mounted中给全局对象globalMap绑定当前实例对应的回调方法

 mounted () {
    // 设置tooltip点击的回调事件, this.id 为当前图表的唯一标识
    globalMap[this.id] = (params, id) => {
      this.dialogVisible = true
    }
}
 
————————————————
版权声明:本文为CSDN博主「Y...................」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yyXieDaiMa/article/details/109777551

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过 `tooltip` 的 `formatter` 属性以及 `tooltip` 的 `trigger` 属性来实现点击事件。 具体实现步骤如下: 1. 在 `tooltip` 的 `formatter` 属性中添加需要展示的文本信息,同时在需要添加点击事件的文本处添加一个特殊的标识(比如添加一个类名或者 id)。 2. 在 `tooltip` 的 `trigger` 属性中设置触发方式为 `'axis'`。 3. 在页面加载完成后,使用 `document.querySelector` 方法获取指定元素的引用,然后使用 `addEventListener` 方法为其添加点击事件处理程序。 示例代码如下: ```javascript option = { // ... tooltip: { trigger: 'axis', formatter: function(params) { // 添加类名 'clickable' 以标识可点击文本 return '这是一个可点击的文本<span class="clickable" id="clickable-text">点击我</span>'; }, // ... }, // ... }; // 在页面加载完成后添加点击事件处理程序 document.addEventListener('DOMContentLoaded', function() { var clickableText = document.querySelector('#clickable-text'); clickableText.addEventListener('click', function() { // 处理点击事件 console.log('点击了可点击的文本'); }); }); ``` 在上述示例中,我们在 `tooltip` 的 `formatter` 属性中添加了一个可点击的文本,并且使用类名 `'clickable'` 和 id `'clickable-text'` 来标识它。然后在页面加载完成后,我们使用 `document.querySelector` 方法获取了这个文本元素的引用,并为其添加了点击事件处理程序。 当用户在图表上鼠标悬停时,显示一个包含可点击文本的提示。当用户点击可点击文本时,就触发我们添加的点击事件处理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值