2016-04-03 86 views
0

我正在繪製一張顯示溫度,日期和時間的圖表。到目前爲止,所有工作都很好,但爲了從我的MySQL數據庫中獲取新值,以便完全刷新我的頁面。 我希望能夠在不按刷新按鈕的情況下更新圖形。 這是代碼:如何在按下按鈕時更新D3.js中的圖形?

<?php require($_SERVER['DOCUMENT_ROOT'] . '/assets/php/getTemp.php'); ?> 

<!DOCTYPE html> 
<meta charset="utf-8"> 

<head> 
    <title>RPi</title> 
</head> 

<style> 

div.tooltip { 
    position: absolute; 
    text-align: center; 
    width: 120px; 
    height: 28px; 
    padding: 3px; 
    font: 12px sans-serif; 
    background: lightgrey; 
    border: 0px; 
    border-radius: 8px; 
    pointer-events: none; 
} 


body { font: 14px Arial;} 

path { 
    stroke: #FF8C00; 
    stroke-width: 3; 
    fill: none; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: black; 
    stroke-width: 2; 
    shape-rendering: crispEdges; 
} 

.grid .tick { 
    stroke: grey; 
    stroke-opacity: 0.3; 
    shape-rendering: geometricPrecision; 
} 
.grid path { 
      stroke-width: 0; 
} 


</style> 
<body> 


<div id="option"> 
    <input name="updateButton" 
      type="button" 
      value="Update" 
      onclick="updateData()" 
    /> 
</div> 


<!-- load the d3.js library --> 
<script src="http://d3js.org/d3.v3.min.js"></script> 

<script> 


var margin = {top: 30, right: 20, bottom: 30, left: 50}, 
    width = 800 - margin.left - margin.right, 
    height = 270 - margin.top - margin.bottom; 

var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; 
var formatTime = d3.time.format("%d-%m-%Y %H:%M:%S"); 

var x = d3.time.scale().range([0, width]); 
var y = d3.scale.linear().range([height, 0]); 


var xAxis = d3.svg.axis().scale(x) 
    .orient("bottom"); 

var yAxis = d3.svg.axis().scale(y) 
    .orient("left").ticks(5); 

var valueline = d3.svg.line() 
    .interpolate("basis") 
    .x(function(d) { return x(d.datetime); }) 
    .y(function(d) { return y(d.temperature); }); 

var div = d3.select("body").append("div") 
    .attr("class", "tooltip") 
    .style("opacity", 0); 

var svg = d3.select("body") 
    .append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
     .attr("transform", 
       "translate(" + margin.left + "," + margin.top + ")"); 

function make_x_axis() { 
    return d3.svg.axis() 
     .scale(x) 
     .orient("bottom") 
     .ticks(5) 
} 

function make_y_axis() { 
    return d3.svg.axis() 
     .scale(y) 
     .orient("left") 
     .ticks(5) 
} 

<?php echo "data=".$json_data.";" ?> 
data.forEach(function(d) { 
d.datetime = parseDate(d.datetime); 
d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 


svg.append("path") 
.attr("class", "line") 
.attr("d", valueline(data)); 


svg.selectAll("dot") 
    .data(data) 
.enter().append("circle") 
    .attr("r", 4) 
    .attr("cx", function(d) { return x(d.datetime); }) 
    .attr("cy", function(d) { return y(d.temperature); }) 
    .on("mouseover", function(d) { 
     div.transition() 
      .duration(200) 
      .style("opacity", 1); 
     div.html(formatTime(d.datetime) + "<br/>" + d.temperature + " &#8451") 
      .style("left", (d3.event.pageX + 16) + "px") 
      .style("top", (d3.event.pageY + 16) + "px") 
     .style("position", "absolute"); 
     }) 
    .on("mouseout", function(d) { 
     div.transition() 
      .duration(50) 
      .style("opacity", 0); 
}); 

svg.append("g") 
    .attr("class", "grid") 
    .attr("transform", "translate(0," + height + ")") 
    .call(make_x_axis() 
     .tickSize(-height, 0, 0) 
     .tickFormat("") 
) 

svg.append("g") 
    .attr("class", "grid") 
    .call(make_y_axis() 
     .tickSize(-width, 0, 0) 
     .tickFormat("") 
) 

svg.append("g") 
.attr("class", "x axis") 
.attr("transform", "translate(0," + height + ")") 
.call(xAxis); 

svg.append("g") 
.attr("class", "y axis") 
.call(yAxis); 


</script> 
</body> 

我試着這樣做:

function updateData() { 

//d3.json("/assets/php/getTemp.php", function(error, data) { 
     <?php echo "data=".$json_data.";" ?> 
     data.forEach(function(d) { 
     d3.select("body").selectAll("svg") 
     d.datetime = parseDate(d.datetime); 
     d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 

var svg = d3.select("body").transition(); 

    svg.select(".line") 
     .duration(750) 
     .attr("d", valueline(data)); 
    svg.select(".x.axis") 
     .duration(750) 
     .call(xAxis); 
    svg.select(".y.axis") 
     .duration(750) 
     .call(yAxis); 
}; 

但沒有任何反應,甚至不是一個錯誤。

如果它的事項,這是用來獲取溫度和時間形式的MySQL的PHP​​代碼:

<?php 
$hostname = 'localhost'; 
$username = 'root'; 
$password = 'admin'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=temp_database", 
           $username, $password); 


    $sth = $dbh->prepare(" 
     SELECT `datetime`, `temperature` FROM `tempLog` 
    "); 
    $sth->execute(); 


    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 


    $dbh = null; 

} 
catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

$json_data = json_encode($result); 
?> 

我需要做什麼?

+0

看起來是對我的。你可以用一個你正在使用的數據類型的例子把它粘在一個jsfiddle中嗎? – BHouwens

+0

當然:https://jsfiddle.net/zzmoL7Le/4/我希望鏈接是好的。 –

+0

問題似乎是您在'updateData'函數中對數據執行的格式。如果您在代碼運行時註釋該部分 – BHouwens

回答

0

查看使用d3.json函數。這可以讓你從php腳本獲取json,而無需從頭重新加載整個頁面。這是AJAX的東西,但d3 helper函數隱藏細節。

https://github.com/mbostock/d3/wiki/Requests

PS。請記住,這將是一個異步調用,所以看到這裏接受的答案還有: JSON output from PHP using d3.json


至於爲什麼它沒有目前的工作,我的預感*,但沒有足夠的信息來確認,是那有沒有變化,因爲它總是相同的數據,所以不會有任何變化

<?php echo "data=".$json_data.";" ?> 

該行^^^在updateData在一開始被評估一次,然後整體功能被砰的一聲扔到到JavaScript的境界。然而,很多時候,如果調用updateData,那麼以前生成的javascript變量(data={some_json})不會在沒有重新加載生成updateData的php頁面的情況下更改,即使您調用生成服務器端變量的數據庫相關的php。

*可能是廢話,但上面的位仍然是正確的

相關問題