2014-02-17 42 views
3

我有一個SIGN IN按鈕,即onclick調用函數login()。裏面login()我叫兩個功能:有沒有辦法讓功能在完成後立即採取行動?

function login() 
{ 
    signin(); 
    statistics_table(); 
    return false; 
} 

signin();在($_SESSION['name']=$username;)(ajax)執行實際的簽名和statistics_table();打印出相關的用戶或短信說表「請登錄查看您的統計數據」(如果登錄無效)(ajax)。

問題是statistics_table()總是打印出「請登錄...」。這好像signin()尚未執行實際簽名。顯然它只有在函數login()返回後纔會執行。

那麼是否有一種方法可以使signin()在其完成後立即應用其操作?

我也試圖使按鈕調用的函數signin()又經過statistics_table()一個,像這樣:

<input type="submit" value="Sign In" onclick="signin(); statistics_table();">

但這種方式,當我點擊它還挺重新加載按鈕的頁面(再次,我需要它是ajax)。

在此先感謝

編輯:

這裏是signin()實現:

function signin() 
{ 
    var name = document.getElementById('name').value; 
    var pw= document.getElementById('password').value; 
    if (window.XMLHttpRequest) 
    { 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    { 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      document.getElementById("Test").innerHTML=xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("POST","members.php?name="+name+ "&password="+pw,true); 
    xmlhttp.send(); 
    return false; 
} 
+4

第一'A'在'AJAX'代表'Asynchronous'。在進入下一條指令之前,它不會等待完成。發佈你的'signin()'函數的內部,所以我們可以看到你是如何實現它的。你需要一個回調才能成功執行,其中'statistics_table()'被調用。 –

+0

夠公平的。請參閱上面的編輯... –

+0

在'readystate'評估內移動'statistics_table()'? – Ohgodwhy

回答

1

你只需要移動statistics_table()呼叫onreadystatechange回調readyState == 4,所以在成功完成用戶登錄後調用它。

xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     // You're already writing some output with the XHR response 
     document.getElementById("Test").innerHTML=xmlhttp.responseText; 

     // So no problem writing a little more in the user's table: 
     statistics_table(); 
    } 
} 

然後主叫login()減少到:

function login() 
{ 
    signin(); 
    return false; 
} 

的另一個問題:我注意到,你在試圖發起一個POST要求,但事實上,你正在傳遞的參數查詢字符串,PHP將以$_GET的格式接收它們。相反,查詢字符串,參數的參數內屬於.send()

xmlhttp.open("POST","members.php", true); 
// Set the correct Content-type header for a POST form 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xmlhttp.send("name=" + encodeURIComponent(name) + "&password="+encodeURIComponent(pw)); 
+0

非常感謝!有效!但是你所建議的'xmlhttp.open'和'xmlhttp.send'對我來說效果不好。這樣'members.php'總是返回'錯誤的用戶名/密碼'。奇怪的。無論如何,好像我想念一些關於'ajax'的重要知識。任何推薦的網站學習? –

+0

也許這是因爲'members.php'我收到'username'和'password'這樣的:'如果(isset($ _ REQUEST [ '名'])&& isset($ _ REQUEST [ '密碼'])){.. 。'?? –

+0

的'。開(),。發送()'有故障參數作爲我複製/'。開()'粘貼的TRUE;第三個參數('異步= TRUE')插入'。發送()',遺憾。如果你剛剛入門,我更喜歡「Head First AJAX」這本書。當然,如果您有其他用途,像jQuery這樣的庫將會將這些內容抽象出來,但是對於單獨使用AJAX來說,一旦瞭解它應該如何工作,手動操作並不難。 –

相關問題