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

使用XMLHttpRequest拉取实时数据后CanvasJS曲线无法显示

问题原因

  • server.php 存在多余输出:代码开头直接输出了$tension、sortir、aubout三类无关内容,会污染后续返回的页面结构,打断JS代码执行
  • XHR插入的JS不会触发window.onload:index.php页面加载完成后才通过XHR插入server.php返回的内容,此时全局window.onload事件已经执行完毕,server.php里绑定的绘图逻辑永远不会触发
  • 高频重写DOM导致图表实例丢失:你设置了每秒请求一次server.php,每次都会把link_wrapper里的内容全部替换,刚渲染到一半的图表会被直接销毁
  • 资源重复加载:每次请求server.php都会重复加载一次canvasjs.min.js,会引发冲突

修复方案

1. 重写server.php,仅返回纯JSON数据

移除所有多余输出和HTML结构,只返回需要的电压数据:

<?php
include('connexion.php');
$query = mysqli_query($db, "SELECT valeur from tension ORDER BY id DESC LIMIT 1");
$tension = 0;
if($row = mysqli_fetch_array($query)){
    $tension = floatval($row['valeur']);
}
// 仅返回JSON格式数据,无其他额外输出
echo json_encode(['tension' => $tension], JSON_NUMERIC_CHECK);
?>

2. 调整index.php,将绘图逻辑全部迁移到主页面

不再请求完整页面,仅按需拉取数据更新图表,避免频繁重写DOM:

<?php 
include("connexion.php");
?>
<html>
<head>
    <title>实时电压曲线</title>
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
    <!-- 全局仅加载一次CanvasJS资源 -->
    <script src="canvasjs.min.js"></script>
</head>
<body>
    <div class="container">
        <div id="chartContainer" style="height: 370px; width: 100%;"></div>
    </div>
</body>
<script>
var dataPoints = [];
var chart;
var xValue = 0;

window.onload = function() {
    // 初始化图表实例
    chart = new CanvasJS.Chart("chartContainer", {
        theme: "light2",
        title: {
            text: "实时电压值"
        },
        axisX:{
            title: "时间序列"
        },
        axisY:{
            suffix: " V"
        },
        data: [{
            type: "line",
            yValueFormatString: "#,##0.0#",
            toolTipContent: "{y} V",
            dataPoints: dataPoints
        }]
    });
    // 首次加载数据
    loadNewData();
    // 按间隔更新数据,无需重写DOM
    setInterval(loadNewData, 1500);
}

// 仅拉取最新电压数据更新图表
function loadNewData() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var res = JSON.parse(this.responseText);
      var newTension = res.tension;
      // 新增数据点
      dataPoints.push({ x: xValue, y: newTension });
      xValue++;
      // 可选:保留最近10个数据点,避免图表过于拥挤
      if(dataPoints.length > 10) dataPoints.shift();
      // 重新渲染图表
      chart.render();
    }
  };
  xhttp.open("GET", "server.php", true);
  xhttp.send();
}
</script>
</html>

3. connexion.php无需修改,保持现有代码即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:06:04