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

Javascript中结合Tableau API与Scrollama实现固定侧边展示Tableau图表问询

核心修改逻辑

你当前的问题根源是Tableau的挂载节点预设在文本区域的HTML结构中,只要改为在drawimages函数中动态向Scrollama指定的固定图表容器#graphs创建挂载节点即可,具体修改如下:


1. 调整全局变量声明与drawimages函数

// 提前在全局作用域声明viz变量,用于后续实例销毁
let viz = null;

function drawimages({width, height, data}) {
    // 销毁已存在的Tableau实例,避免重复渲染
    if (viz) {
        viz.dispose();
        viz = null;
    }
    // 取Scrollama指定的固定图表容器
    const graphContainer = document.getElementById('graphs');
    // 清空容器原有内容
    graphContainer.innerHTML = '';
    // 动态创建Tableau挂载节点
    const tableauPlaceholder = document.createElement('div');
    tableauPlaceholder.id = 'tableauViz';
    tableauPlaceholder.style.width = `${width}px`;
    tableauPlaceholder.style.height = `${height}px`;
    // 将挂载节点插入固定图表容器
    graphContainer.appendChild(tableauPlaceholder);

    const url = "https://public.tableau.com/views/Covid19NYCExpenditures/Dashboard1";
    const options = {
        hideTabs: true,
        hideToolbar: true,
        onFirstInteraction: function () {
            console.log("My embbed");
            const workbook = viz.getWorkbook();
            const activeSheet = workbook.getActiveSheet();
        }
    };
    viz = new tableau.Viz(tableauPlaceholder, url, options);
}

2. 调整step切换时的清理逻辑

修改onStepEnter回调中的setTimeout部分,兼容Tableau实例的销毁:

setTimeout(() => {
    // 销毁存在的Tableau实例
    if (viz) {
        viz.dispose();
        viz = null;
    }
    // 清空固定容器所有内容,移除原有svg和tooltip
    d3.select("#graphs").html('');
    d3.select(".d3-tip").remove();

    // 非Tableau的step继续创建svg
    const svg = d3.select('#graphs')
      .append("svg")
      .attr("width", width)
      .attr("height", height)
      .style("overflow", "visible")
      .style("display", "block");

    switch (element.dataset.step) {
      case '1':
        drawimages({width, height, data});
        break;
      // 剩余其他case保持原有逻辑不变
      case '2':
        drawimages2({svg, width, height, data});
        break;
      case '3':
        drawimages3({svg, width, height, data});
        break;
      case '4':
        drawLineChart({svg, width, height, data});
        break;
      case '5':
        drawDonutChart({svg, width, height, data});
        break;
      case '6':
        drawimages4({svg, width, height, data});
        break;
      case '7':
        drawBarChartMia2({svg, width, height, data});
        break;
    }
}, 500)

3. 清理原有HTML结构

删掉你之前写在文本区域HTML中的id="tableauViz"元素,避免节点冲突。

修改完成后Tableau图表就会直接渲染在Scrollama对应的固定图表区域,不会出现在文本侧。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:15:04