Skip to content

[Bug] Legend click not responding when setOption is called at high frequency (≥30fps) #21566

Open

Description

@channingkuo

Version

6.0.0

Link to Minimal Reproduction

https://echarts.apache.org/examples/zh/editor.html?c=dynamic-data2

Steps to Reproduce

Using the official https://echarts.apache.org/examples/zh/editor.html?c=dynamic-data2 example, change the update interval to 60fps:

setInterval(function () {
  for (var i = 0; i < 5; i++) {
    data.shift();
    data.push(randomData());
  }
  myChart.setOption({
    series: [{ data: data }]
  });
}, 1000 / 60);  // <-- changed from 1000 to 1000/60

// Add a legend:
option = {
  legend: { data: ['Fake Data'] },
  // ... rest unchanged
};

Steps to reproduce:

  1. Open the above config in ECharts playground
  2. Try clicking the legend item "Fake Data"
  3. Click multiple times — the legend rarely or never responds

Current Behavior

When setOption is called at high frequency (≥30fps, e.g. real-time WebSocket data),
clicking legend items becomes unreliable or completely unresponsive.

Expected Behavior

Legend items should be clickable regardless of how frequently setOption is called.

Environment

- OS: macOS 26.3.1、Windows 10
- Browser: Chrome Version 146.0.7680.165 (Official Build) (arm64)
- Framework: Vue3、Chrome officel example

Any additional comments?

Root Cause (suspected)

zrender's click detection saves _downEl on mousedown and compares it to the
element found at mouseup. When setOption triggers a scene graph update between
mousedown and mouseup, the legend elements may be recreated or marked dirty,
causing the reference comparison to fail and the click event to never fire.

This does not happen with mousemove (cursor change works correctly), only with
the mousedown → mouseup sequence.

Temporary solution

Replace ECharts' built-in legend with HTML elements positioned over the canvas,
and use dispatchAction({ type: 'legendToggleSelect', name }) to control
series visibility programmatically.

Activity

  1. added
    enThis issue is in English
    pendingWe are not sure about whether this is a bug/new feature.
    on Apr 2, 2026
  2. waterWang commented on Aug 9, 2026

    @waterWang

    The root cause is in zrender's Handler.ts click detection, which compares element references (_downEl !== _downEl). When setOption recreates elements between mousedown and mouseup, the reference comparison always fails.

    I've submitted a fix in zrender PR #1165: ecomfe/zrender#1165

    The fix adds a check using the existing pattern (already used in the mousemove handler) to detect when was removed from zrender due to element recreation. If the element was removed, the click is allowed to proceed to the new element at the same position.

    After the zrender fix is merged, echarts needs to update its zrender dependency to pick up the fix.

  3. waterWang commented on Aug 9, 2026

    @waterWang

    The root cause is in zrender's Handler.ts click detection, which compares element references (_downEl !== _upEl). When setOption recreates elements between mousedown and mouseup, the reference comparison always fails and the click never fires.

    I've submitted a fix in zrender PR #1165: ecomfe/zrender#1165

    The fix adds a check using the existing __zr pattern (already used in the mousemove handler) to detect when _downEl was removed from zrender due to element recreation. If the element was removed, the click is allowed to proceed to the new element at the same position.

    After the zrender fix is merged, echarts needs to update its zrender dependency to pick up the fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugenThis issue is in EnglishpendingWe are not sure about whether this is a bug/new feature.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions