有沒有人試過巢狀的JS包法,語法如下:
<script lang='js'><script lang='js src='test.php?ref=a'></script></script>
目的是要當每執行一次外面JS的功能時,去調用test.php?ref=a內echo JS變數=php變數值的內容
目前搭配While已經可以將數據傳到另一個頁面,但出現外面JS的繪圖功能沒法使用
還是有神人有更好的解決方式 謝謝
$.get('text.php',function(data){ //data就是取回的變數值或是JSON物件 });
p = <?php echo '{ref:'.(isset($_GET['ref']))? '"'.$_GET['ref'].'"':'""'.'}'
<script lang='js src='test.php?ref=a'></script> <script lang='js'> setInterval(function() { if (typeof p != 'undefined') { // 拿 p 變數做事 } }, 1000); // <--時間間隔 </script>
<?php $Seqg=$_GET["s"]; //echo "document.write('".$Seqg."');"; $link = mysql_connect("127.0.0.1", "帳號", "密碼") or die("糟糕!無法連上資料庫喔!" . mysql_error()); $sql="select * from m where Seq = '".$Seqg."'"; $result=mysql_db_query("DATABASE",$sql,$link); $data=mysql_fetch_array($result); if ( !$data ) $Vg = 0; else $Vg = $data[V]; echo "var y = ".$Vg.";\n"; ?>
<?php 定義$Seqg的數值 ?> <script type="text/javascript"> // we use an inline data source in the example, usually data would // be fetched from a server var data = [], totalPoints = 300; function getRandomData() { if (data.length > 0) data = data.slice(1); // do a random walk while ( data.length < totalPoints ) { if ( data.length == 0) n = <?php echo $Seqg; ?>; else n++; //已經接收到數據,差在不能繪圖!(也就是最外層的JS不能動作) document.write('<script type=\"text\/javascript\" src=\"select.php?s='+ n +'\"><\/script>'); data.push(y); delete y; } // zip the generated y values with the x values var res = []; //document.write(data.length); for (var i = 0; i < data.length; ++i) res.push([i, data[i]]) return res; } } 剩下Code為繪圖且定時更新的部分... </script>
第一:Javascript Tag不能這樣巢狀使用。
第二:請盡量不要使用document.write,除非你很清楚你在做什麼。用php來產生前端的code還比較不會出問題...
第三:如果是要繪圖的話,取一個值就要去資料庫撈一次,這種做法太花時間了。建議每次要把所有資料一次讀出再畫出。
從你目前的邏輯看起來,你要跟資料庫撈資料的條件是從一個n到m的連續整數,所以只要傳n跟m給php,叫他把所有資料一次吐給你就好了。這樣用jsonp來處理也很方便。例如你可以這樣做:
php端(例如叫做test.php):
<pre class="c" name="code">
<?php
$n = mysql_real_escape_string($_GET['n']);
$m = mysql_real_escape_string($_GET['m']);
$link = mysql_connect("127.0.0.1", "帳號", "密碼") or die("糟糕!無法連上資料庫喔!" . mysql_error());
$sql="select * from m where Seq>=$n AND Seq<=$m";
mysql_select_db("DATABASE");
$result=mysql_query($sql,$link);
//mysql_db_query will be deprecated in php 5.3.0, so...don't use it
$Vgs = array();
while($data=mysql_fetch_array($result)) {
$Vgs[] = $data['V'];
}
if (count($Vgs)==0)
$Vgs[0] = 0;
header("Content-Type: text/javascript");
//change to "application/json-p" in the future...
echo 'updateData(['.implode(',', $Vgs).']);';
?>
javascript部分:
<pre class="c" name="code">
<?php
//定義$Seqg的數值
?>
<script type="text/javascript">
// we use an inline data source in the example, usually data would
// be fetched from a server
var data = [], totalPoints = 300, n=<?php echo $Seqg; ?>;
function getRandomData() {
if (data.length > 0)
data = data.slice(1);
// do a random walk
var m = n;
while ( data.length < totalPoints ) {
if ( data.length !== 0)
n++;
}
var scrpt = document.createElement('script');
scrpt.src = 'test.php?n='+m+'&m='+n;
document.getElementsByTagName('head')[0].appendChild(scrpt);
document.getElementsByTagName('head')[0].removeChild(scrpt);
scrpt = null;
//return res;
}
function updateData(ary) {
// zip the generated y values with the x values
var res = [], i=0;
for(i=0; i<ary.length; i++) {
data = data.concat(ary);
}
for (i=0; i < data.length; i++)
res.push([i, data[i]]);
//剩下Code為繪圖且定時更新的部分...
}
</script>
大致上是根據你的邏輯改的,但是我也可能猜錯你的邏輯就是了。另外,我沒實際跑過,有錯誤的話請多見諒。
script tag啦...沒有Javascript這種tag...剛送出就看到錯誤
謝謝fillano前輩的分享 但針對第三點我有個疑問 在JS的部分若我是第二次去呼叫getRandomData函式時,下面這句Code會去取php部分最新的結果囉
<pre class="c" name="code">document.getElementsByTagName('head')[0].appendChild(scrpt);
另外因為我還是ITHome的新手 若有一些菜味的行為還請多包涵阿
請參考PHP手冊:
http://php.net/manual/en/function.header.php
底下的Example #2 Caching directives。