2011-12-17 24 views
0

我試圖傳遞一個點擊DIV的ID到一個特定的函數,我碰到了一個奇怪的結果。由於錯誤狀態被觸發(ajax-loader.gif),該ID使其成功進入該函數,並將自身填充到啓動自循環的DIV中。通過單擊元素的ID與AJAX傳遞錯誤

但是,我不明白爲什麼AJAX返回一個未完成的就緒狀態。如果我用ID的硬編碼名稱替換'clicked_id',它會正常工作。但是,事實證明ID名稱正確地將它傳遞給函數,因爲錯誤事件正在所提供的ID的innerHTML中填充。

我很難過。有任何想法嗎?我敢肯定這是一個小菜鳥的錯誤,但我無法發現它。

我已經在腳本中發起了一個新的XMLHTTPRequest,爲了簡潔起見,我只是將其留出。我知道有可能更簡單的方法來做到這一點,如jQuery的點擊事件,但爲了我自己的利益,我想知道爲什麼這會被打破。

<div class='colour'><img src='media/recipe_save.jpg' id='showtime' onclick='javascript:getServerTime(this.id);'></div> 

function getServerTime(clicked_id) { 
    var thePage = 'ajax.recipesave.php'; 
    myRand = parseInt(Math.random()*999999999999999); 
    var theURL = thePage +"?rand="+myRand; 
    myReq.open("GET", theURL, true); 
    myReq.onreadystatechange = theHTTPResponse(clicked_id); 
    myReq.send(null); 
} 

function theHTTPResponse(clicked_id) { 
    alert(clicked_id); 
    if (myReq.readyState == 4) { 
    if(myReq.status == 200) { 
     var timeString = myReq.responseXML.getElementsByTagName("timestring")[0]; 
     document.getElementById(clicked_id).innerHTML = timeString.childNodes[0].nodeValue; 
    } 
    } else { 
    document.getElementById(clicked_id).innerHTML = '<img src="media/ajax-loader.gif"/>'; 
    } 
} 

回答

1

myReq.onreadystatechange需要分配一個函數引用。你不能給它分配執行功能的結果,這就是你這一行做什麼:

myReq.onreadystatechange = theHTTPResponse(clicked_id); 

這是立即執行theHTTPResponse(clicked_id)和分配結果(這是不確定的),以myReq.onreadystatechange。因此,你最終沒有回調onreadystatechange

上面的行改成這樣:

myReq.onreadystatechange = function() {theHTTPResponse(clicked_id)}; 

這樣一來,你到onreadystatechange分配的實際功能,該功能將得到時態的變化,而不是立即調用。

+0

太棒了!我知道這是基本的。非常感謝,非常感謝你描述了jfriend00背後的推理。 – 2011-12-17 14:31:47