酷!學園
技術討論區 => 網頁技術 => 主題作者是: abcabc 於 2009-03-01 17:36
-
各位大大, 你們好
我的問題是"什麼原因導致AJAX SEND 出的GET VALUE變成NULL
小弟正嘗識寫一個網頁遊戲
為了方便處理AJAX的問題
我把AJAX的FUNCTION一分為二: ajax(), ajax2()
ajax() 能正常運作, (SEND AND RESPONSE...)
可是ajax2()有時會有失敗的情況 (ajax2() 是用來UPDATE 資料庫沒有RESPONSE TEXT)
失敗原因我想大概是$_GET["mx"], $_GET["my"] 裡面的值沒有了
我嘗試利用以下內容取代ajax2()裡的內容:
var xxx = "update.php?mx="+mX+"&my="+mY;
myWindow=window.open(xxx,'','width=200,height=100');
結果成功UPDATE 資料庫,
至於ajax2(), 有關的FUNCTION 如下:
<script>
...
function ajax2()
{
xmlHttp1=GetXmlHttpObject1();
if (xmlHttp1==null)
{alert ("Browser does not support HTTP Request"); return;}
var url="update.php";
url=url+"?mx="+mX;
url=url+"&my="+mY;
xmlHttp1.onreadystatechange=stateChanged1;
xmlHttp1.open("GET",url,true);
xmlHttp1.send(null);
}
//-------------------------------------------------------------
function GetXmlHttpObject1(){
var xmlHttp1=null;try{xmlHttp1=new XMLHttpRequest();}catch (e){try{xmlHttp1=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){xmlHttp1=new ActiveXObject("Microsoft.XMLHTTP");}}return xmlHttp1;}
//-------------------------------------------------------------
function stateChanged1() // << 這個好像是可有可無不過還是加進去 ;D
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
fake = xmlHttp.responseText;
}
}
</script>
</head>
<body ... onMouseDown="ajax2()">
...
-
稍微改了一下,這樣是可以跑的,你看一下問題在哪裡:
<html>
<script>
var mX = 101;
var mY = 202;
function ajax2()
{
xmlHttp1=GetXmlHttpObject1();
if (xmlHttp1==null)
{alert ("Browser does not support HTTP Request"); return;}
var url="test429.php";
url=url+"?mx="+mX;
url=url+"&my="+mY;
xmlHttp1.onreadystatechange=stateChanged1;
xmlHttp1.open("GET",url,true);
xmlHttp1.send(null);
}
//-------------------------------------------------------------
function GetXmlHttpObject1(){
var xmlHttp1=null;try{xmlHttp1=new XMLHttpRequest();}catch (e){try{xmlHttp1=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){xmlHttp1=new ActiveXObject("Microsoft.XMLHTTP");}}return xmlHttp1;}
//-------------------------------------------------------------
function stateChanged1() // << 這個好像是可有可無不過還是加進去
{
if (xmlHttp1.readyState==4 && xmlHttp1.status==200)
{
fake = xmlHttp1.responseText;
alert(fake);
}
}
</script>
<body onmousedown="ajax2()">
</body>
</html>
(我的php檔名是test429.php,這應該不是問題。)
-
有用那個 JAVASCRIPT FRAMEWORK 嗎?
-
RE fillano 大大:
我後來把這個xmlHttp.readyState==4 換成 xmlHttp1.readyState==4了 ;D
不過我發現了真正問題是相同的url有時會出現前一個的結果
例如:
url: test429.php?mx=3&my=1
在11:16am的result是: mx(38) my(1) time(11:16)
url: test429.php?mx=3&my=1
在11:17am的result竟然也是: mx(38) my(1) time(11:16)
這個問題可以怎樣解決??
------------------------------
RE micmic3 大大:
應該沒有..我用notepad寫的
其實javascript framework 是什麼 @_@?
小弟是新手不太清楚javascript framework 的意思, 剛才到google查了一下..
是指Dojo 、Scriptaculous 、Prototype 、yui-ext 、Jquery 、Mochikit、mootools 、moo.fx 這類軟件嗎?
« 回覆文章 #3 於: 今天 11:22 »
________________________________________________
我想到解決方法了 :D
就是在url後面再加一個時間
(現在去測試)
« 最後編輯時間: 今天 11:38 由 abcabc »
_________________________________________________
失敗了 :(
-
要做網頁遊戲?你要考慮到幾個問題:
- cache
- 時間是用伺服器端還是客戶端取得的?
- ajax非同步處理的時候,執行順序有可能是無法保證的(網路延遲等等)
- javascript是基於單一執行緒的,他的非同步執行(ajax,setTimeout,setInterval,eventHandler等)是用一個像是環狀queue的方式來模擬的,不可以誤解為multi-thread,所以執行的時間精確性可能無法保障
-
感謝fillano 大大提醒, 我的問題就在cache ;D
-
Server端可以透過
header('Cache-Control:no-cache');
強制瀏覽器不要快取內容
不過IE6沒用,他沒遵循 HTTP 協定標準
一勞永逸的解決方式
就只有變更request url,讓瀏覽器覺得他是存取不同的頁面,就不會讀取快取資料了
var url="test429.php"; -> url="test429.php?"+randnumber;
randomnumber 就可以隨機產生一個亂數,在每次AJAX request時動態產生
-
Server端可以透過
header('Cache-Control:no-cache');
強制瀏覽器不要快取內容
不過IE6沒用,他沒遵循 HTTP 協定標準
一勞永逸的解決方式
就只有變更request url,讓瀏覽器覺得他是存取不同的頁面,就不會讀取快取資料了
var url="test429.php"; -> url="test429.php?"+randnumber;
randomnumber 就可以隨機產生一個亂數,在每次AJAX request時動態產生
假如randnumber 不幸重複也會出現相同的情況嗎 ::)
-
那就不要讓他重複阿...
怕random還會重複,那就另外加上new Date().getTime()。
-
不在乎長一點的話, 可以參考這個的第一個範例 :D :D
http://tw2.php.net/manual/en/function.uniqid.php (http://tw2.php.net/manual/en/function.uniqid.php)