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

如何将各AJAX调用的变量传入同一个drawChart函数以实现代码复用

复用Google Charts绘制函数,传递不同参数给同一个drawChart方法

看起来你现在是用两个独立的绘制函数来处理两次AJAX请求的图表,想要把代码复用起来其实很简单——核心就是把每个图表的差异化配置(比如容器ID、图表类型、标题,甚至后端请求参数)抽离出来,在AJAX回调时把数据和配置一起传给共用的drawChart函数就行。

下面给你几种实用的实现方式:

1. 基础版:给共用函数传递图表配置

如果两次AJAX请求的数据源是同一个(都是data.php),只是图表展示形式不同,你可以把每个图表的专属配置作为参数传入:

google.charts.load('current', { packages: ['corechart', 'bar'] }).then(function () { 
  // 第一个图表:请求数据后,传递数据+配置给共用函数
  $.ajax({ url: 'data.php', dataType: 'json' }).done(function(result) {
    drawChart(result, {
      containerId: 'chart1', // 图表要渲染到的DOM容器ID
      chartType: 'ColumnChart', // 图表类型
      title: '月度销售柱状图'
    });
  }); 
  // 第二个图表:同样的AJAX请求,不同的配置
  $.ajax({ url: 'data.php', dataType: 'json' }).done(function(result) {
    drawChart(result, {
      containerId: 'chart2',
      chartType: 'LineChart',
      title: '月度销售趋势折线图'
    });
  }); 
}); 

// 共用的绘制函数
function drawChart(result, config) {
  // 把AJAX返回的JSON数据转换成Google Charts需要的DataTable
  var data = google.visualization.arrayToDataTable(result);
  
  // 根据配置生成图表选项
  var options = {
    title: config.title,
    width: 600,
    height: 400,
    // 其他通用或自定义选项都可以在这里统一或按需设置
  };
  
  // 根据配置创建对应的图表实例,渲染到指定容器
  var chart = new google.visualization[config.chartType](document.getElementById(config.containerId));
  chart.draw(data, options);
}

2. 进阶版:给AJAX请求加差异化参数

如果两次请求需要从后端获取不同的数据(比如一个是销售数据,一个是库存数据),可以在AJAX请求时带上参数让后端区分,再配合配置传递给绘制函数:

google.charts.load('current', { packages: ['corechart', 'bar'] }).then(function () { 
  // 请求销售数据,给后端传chart=sales参数
  $.ajax({ 
    url: 'data.php', 
    dataType: 'json',
    data: { chart: 'sales' } // 后端可以根据这个参数返回对应数据
  }).done(function(result) {
    drawChart(result, {
      containerId: 'salesChart',
      chartType: 'ColumnChart',
      title: '月度销售数据'
    });
  }); 
  // 请求库存数据,传chart=stock参数
  $.ajax({ 
    url: 'data.php', 
    dataType: 'json',
    data: { chart: 'stock' }
  }).done(function(result) {
    drawChart(result, {
      containerId: 'stockChart',
      chartType: 'LineChart',
      title: '库存变化趋势'
    });
  }); 
}); 

// 共用的绘制函数,逻辑和基础版一致
function drawChart(result, config) {
  var data = google.visualization.arrayToDataTable(result);
  
  var options = {
    title: config.title,
    width: 600,
    height: 400
  };
  
  var chart = new google.visualization[config.chartType](document.getElementById(config.containerId));
  chart.draw(data, options);
}

3. 高效版:用配置数组批量处理多图表

如果之后还要新增更多图表,把所有配置放到一个数组里循环处理会更高效,不用重复写AJAX代码:

google.charts.load('current', { packages: ['corechart', 'bar'] }).then(function () { 
  // 定义所有图表的配置数组,每个元素包含AJAX参数和绘制配置
  var chartConfigs = [
    {
      ajaxParams: { chart: 'sales' },
      drawSettings: {
        containerId: 'salesChart',
        chartType: 'ColumnChart',
        title: '月度销售数据'
      }
    },
    {
      ajaxParams: { chart: 'stock' },
      drawSettings: {
        containerId: 'stockChart',
        chartType: 'LineChart',
        title: '库存变化趋势'
      }
    }
    // 新增图表直接在这里加配置项就行
  ];
  
  // 循环处理每个图表的请求和绘制
  chartConfigs.forEach(function(item) {
    $.ajax({ 
      url: 'data.php', 
      dataType: 'json',
      data: item.ajaxParams
    }).done(function(result) {
      drawChart(result, item.drawSettings);
    });
  });
}); 

function drawChart(result, drawSettings) {
  var data = google.visualization.arrayToDataTable(result);
  
  var options = {
    title: drawSettings.title,
    width: 600,
    height: 400
  };
  
  var chart = new google.visualization[drawSettings.chartType](document.getElementById(drawSettings.containerId));
  chart.draw(data, options);
}

这种方式的好处是代码扩展性极强,新增图表只需要在配置数组里加一项,完全不用修改核心逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:39