Reputation: 3402
I took an example code from : http://canvasjs.com/html5-javascript-bar-chart/ ("Cost of pancake.."). When running it, it works of course.
I created a small html that when entering a url, it returns me exactly the second parameter that should be passed to : var chart = new CanvasJS.Chart("chartContainer",my_parameter);
code :
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.response;
alert(xmlhttp.responseText);
var toSend = xmlhttp.response;
var chart = new CanvasJS.Chart("chartContainer",toSend); // The problem is here
chart.render();
}
}
xmlhttp.open("GET","https://myURL",true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="myDiv"><h2>PRESS BUTTON!!!</h2></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</body>
<script type="text/javascript" src="canvasjs-1.7.0-beta/canvasjs.min.js"></script>
</head>
<body>
<div id="chartContainer" style="height: 300px; width: 100%;"></div>
</body>
</html>
MyURL is returning this (exactly what is written in the canvasJS chart example) :
{
title:{
text:"Cost Of Pancake Ingredients, 2011"
},
animationEnabled: true,
axisX:{
interval: 1,
labelFontSize: 10,
lineThickness: 0
},
axisY2:{
valueFormatString: "$ 0",
lineThickness: 0
},
toolTip: {
shared: true
},
legend:{
verticalAlign: "top",
horizontalAlign: "center"
},
data: [
{
type: "stackedBar",
showInLegend: true,
name: "Butter (500gms)",
axisYType: "secondary",
color: "#7E8F74",
dataPoints: [
{y: 3, label: "India"},
{y: 5, label: "US" },
{y: 3, label: "Germany" },
{y: 6, label: "Brazil" },
{y: 7, label: "China" },
{y: 5, label: "Australia" },
{y: 5, label: "France" },
{y: 7, label: "Italy" },
{y: 9, label: "Singapore" },
{y: 8, label: "Switzerland" },
{y: 12, label: "Japan" }
]
},
{
type: "stackedBar",
showInLegend: true,
name: "Flour (1kg)",
axisYType: "secondary",
color: "#F0E6A7",
dataPoints: [
{y: .5, label: "India" },
{y: 1.5, label: "US" },
{y: 1, label: "Germany" },
{y: 2, label: "Brazil" },
{y: 2, label: "China" },
{y: 2.5, label: "Australia" },
{y: 1.5, label: "France" },
{y: 1, label: "Italy" },
{y: 2, label: "Singapore" },
{y: 2, label: "Switzerland" },
{y: 3, label: "Japan" }
]
},
{
type: "stackedBar",
showInLegend: true,
name: "Milk (2l)",
axisYType: "secondary",
color: "#EBB88A",
dataPoints: [
{y: 2, label: "India" },
{y: 3, label: "US" },
{y: 3, label: "Germany" },
{y: 3, label: "Brazil" },
{y: 4, label: "China" },
{y: 3, label: "Australia" },
{y: 4.5, label: "France" },
{y: 4.5, label: "Italy" },
{y: 6, label: "Singapore" },
{y: 3, label: "Switzerland" },
{y: 6, label: "Japan" }
]
},
{
type: "stackedBar",
showInLegend: true,
name: "Eggs (20)",
axisYType: "secondary",
color:"#DB9079",
indexLabel: "$#total",
dataPoints: [
{y: 2, label: "India" },
{y: 3, label: "US" },
{y: 6, label: "Germany" },
{y: 4, label: "Brazil" },
{y: 4, label: "China" },
{y: 8, label: "Australia" },
{y: 8, label: "France" },
{y: 8, label: "Italy" },
{y: 4, label: "Singapore" },
{y: 11, label: "Switzerland" },
{y: 6, label: "Japan" }
]
}
]
}
I suspect that both xmlhttp.response
and xmlhttp.responseText
returning text..
If I remove the toSend
parameter and enter hardcoded the long JSON it works fine.
Can anyone please help?
------- editing with solution :
var toSend= eval ('('+ xmlhttp.responseText +')');
var chart = new CanvasJS.Chart("chartContainer",toSend);
chart.render();
Upvotes: 0
Views: 307
Reputation: 20633
Parse the JSON string to turn it into a JavaScript object.
var toSend;
try {
toSend = JSON.parse(xmlhttp.responseText);
} catch(e) {
toSend = xmlhttp.response;
}
var chart = new CanvasJS.Chart('chartContainer', toSend);
Upvotes: 1