javascript-用于生成图表的循环(amchart)
我正在尝试使用下面的代码一次生成多个折线图。然而,它不起作用。使用for/while或任何其他循环机制生成图形的最佳方法是什么?我有很多图表要生成javascript-用于生成图表的循环(amchart),javascript,jquery,ajax,amcharts,Javascript,Jquery,Ajax,Amcharts,我正在尝试使用下面的代码一次生成多个折线图。然而,它不起作用。使用for/while或任何其他循环机制生成图形的最佳方法是什么?我有很多图表要生成 var db_query = Array(); db_query[1] = <?php echo json_encode($db_query_1) ?>; db_query[2] = <?php echo json_encode($db_query_2) ?>; var chartConfig1
var db_query = Array();
db_query[1] = <?php echo json_encode($db_query_1) ?>;
db_query[2] = <?php echo json_encode($db_query_2) ?>;
var chartConfig1 = clone(chartConfigLineOne);
var chartConfig2 = clone(chartConfigLineOne);
for(var i=1, len=2; i <= len; i++) {
/* chart initialization */
var chart_num = "chart" + i.toString();
var plot_num = "plot" + i.toString();
var chartConfig_num = "chartConfig" + i.toString();
/*alert(chart_num);
alert(plot_num);
alert(chartConfig_num);*/
chart_num = AmCharts.makeChart(plot_num, chartConfig_num);
$.ajax({
type: 'POST',
url: "query_db.php",
data: {'db_que': db_query[i]},
dataType: 'json',
context: document.body,
global: false,
async: true,
success: function(data) {
//alert(data);
chart_num.dataProvider = data;
chart_num.validateNow();
}
});
}
var db_query=Array();
db_查询[1]=;
db_查询[2]=;
var chartConfig1=克隆(chartConfigLineOne);
var chartConfig2=克隆(chartConfigLineOne);
对于(var i=1,len=2;i;
/*图表初始化*/
对于(变量i=0;i<2;i+=1){
//窗口[“图表”+i]=createChartObj(divId[i],configList[i]);
execDbQuery(divId[i]、configList[i]、dbQuery[i]、chartNameList[i]);
}
/**
*数据库查询的执行
*/
函数execDbQuery(divId、configObj、dbQuery、chartObj){
chartObj=AmCharts.makeChart(divId,configObj);
$.ajax({
键入:“POST”,
url:“query_db.php”,
数据:{'db_que':dbQuery},
数据类型:“json”,
上下文:document.body,
全球:错,
async:true,
成功:功能(数据){
//警报(数据);
chartObj.dataProvider=数据;
chartObj.validateNow();
}
});
}
不要在for
循环中进行ajax
调用。这对服务器来说是一个负担。调用越少,您的ui
响应越快。因此,更好的实现方法是在一次ajax
调用中获取所有图形的所有数据,然后在成功
中迭代数据构建g使用AmCharts.makeChart创建图表正如许多评论正确指出的那样,您可能应该从重新思考数据加载方法开始。从客户端传入SQL查询会带来麻烦。您是否能够正确清理查询以防范恶意代码?您不能确定
将DB访问层移动到PHP更为合理。您可以传入在服务器上运行的PHP脚本所需的参数,以确定需要从DB加载什么,并构造和执行实际的SQL查询
例如:query\u db.php?chart\u id=5
这将由PHP脚本决定要做什么。鉴于您目前正在使用PHP格式化这些SQL查询,我很难想象这会是一个问题
这给我们带来了另一个问题。您当前的设置将同时运行多个AJAX请求。虽然您发布的示例中有两个图表可能没有问题,但如果您有(比如)30个图表需要为其加载数据,则可能会影响性能
解决方案是菊花链加载。在前一张图表完成加载之前,不要开始加载另一张图表。即:
var charts = [ {
"name": "chart1",
"div": "plot1",
"config": clone( chartConfigLineOne ),
"query": <? php echo json_encode( $db_query_1 ) ?>
}, {
"name": "chart2",
"div": "plot2",
"config": clone( chartConfigLineOne ),
"query": <? php echo json_encode( $db_query_2 ) ?>
} ];
// do whatever modifications to each chart's config you need here
// ...
// function that creates the chart
function processNextChart() {
if ( charts.length ) {
var chart = charts.shift();
$.ajax( {
type: 'POST',
url: "query_db.php",
data: {
'db_que': chart.query
},
dataType: 'json',
context: document.body,
global: false,
async: true,
success: function( data ) {
chart.config.dataProvider = data;
chartObj = AmCharts.makeChart( chart.div, chart.config );
setTimeout( processNextChart, 100 );
}
} );
}
}
// process first chart
processNextChart();
var图表=[{
“名称”:“图表1”,
“div”:“plot1”,
“配置”:克隆(chartConfigLineOne),
“查询”:
}, {
“名称”:“图表2”,
“div”:“plot2”,
“配置”:克隆(chartConfigLineOne),
“查询”:
} ];
//在此处对每个图表的配置进行所需的任何修改
// ...
//创建图表的函数
函数processNextChart(){
如果(图表长度){
var chart=charts.shift();
$.ajax({
键入:“POST”,
url:“query_db.php”,
数据:{
“db_que”:chart.query
},
数据类型:“json”,
上下文:document.body,
全球:错,
async:true,
成功:功能(数据){
chart.config.dataProvider=数据;
chartObj=AmCharts.makeChart(chart.div,chart.config);
设置超时(processNextChart,100);
}
} );
}
}
//过程优先图
processNextChart();
请注意,我是如何用一个包含所有适用数据的数组简化整个图表数组的
请注意,上面的代码没有经过现场测试,只是作为您自己实现的指导点。不要将
JavaScript
与PHP
混用,就像db\u query[1]=;
。这太可怕了。试着不要使用多个var a;var b;var c;
,而只使用var a=123,b=345,…
。如果你不改变你的编程风格,总有一天你的代码会看起来像spagetti。而不是像警报(数据)
那样使用console.log(数据)
。你的编程风格在几年前就已经过时了。因此,你最好在JavaScript
中阅读一些关于专业编程的书籍。你好,雅可比安-谢谢你的指导。我是一名编程新手。学习曲线肯定很陡峭。我能请你帮助我理解如何做我正在尝试的事情吗另外,如果您能快速向我介绍如何访问javascript内部的PHP数据或其他方法,那将非常有帮助。您已经知道如何访问javascript内部的PHP
数据。这实际上是ajax
在您的示例中所做的。退一步,我有一个主要问题用户选择值的页面。然后单击提交,这些值将发布到动态构造SQL的PHP页面(接收数据和构建SQL查询发生在节之间。在这一节之后,我有一个javascript节,里面有ajax代码。因此,要访问PHP代码中构建的SQL,我使用db_query[1]=您能建议一种完全不同的方法吗?我很乐意按照您建议的方法实现它。不幸的是,SQL查询都是不同的(它们返回的列数不同)。这就是为什么我要循环:-(将此数据库逻辑移到服务器端。我的意思是,我有一堆SQL查询,我一个接一个地执行,并为每个查询结果绘制图表。SQL输出有不同的列数。例如,日期,第一个SQL的输出计数(a),日期,第二个SQL的计数(C),日期,名称,计数(F)对于第三个和更多的组合。我知道这与
var charts = [ {
"name": "chart1",
"div": "plot1",
"config": clone( chartConfigLineOne ),
"query": <? php echo json_encode( $db_query_1 ) ?>
}, {
"name": "chart2",
"div": "plot2",
"config": clone( chartConfigLineOne ),
"query": <? php echo json_encode( $db_query_2 ) ?>
} ];
// do whatever modifications to each chart's config you need here
// ...
// function that creates the chart
function processNextChart() {
if ( charts.length ) {
var chart = charts.shift();
$.ajax( {
type: 'POST',
url: "query_db.php",
data: {
'db_que': chart.query
},
dataType: 'json',
context: document.body,
global: false,
async: true,
success: function( data ) {
chart.config.dataProvider = data;
chartObj = AmCharts.makeChart( chart.div, chart.config );
setTimeout( processNextChart, 100 );
}
} );
}
}
// process first chart
processNextChart();