iT邦幫忙

0

關於JavaScript中巢狀的使用方式(不知道這種我自創還是真的有這種寫法)

有沒有人試過巢狀的JS包法,語法如下:
<script lang='js'><script lang='js src='test.php?ref=a'></script></script>
目的是要當每執行一次外面JS的功能時,去調用test.php?ref=a內echo JS變數=php變數值的內容
目前搭配While已經可以將數據傳到另一個頁面,但出現外面JS的繪圖功能沒法使用
還是有神人有更好的解決方式 謝謝

看更多先前的討論...收起先前的討論...
wordsmith iT邦高手 1 級 ‧ 2012-06-21 13:45:17 檢舉
我是沒有看過這種寫法。

為什麼不用ajax的方式直接去取得變數值就好了呢?
kyo200098 iT邦新手 5 級 ‧ 2012-06-21 13:58:25 檢舉
因為我有嘗試過用AJAX的方式去取,但是我找到的範例是只能在body內以div的方式叫出來 但是想要的是將取到的變數在另外一個頁面內的JavaScript的Script標籤內做處理,因為這個Script內我有用while迴圈,它會去一直向test.php?ref=變動的數值索取更新的資料,然後將取來的數值做進一步的處理
wordsmith iT邦高手 1 級 ‧ 2012-06-21 17:24:48 檢舉
還是有點不太懂,我試著釐清一下。

1. test.php的ref是要處理的變數值
2. JS拿到這個變數後,再進行後續處理

如果test.php就是只有ref=變數值,簡單的作法,可以讓test.php直接echo 這個變數的結果,或者是讓它傳回JSON格式{'ref':'變數結果'}。

然後JS的部分,用jQuery的$.get方法,如:
$.get('text.php',function(data){
     //data就是取回的變數值或是JSON物件
});


另外,用while迴圈取值,聽起來很恐佈,好像在對自己做ddos攻擊一樣。

應該是可以用setInterval,例如間隔幾秒或幾分鐘,去自動取一次值。

不過這都是猜測,還是要看你實際的需求。
zanhsieh iT邦新手 4 級 ‧ 2012-06-22 04:30:29 檢舉
個人覺得樓主基本上在做JSONP, 需求在於輪詢 php 端/伺服器端的變數, 還有跨網域存取的需求. 樓主可以試着這樣做:
PHP端 (test.php):
p = <?php echo '{ref:'.(isset($_GET['ref']))? '"'.$_GET['ref'].'"':'""'.'}'

JavaScript端:
<script lang='js src='test.php?ref=a'></script>
<script lang='js'>
setInterval(function() { 
  if (typeof p != 'undefined') {
    // 拿 p 變數做事
  }
}, 1000); // <--時間間隔
</script>
kyo200098 iT邦新手 5 級 ‧ 2012-06-22 11:38:46 檢舉
不知道wordsmith前輩說的就是zanhsieh前輩說的處理方式嗎?不過透過SetInterval的方式會去取得最新test.php?ref=a的結果嗎?因為我的Get變數會一直做改變,印象中我Try的結果是只會取第一次執行的結果後就不會更新了,可能是我說的不夠明白,我直接貼Source Code可能會比較清楚,目前是可以把值傳過來,但差在最外層的JS(繪圖)沒辦法正常工作,因為我有做交叉測試Try過(註解掉document.write那行後可以正常工作),謝謝
PHP端:
<?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";
?>
kyo200098 iT邦新手 5 級 ‧ 2012-06-22 11:39:37 檢舉
因為字數超過限制 補上JS的部分:
JavaScript端:
<?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>
fillano iT邦超人 1 級 ‧ 2012-06-22 17:12:40 檢舉
while迴圈...javascript沒有sleep,這樣會...XD
kyo200098 iT邦新手 5 級 ‧ 2012-06-22 17:27:30 檢舉
老闆要求 我也不想操翻Client的Browser落寞
fillano iT邦超人 1 級 ‧ 2012-06-22 19:24:45 檢舉
我只能說,您對在網頁中執行Javascript相關技術並不熟悉。既然是老闆的要求,請說一下老闆的要求是什麼,這樣可以建議比較合理的架構與可行的方式。
fillano iT邦超人 1 級 ‧ 2012-06-22 19:53:49 檢舉
另外,code貼不下的話,建議貼到https://gist.github.com或是http://jsfiddle.net(這個以html+Javascript為主)

1 個回答

8
fillano
iT邦超人 1 級 ‧ 2012-06-23 07:07:05
最佳解答

第一:Javascript Tag不能這樣巢狀使用。

第二:請盡量不要使用document.write,除非你很清楚你在做什麼。用php來產生前端的code還比較不會出問題...

第三:如果是要繪圖的話,取一個值就要去資料庫撈一次,這種做法太花時間了。建議每次要把所有資料一次讀出再畫出。

從你目前的邏輯看起來,你要跟資料庫撈資料的條件是從一個n到m的連續整數,所以只要傳n跟m給php,叫他把所有資料一次吐給你就好了。這樣用jsonp來處理也很方便。例如你可以這樣做:

php端(例如叫做test.php):

&lt;pre class="c" name="code">
&lt;?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&lt;=$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部分:

&lt;pre class="c" name="code">
&lt;?php
//定義$Seqg的數值
?>
&lt;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=&lt;?php echo $Seqg; ?>;
function getRandomData() {
	if (data.length > 0)
		data = data.slice(1);
	// do a random walk
	var m = n;
	while ( data.length &lt; 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&lt;ary.length; i++) {
		data = data.concat(ary);
	}
	for (i=0; i &lt; data.length; i++)
		res.push([i, data[i]]);
	//剩下Code為繪圖且定時更新的部分...
}
&lt;/script>

大致上是根據你的邏輯改的,但是我也可能猜錯你的邏輯就是了。另外,我沒實際跑過,有錯誤的話請多見諒。

fillano iT邦超人 1 級 ‧ 2012-06-23 07:08:25 檢舉

script tag啦...沒有Javascript這種tag...剛送出就看到錯誤Orz

kyo200098 iT邦新手 5 級 ‧ 2012-06-23 10:26:10 檢舉

謝謝fillano前輩的分享 但針對第三點我有個疑問 在JS的部分若我是第二次去呼叫getRandomData函式時,下面這句Code會去取php部分最新的結果囉

&lt;pre class="c" name="code">document.getElementsByTagName('head')[0].appendChild(scrpt);

另外因為我還是ITHome的新手 若有一些菜味的行為還請多包涵阿毆飛

fillano iT邦超人 1 級 ‧ 2012-06-23 15:48:01 檢舉

請參考PHP手冊:
http://php.net/manual/en/function.header.php
底下的Example #2 Caching directives

我要發表回答

立即登入回答