2014-02-25 38 views
1

所以我在嘗試重用XMLHttp請求對象時遇到了問題。我正在嘗試將AJAX整合到網站中!XJAX重用XMLHttp對象

見下面我的代碼:

var XMLHttp = createXMLHttpRequestObject(); 
function createXMLHttpRequestObject() { 
    var xmlHTTP; 

    //First to deal with Internet Explorer >:(
    if (window.ActiveXObject){ 
    try { 
     xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    catch (e) { 
     xmlHTTP = false; 
    } 
    } else { 
    try { 
     xmlHTTP = new XMLHttpRequest(); 
    } 
    catch (e) { 
     xmlHTTP = false; 
    } 
    } 

    if (!xmlHTTP) 
    alert("Oops! Someone just unplugged the internet!"); 
    else 
    return xmlHTTP; 

}// XMLHttpRequest 

function getAboutMe() { 
    if (XMLHttp.readyState == 0 || XMLHttp.readyState == 4) { 
    XMLHttp.open("GET", "http://repairiphonesuk.com/rachael/AJAX/getAboutMe.php", true); 
    XMLHttp.onreadystatechange = handleServerResponse('AboutMe'); 
    XMLHttp.send(); 
    } else { 
    setTimeout(getAboutMe(), 1000); 
    alert("no"); 
    } 
} 

function getHome() { 
    if (XMLHttp.readyState == 0 || XMLHttp.readyState == 4) { 
    XMLHttp.open("GET", "http://repairiphonesuk.com/rachael/AJAX/getHome.php", true); 
    XMLHttp.onreadystatechange = handleServerResponse('home'); 
    XMLHttp.send(); 
    } else { 
    setTimeout(getHome(), 1000); 
    alert("no"); 
    } 
} 


function handleServerResponse(from) { 
    if (XMLHttp.readyState == 4 && XMLHttp.status == 200) { 
    document.getElementById("displayContent").innerHTML = XMLHttp.responseText; 
    if (from === 'home') { 
     document.getElementById('displayContent').style.backgroundColor=transparent; 
    } 
    } else if (XMLHttp.status = 404) { 
    } 
} 

當取出getHome()功能和參數,它的工作原理手柄的要求!我錯過了明顯的東西嗎?

+0

你在這裏有內存衝突potensial,我猜你只是通過調用一個接一個來設置這些關閉,但如果你服務器滯後或類似這樣的事情,那麼你冒着時間移動的風險,他們試圖同時使用相同的變量,這是一個很大的不,不,你可以做到這一點,如果你創建它們作爲單獨的變量範圍,但我仍然不確定爲什麼你試圖重複使用相同的可用瀏覽器內存清理程序比你想象的要好得多,並且修改相同的變量將與你爲每個 –

+0

使用不同的變量完全相同哦,讓你的代碼更加容易混淆,有一種更好的方式來獲得每個人都可以理解的通用AJAX調用 它位於此鏈接上 http://en.wikipedia.org/wiki/Xmlhttprequest在標題爲Internet Explorer 5, 5.5和6' –

回答

0

onreadystatechange需要一個功能分配,你在做什麼是調用函數和分配返回onreadystatechange。通過將您的代碼包裝在匿名函數中來糾正此問題。

XMLHttp.onreadystatechange = function(){handleServerResponse('home')}; 

setTimeout帶一個函數作爲第一個參數,你做什麼調用函數,基本符合onreadystatechange同樣的事情,因爲getHome沒有采取任何參數只是傳遞函數本身

setTimeout(getHome, 1000); 
+0

這仍然不會工作,除了AJAX可以是ASYNC和SYNC這一事實之外,OP如何嘗試使用相同的可用於2個Ajax調用,所以他冒險在爲他們需要的每個對象編寫內存時發生衝突走出全球範圍以防止碰撞。如果一個頁面請求得到它的內容,它就會觸發readystatechange代碼,但正如發生的那樣,另一個請求已經收回它的內容,它將會與代碼 –

+0

發生衝突並導致不可預料的問題,因此,您建議只將單獨的Javascript文件與不同的XMTHttp對象它自己的句柄,createXMLHttpObject ...等方法? –