google pie chart not showing up on a modal popup - javascript

I am trying to Display a google chart on a Modal Popup. It works just fine on a normal page, But it does not appear on the Modal.
This is the code I am using. I am not sure what is going wrong.
this is the HTML and JS code that lives on a url, /polls/
<!--Div that will hold the pie chart-->
<h3 style="text-align:center;">Test</h3>
<hr>
<div id="chart_div" style="height: 500px;">
</div>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Options', 'Votes'],
['1', 11],
['2', 2],
['3', 2],
['4', 2],
['5', 7],
['6', 21],
]);
// Set chart options
var options = {
'backgroundColor': 'transparent',
'is3D': 'True',
'legend':'bottom',
'width':'100%',
'height':'100%',
chartArea:{left:0,top:0,width:"100%",height:"80%"}
};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
This is the html button that lives on page /home/
<a class="open-newmodal" href="/poll/">show poll</a>
So the idea is, that using a modal and jquery's .load() function, I should be able to load the chart that lives on /poll/ page to my /home/ page in the modal that I made.
This is the modal I am using
Modal Css
.newmodal-container {
display: none;
overflow-y: scroll;
position: fixed;
top: 0; right: 0;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.3);
}
.newmodal {
min-height: 100%;
height: auto;
width: 60%;
margin: 0px auto;
background-color: white;
padding: 20px;
border:1px solid #D3D3D3;
box-shadow: 0px 0px 5px #D3D3D3;
}
.dp-none {
display: none !important;
}
.dp-block {
display: block !important;
}
Modal JS
// New Modal
var body = $('body'),
main = $('.main'),
open_modal = $('.open-newmodal'),
close_modal = $('.close-newmodal'),
modal_container = $('.newmodal-container');
open_modal.live('click', function(event){
event.preventDefault();
body.addClass('body-locked');
modal_container.addClass('dp-block');
var href = $(this).attr('href');
modal = $('.data-load');
modal.load(href);
modal.attr("title",href);
});
close_modal.live('click', function(event){
event.preventDefault();
body.removeClass('body-locked');
modal_container.removeClass('dp-block');
modal.empty();
});
$(document).keyup(function(e) {
if (e.keyCode == 27){
event.preventDefault();
body.removeClass('body-locked');
modal_container.removeClass('dp-block');
modal.empty();
}
});

Okay, seeing as how you want to load another page as a modal graph, I have the following solution.
Initialize your google lib on the parent page as in http://jsbin.com/abucet/3, then make sure your child page doesn't re-initialize or re-include the libs that are loaded in the parent page, see child # http://jsbin.com/ajerol/5/edit
So basically the child page # http://jsbin.com/ajerol/5
Parent Page accessing child # http://jsbin.com/abucet/3
Parent Page
<!DOCTYPE html>
<html>
<head>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
<div id='headerDiv' style='background-color:#FF0000'>
Test Load
</div>
<div id='modalDiv' style='background-color:#FFAA00'>
Close this and click the button to load
Graph will be in a modal JQuery Dialog. Some of the google visualization initialization will be done in this page, not the page we're loading.
</div>
<button id='getIt'>Get the Graph</button>
</body>
</html>
Javascript
$('#getIt').click( function() {
$.get( "http://jsbin.com/ajerol/4",
function(data) {
var newGraph= "<div id='graphModal'>"+data+"</div>";
//clean up html
newGraph.replace('<body>','');
newGraph.replace('</body>','');
// we have the libs on this page, no need for that other cruft
newGraph.replace('<head.*head>','');
// debug:
//alert(newGraph);
// append to the current modal
$('body').append(newGraph);
// the graph page in modal
$('#graphModal').dialog({modal:true,width:300});
$('#getIt').parent().append('<button onclick="$(\'#graphModal\'\).dialog(\);">showGraph</button>');
}
);
});
// initial note
$('#modalDiv').dialog({modal:true});
// load this on the parent page, not the one we're calling
google.load("visualization", "1", {packages:["corechart"]});
Child Page
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Task', 'Hours per Day'],
['Work', 11],
['Eat', 2],
['Commute', 2],
['Watch TV', 2],
['Sleep', 7]
]);
var options = {
title: 'My Daily Activities'
};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
<div id="modal_chart" class="modal">
<!--Div that will hold the pie chart-->
<div id="chart_div" style="height: 300px; width: 300px;">
</div>
</div>
Child Javascript (on load)
drawChart();

Here's some code that might explain a little of what I meant from my comments.
Basically when the button is clicked to show the chart, that's when you'll do the loading for the pie chart.
Hope this puts you on the right track.
<button onclick="displayModal">Show Chart <\button>
<div id="modal_chart" class="modal">
<!--Div that will hold the pie chart-->
<h3 style="text-align:center;">Test</h3>
<hr>
<div id="chart_div" style="height: 500px;">
</div>
</div>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
function displayModal() {
$("#modal_chart").fadeIn(fast, function() {
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
});
}
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Options', 'Votes'],
['1', 11],
['2', 2],
['3', 2],
['4', 2],
['5', 7],
['6', 21],
]);
// Set chart options
var options = {
'backgroundColor': 'transparent',
'is3D': 'True',
'legend':'bottom',
'width':'100%',
'height':'100%',
chartArea:{left:0,top:0,width:"100%",height:"80%"}
};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}

I don't think there should be any explicit issues with loading the chart and then applying the modal code. Here's an example using some of the CSS you mentioned and JQueryUI alternatives http://jsbin.com/ajerol/3 (you can also actively edit the code here http://jsbin.com/ajerol/3/edit ).
<!DOCTYPE html>
<head>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Task', 'Hours per Day'],
['Work', 11],
['Eat', 2],
['Commute', 2],
['Watch TV', 2],
['Sleep', 7]
]);
var options = {
title: 'My Daily Activities'
};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
function displayModal() {
$("#modal_chart").show();
}
function hideModal() {
$("#modal_chart").hide();
}
function makeModal() {
$("#modal_chart").addClass('newmodal-container');
modal_container = $('.newmodal-container');
$("#modal_chart").show();
}
function jqueryModal() {
$("#modal_chart").dialog({ modal: true });
}
</script>
</head>
<body>
<button onclick="displayModal()">Show Chart </button>
<button onclick="hideModal()">Hide Chart </button>
<button onclick="makeModal()">Attach modal CSS </button>
<button onclick="jqueryModal()">jQuery modal </button>
<div id="modal_chart" class="modal">
<!--Div that will hold the pie chart-->
<h3 style="text-align:center;">Test</h3>
<hr>
<div id="chart_div" style="height: 300px; width: 300px;">
</div>
</div>
</body>
One question about your code, are you calling the following code prior to the html loading?
open_modal = $('.open-newmodal'),
close_modal = $('.close-newmodal'),
modal_container = $('.newmodal-container');

You can use google charts from remote url with modal like this:
On remote url you need to load google link in this way :
enter code here
$.getScript(
"https://www.google.com/jsapi",
function() {
google.load('visualization', '1', {'packages':['corechart'],"callback": drawChart});
});
Worked for me.

Related

Google Gauge not displaying

I'm trying to create an HTML based dashboard from which we can monitor the temperature of different server cabinets around work. My problem is that I can't get the gauges to display at all. Included below is the code I have so far.
Thanks
<!DOCTYPE html?>
<html>
<head>
<title>BCS Temperature Monitor</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"/>
<script type="text/javascript">
google.charts.load('current', {'packages':['gauge']]);
google.charts.setOnLoadCallback(drawChart);
function drawChart (){
var data = google.visualization.arrayToDataTable([
['Label', 'Value'],
['Memory', 80],
['CPU', 55],
['Network', 68]
]);
var options = {
width: 400, height: 120,
redFrom: 90, redTo: 100,
yellowFrom: 75, yellowTo: 90,
minorTicks: 5
};
var chart = new google.visualization.Gauge(document.getElementById('chart_div'));
chart.draw(data, options);
setInterval(function() {
data.setValue(0, 1, 40 + Math.round(60 * Math.random)));
chart.draw(data, options);
}, 13000);
setInterval(function() {
data.setValue(1, 1, 40 + Math.round(60 * Math.random)));
chart.draw(data, options);
}, 5000);
setInterval(function() {
data.setValue(2, 1, 60 + Math.round(20 * Math.random)));
chart.draw(data, options);
}, 26000);
}
</script>
</head>
<body>
<div class="page">
<div class="wrapper" id="header">
<div id="chart_div" style="width: 400px; height: 120px;">Hello</div>
</div>
<div class="wrapper" id="content">
</div>
<div class="wrapper" id="footer">
</div>
</div>
</body>
There are a number of small mistakes, see working demo here:
http://codepen.io/anon/pen/wzBArA
Script tags cannot be closed with <script />, you must use <script></script>
Your line calling google.charts.load used a second ] instead of a }
Your setInterval method had an extra ) after the Math.random call

Trying to load google charts into div with jQuery.load

Using a simple google chart, I am trying to use jQuery .load to push/pull that chart into another web page which will have the containing DIV:
<html>
<head>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"],callback:drawChart});
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Year', 'Sales', 'Expenses'],
['2004', 1000, 400],
['2005', 1170, 460],
['2006', 660, 1120],
['2007', 1030, 540]
]);
var options = {
title: 'Company Performance',
hAxis: {title: 'Year', titleTextStyle: {color: 'red'}}
};
var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
<div id="test_div">this div loads fine</div>
</body>
</html>
and here is a sample page that will have the containing DIV:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1query.min.js">
</script>
</head>
<body>
<script>
$(document).ready(function(){
$('#my_div').load('chart.html #chart_div', function() { drawChart(); });
});
</script>
<div id="my_div" style="width: 900px; height: 500px;"></div>
</body>
</html>
I have tried various loading techniques by removing google.setOnLoadCallback(drawChart);
and replacing it with the $document.ready but nothing seems to work.
I have gone through each one of the similar questions posted here but cannot seem to get this working.
any insight appreciated, Thanks!
edit: I noticed that by adding this line to the "container.html" file:
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
and changing:
$('#my_div').load('chart.html #chart_div', function() { drawChart(); });
to
$('#my_div').load('chart.html', function() { drawChart(); });
or even:
$('#my_div').load('chart.html');
It will indeed load the whole page into "#mydiv" but what I want is to just load the specific "#chart_div" into "#mydiv"
i have similar problem. My google chart not load with jquery version 1.11.1
if you remove jquery-1.11.1 or similar and add
<script type="text/javascript">
google.load("search", "1");
google.load("jquery", "1.4.2");
google.load("jqueryui", "1.7.2");
</script>`
its working

DIV to onclick event

How can I make the second DIV into an on click event? I have both of them displaying right now. I want to display one then when you click it displays the second one and back and forth.
I have never used HTML or JavaScript before so bear with me.
<html>
<head>
<DIV class="container"><HGROUP>
<H1>University of Illinois Hospital and Health Sciences</H1>
<H2>Storage Availability Charts and Graphs</H2></HGROUP><NAV
class="navbar"></div>
<DIV class="container">
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Storage', 'Terabytes'],
['Raw', 95],
['Usable', 34],
]);
var options = {
legend: 'none',
pieSliceText: 'label',
title: 'EEI VNX5700',
pieStartAngle: 100,
is3D: true,
};
var chart = new google.visualization.PieChart(document.getElementById('piechart'));
chart.draw(data, options);
}
</script>
</div>
<DIV class="container">
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Unallocated', 'Used', 'Free'],
['Cerner fast pool', 1000, 400],
['General fast pool', 1170, 460],
['Raid', 970, 644]
]);
var options = {
title: 'Unallocated',
vAxis: {title: 'Pools', titleTextStyle: {color: 'red'}}
};
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</div>
<body>
<div id="piechart" style="width: 700px; height: 400px;"></div>
</body>
<body>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
</body>
</head>
</html>
If you want them to switch visibilities you should give them each a seperate id.
Then you will need to use javascript (jquery is an easy way to work with javascript)
The jquery code would look something like this
$('#div1').click(function(){
$('#div2').show();
$('#div1').hide();
});
$('#div2').click(function(){
$('#div1').show();
$('#div2').hide();
});
To use jquery get the library here: http://jquery.com/
If you don't want to use jquery here are simple show/hide functions:
<script>
function show(id) {
if(document.getElementById(id).style.display=='none') {
document.getElementById(id).style.display='block';
}
return false;
}
function hide(id) {
if(document.getElementById(id).style.display=='block') {
document.getElementById(id).style.display='none';
}
return false;
}
</script>
then just add those to your div onclick: <div id='div1' onclick='show("div2");hide("div1")'></div>
Ok if you want a div to be hidden when the page loads you can do (in jquery) $('#idOfDiv').hide() then to get the div to toggle you can do a $('#idOfDiv').toggle() Now if you want something to be an onClick even all you have to do is put it all in a
$("#secondDiv").hide();
$( "#firstDiv" ).click(function() {
$('#secondDiv').toggle();
});
$( "#secondDiv" ).click(function() {
$('#firstDiv').toggle();
});
example: http://jsfiddle.net/AFPT2/1/

Javascript Chart Draw

I am using Google Charts API to integrate into a group project. The project is a visualisation toolkit for social media trends and such.
The problem is though, I have written a PHP program that visualises pie/bar/line charts etc. But I am only able to get them to work by declaring:
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
to visualise the individual charts. However I wish to create individual files for the visualisations. i.e. drawPie, drawLine, drawBar etc. This is so it would be able to work with a rule based data type tool we have created i.e. percentage and location could be drawn onto a pie chart.
Anyway I am having trouble with each individual file. Below is the code for the drawPie.js file:
<html>
<head>
<!-- Load JSAPI -->
<script type="text/javascript" src='https://www.google.com/jsapi?autoload={"modules":[{"name":"visualization","version":"1","packages":["corechart","table"]}]}'></script>
<script type="text/javascript">
//<!-- Load the API Package -->
google.load('visualization', '1.0', {'packages':['controls']});
//<!-- Callback when the Google Visualization API is Loaded -->
google.setOnLoadCallback(drawDashboard);
function drawPie() {
//<!-- Create the Table -->
var data = new google.visualization.DataTable();
data.addColumn('string', 'location');
data.addColumn('number', 'crimes');
data.addRows([ <?php echo $data_for_chart; ?> ]);
//<!-- Pass Options -->
var options = {
'legend': 'left',
'title': 'Crimes (per day)',
'is3D': 'True',
'width':700,
'height':300
};
//<!-- Instantiate and Draw Chart -->
var chart = new google.visualization.PieChart(document.getElementById('pie_chart'));
chart.draw(data, options);
</script>
</head>
<body>
<style> pie_chart {margin: 0 auto; }</style>
<div id="pie_chart"></div>
<style>
#left { margin-left: 15%; float: left; }
#right { margin-right: 15%; float: right; }
img { width: 200; height: 200;}
</style>
</body>
The code doesn't show the chart. Does anyone know what I'm doing wrong?
Thanks in advance.
You are loading the wrong package.
Change google.load('visualization', '1.0', {'packages':['controls']}); to google.load('visualization', '1.0', {'packages':['corechart']}); and it should work. If it doesn't, you have another problem beyond this (relatively simple) one.

jqPlot Bar Chart not displayed in Chrome and Mozilla

I am trying to display bar chart using jqPlot bar chart. I have doing code which display chart in Internet Explorer. But for same code chart does not displayed in Crome and Mozilla browser.
I have given the code below-
<%# taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%# page session="false" %>
<html>
<head>
<style>
<title>Home</title>
<script src="http://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://github.com/douglascrockford/JSON-js/blob/master/json2.js"> </script>
<script type="text/javascript" src="../resources/jQuery/jquery.min.js"></script>
<script type="text/javascript" src="../resources/jQuery/jquery.jqplot.min.js"></script>
<script type="text/javascript" src="../resources/jQuery/plugins/jqplot.barRenderer.min.js"></script>
<script type="text/javascript" src="../resources/jQuery/plugins/jqplot.pieRenderer.min.js"></script>
<script type="text/javascript" src="../resources/jQuery/plugins/jqplot.categoryAxisRenderer.min.js"></script>
<script type="text/javascript" src="../resources/jQuery/plugins/jqplot.pointLabels.min.js"> </script>
<link rel="stylesheet" type="text/css" href="../resources/jQuery/jquery.jqplot.min.css" />
<script>
function drawChart() {
alert("In draw chart");
var s1 = [2, 6, 7];
var s2 = [7, 5, 3];
var s3 = [2, 3, 5];
var s4 = [1, 7, 2];
// chart data
var dataArray = [s1, s2, s3, s4];
// x-axis ticks
var ticks = ['Jan', 'Feb', 'Mar'];
// chart rendering options
var options = {
seriesDefaults: {
renderer:$.jqplot.BarRenderer
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer,
ticks: ticks
}
}
};
// draw the chart
$.jqplot('showData', dataArray, options);
}// end
</script>
</head>
<body>
<button value="Get Employee Data" onclick="drawChart()">Get Chart</button>
<div id="showData" style="height: 400px; width: 400px;"></div>
</body>
</html>
Why this code does not work for Crome and Mozilla browser?
I was able to get the graph displaying in IE9, FF and Chrome by:
Removing the <style> tag. This tag prevented anything displaying in all browsers.
Adding <!DOCTYPE html> at the top of the file. This prevented an error in IE9.
Also, the way you are linking to json2.js is actually retrieving the Github page that displays the file, not the actual file itself.

Categories