AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79526901
Accepted
Alice
Alice
Asked: 2025-03-22 11:30:25 +0800 CST2025-03-22 11:30:25 +0800 CST 2025-03-22 11:30:25 +0800 CST

echarts中如何知道点击事件的实际目标?

  • 772

我想为我的 echarts 图表添加注释功能。如果有任何注释,它将被标记为带有绿色方形标记的绿色虚线。当用户单击绿色方形标记时,将打开一个弹出窗口以显示实际注释。

当我运行下面的命令时,只要我单击注释标记线上的任意位置,它就会被触发。如何判断用户是否专门单击了绿色方形标记?

myChart.on('click', "series.line", function(params) {
  console.log('normal click series.markLine', params)
})

以下是演示:https://codepen.io/lora999/pen/azbGPKY

在此处输入图片描述

echarts
  • 1 1 个回答
  • 23 Views

1 个回答

  • Voted
  1. Best Answer
    kikon
    2025-03-24T06:19:11+08:002025-03-24T06:19:11+08:00

    如果你探索params一下,myChart.on('click', "series.line", function(params){... 你会发现有方法可以识别矩形是否被点击。最直接的方法似乎是params.event.target.type === 'rect'(也用渲染器 svg 测试过):

    myChart.on('click', "series.line", function(params) {
        if(params.event.target.type === 'rect'){
            console.log('Rectangle clicked');
            // use params.data.name or params.data._id to further
            // identify the target, if multiple annotations are added
        }
    });
    

    可运行片段:

    const myChart = echarts.init(document.getElementById("chart-container"), null, {
       renderer: "canvas",
       useDirtyRect: false,
    });
    
    const option = {
        "useUTC": false,
        "grid": {
            "containLabel": true,
            "left": 35,
            "right": 40,
            "top": 40,
            "bottom": 40
        },
        "xAxis": {
            "type": "time",
        },
        "yAxis": {
            "type": "value",
        },
        "tooltip": {
            appendTo: 'body',
            "borderColor": "transparent",
            "show": true,
            "trigger": "axis",
            enterable: true,
        },
        "legend": {
            "orient": "horizontal",
            "show": true,
            "type": "scroll",
            "bottom": 0,
        },
        "series": [
            {
                "name": "series1",
                "data": [
                    [
                        1041811200000,
                        30429.64
                    ],
    
                    [
                        1043625600000,
                        99323.95999999999
                    ],
    
                    [
                        1050883200000,
                        4219.2
                    ],
                ],
                "connectNulls": true,
                "type": "line",
                "smooth": false,
    
                "showSymbol": false,
    
            },
            {
                id: 'Annotation',
                name: 'annotation',
                type: "line",
                markLine: {
                    symbol: 'none',
                    label: {
                        show: true,
                        formatter: '{icon|}',
                        rich: {
                            icon: {
                                height: 20,
                                width: 20,
                                backgroundColor: 'green',
                                _id:'__test__'
                            },
                            _id:'__test__'
                        }
                    },
                    data: [
                        {
                            name: 'annotationLine',
                            xAxis: 1043625600000,
                            lineStyle: {
                                width: 2,
                                color:'green'
                            },
                            _id: 'annotationLine'
                        },
                    ]
                }
    
            },
        ],
    };
    
    
    myChart.on('click', "series.line", function(params) {
        if(params.event.target.type === 'rect'){
            console.log('Rectangle clicked');
            // use params.data.name or params.data._id to further
            // identify the target, if multiple annotations are added
        }
    });
    
    
    myChart.setOption(option);
    
    window.addEventListener('resize', myChart.resize);
    <div id="chart-container" style="height:400px; min-width: 800px"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.6.0/echarts.min.js"></script>

    然而,最安全的解决方案是将矩形与线分开,使它们成为两个不同的注释,矩形实现为markPoint:

    const myChart = echarts.init(document.getElementById("chart-container"), null, {
       renderer: "canvas",
       useDirtyRect: false,
    });
    
    const option = {
        "useUTC": false,
        "grid": {
            "containLabel": true,
            "left": 35,
            "right": 40,
            "top": 40,
            "bottom": 40
        },
        "xAxis": {
            "type": "time",
        },
        "yAxis": {
            "type": "value",
        },
        "tooltip": {
            appendTo: 'body',
            "borderColor": "transparent",
            "show": true,
            "trigger": "axis",
            enterable: true,
        },
        "legend": {
            "orient": "horizontal",
            "show": true,
            "type": "scroll",
            "bottom": 0,
        },
        "series": [
            {
                "name": "series1",
                "data": [
                    [
                        1041811200000,
                        30429.64
                    ],
    
                    [
                        1043625600000,
                        99323.95999999999
                    ],
    
                    [
                        1050883200000,
                        4219.2
                    ],
                ],
                "connectNulls": true,
                "type": "line",
                "smooth": false,
    
                "showSymbol": false,
    
            },
            {
                id: 'Annotation',
                name: 'annotation',
                type: "line",
                markLine: {
                    symbol: 'none',
                    silent: true, // doesn't respond to click
                    label: {
                        show: false
                    },
                    data: [
                        {
                            name: 'annotationLine',
                            xAxis: 1043625600000,
                            lineStyle: {
                                width: 2,
                                color:'green'
                            },
                            _id: 'annotationLine'
                        },
                    ]
                },
                markPoint: {
                    symbol: 'rect',
                    symbolSize: 20,
                    symbolOffset: [0, -10],
                    itemStyle: {
                        color: 'green'
                    },
                    label: {
                        show: false,
                    },
                    data: [
                        {
                            name: 'annotationPoint',
                            coord: [1043625600000, 100000],
                            _id: 'annotationPoint'
                        },
                    ]
                }
    
            },
        ],
    };
    
    
    myChart.on('click', "series.line", function(params) {
        // in this scenario, only the markPoint is responding to clicks; but if other items are
        // added, params.componentType and/or params.data.name (or _id) may be used to identify the target
        if(params.componentType === 'markPoint'){
            console.log('Rectangle clicked', params.data.name);
        }
    })
    
    
    myChart.setOption(option);
    
    window.addEventListener('resize', myChart.resize);
    <div id="chart-container" style="height:400px; min-width: 800px"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.6.0/echarts.min.js"></script>

    或者使用图标标签,如原始代码所示(使用 svg 渲染器):

    const myChart = echarts.init(document.getElementById("chart-container"), null, {
       renderer: "svg",
       useDirtyRect: false,
    });
    
    const option = {
        "useUTC": false,
        "grid": {
            "containLabel": true,
            "left": 35,
            "right": 40,
            "top": 40,
            "bottom": 40
        },
        "xAxis": {
            "type": "time",
        },
        "yAxis": {
            "type": "value",
        },
        "tooltip": {
            appendTo: 'body',
            "borderColor": "transparent",
            "show": true,
            "trigger": "axis",
            enterable: true,
        },
        "legend": {
            "orient": "horizontal",
            "show": true,
            "type": "scroll",
            "bottom": 0,
        },
        "series": [
            {
                "name": "series1",
                "data": [
                    [
                        1041811200000,
                        30429.64
                    ],
    
                    [
                        1043625600000,
                        99323.95999999999
                    ],
    
                    [
                        1050883200000,
                        4219.2
                    ],
                ],
                "connectNulls": true,
                "type": "line",
                "smooth": false,
    
                "showSymbol": false,
    
            },
            {
                id: 'Annotation',
                name: 'annotation',
                type: "line",
                markLine: {
                    symbol: 'none',
                    silent: true, // doesn't respond to click
                    label: {
                        show: false
                    },
                    data: [
                        {
                            name: 'annotationLine',
                            xAxis: 1043625600000,
                            lineStyle: {
                                width: 2,
                                color:'green'
                            },
                            _id: 'annotationLine'
                        },
                    ]
                },
                markPoint: {
                    symbol: 'rect',
                    symbolSize: 20,
                    symbolOffset: [0, -10],
                    itemStyle: {
                        color: 'green'
                    },
                    label: {
                        show: false,
                    },
                    data: [
                        {
                            name: 'annotationPoint',
                            coord: [1043625600000, 100000],
                            _id: 'annotationPoint'
                        },
                    ]
                }
    
            },
        ],
    };
    
    
    myChart.on('click', "series.line", function(params) {
        // in this scenario, only the markPoint is responding to clicks; but if other items are
        // added, params.componentType and/or params.data.name (or _id) may be used to identify the target
        if(params.componentType === 'markPoint'){
            console.log('Rectangle clicked', params.data.name);
        }
    });
    
    
    myChart.setOption(option);
    
    window.addEventListener('resize', myChart.resize);
    <div id="chart-container" style="height:400px; min-width: 800px"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.6.0/echarts.min.js"></script>

    • 1

相关问题

  • 在 Apache eChart 中设置图表周围的边框

  • 当我使用 echarts 更新数据以显示在漏斗图上时,标签会从屏幕上消失

  • 有没有办法在 ECharts 中创建一个充满点的饼图?

  • Echarts如何使图表跨越2个(或更多)网格单元

  • Echarts markLine不出现。(条形图)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve