You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测TradingView轻量图表中十字准线是否可见?

检测TradingView轻量图表十字准线可见性的方案

TradingView轻量图表(Lightweight Charts)的官方API目前确实没有直接提供十字准线可见状态的查询接口,只能通过配置项设置显示模式,但无法直接读取当前是否可见。以下是几种可行的解决思路:

1. 手动追踪十字准线配置状态

如果你的十字准线显示模式完全由代码控制,可以自己维护一个状态变量,每次修改配置时同步更新状态:

// 初始化图表时设置初始状态
let isCrosshairVisible = false;
const chart = LightweightCharts.createChart(document.getElementById('chart'), {
    crosshair: { mode: LightweightCharts.CrosshairMode.Never }
});

// 封装修改十字准线模式的方法,同步更新状态
function updateCrosshairMode(mode) {
    isCrosshairVisible = mode !== LightweightCharts.CrosshairMode.Never;
    chart.applyOptions({ crosshair: { mode } });
}

// 后续需要检测时直接读取变量
if (isCrosshairVisible) {
    // 执行对应逻辑
}

局限:仅适用于代码主动控制模式的场景,无法捕捉用户通过图表内置交互(如右键菜单)修改的情况。

2. DOM元素检测(推荐覆盖全场景)

轻量图表的十字准线由两个类名为tv-crosshair-vertical和tv-crosshair-horizontal的DOM元素组成,可通过检测这些元素的可见性来判断:

// 获取十字准线DOM元素
const crosshairV = document.querySelector('.tv-crosshair-vertical');
const crosshairH = document.querySelector('.tv-crosshair-horizontal');

// 检测函数:元素可见时offsetParent不为null
function checkCrosshairVisibility() {
    return (crosshairV?.offsetParent !== null) || (crosshairH?.offsetParent !== null);
}

// 方式1:结合十字准线移动事件触发检测
chart.subscribeCrosshairMove(() => {
    const visible = checkCrosshairVisibility();
    console.log('十字准线可见:', visible);
});

// 方式2:用MutationObserver监听样式变化,实时追踪状态
const observer = new MutationObserver(() => {
    const visible = checkCrosshairVisibility();
    console.log('十字准线状态变更:', visible);
});

// 启动监听(确保元素已存在)
if (crosshairV) observer.observe(crosshairV, { attributes: true, attributeFilter: ['style'] });
if (crosshairH) observer.observe(crosshairH, { attributes: true, attributeFilter: ['style'] });

优势:能覆盖所有场景,包括用户手动切换的情况;注意:DOM类名可能随版本更新变化,需测试兼容性。

3. 结合十字准线移动事件判断

利用subscribeCrosshairMove事件的触发特性:十字准线可见时,鼠标移动会触发该事件;隐藏时则不会。通过定时器辅助判断:

let isCrosshairVisible = false;
let crosshairTimeout;

// 十字准线移动时标记为可见,并重置定时器
chart.subscribeCrosshairMove(() => {
    isCrosshairVisible = true;
    clearTimeout(crosshairTimeout);
    // 500ms无移动则标记为不可见
    crosshairTimeout = setTimeout(() => {
        isCrosshairVisible = false;
    }, 500);
});

// 检测时读取状态
function getCrosshairStatus() {
    return isCrosshairVisible;
}

适用场景:适合判断“当前是否因鼠标悬停显示十字准线”,若十字准线设为始终显示,状态会持续为true。

内容的提问来源于stack exchange,提问作者willbeing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:55:22