2009-08-12 131 views
0

我是新來的阿賈克斯,這讓我難住。這是相對簡單的,但在第一個xhr.open()的onclick處理程序上運行。 Firebug說這不是一個函數,我的猜測是XMLHttpRequest對象沒有被創建,但我不確定。有人有主意嗎?XMLHttpRequest對象沒有被實例化?

在此先感謝。

function init(){ 

function getXMLHTTP(){ 
    var xhr = false; 
    if (window.XMLHttpRequest) { 
     xhr = new XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) { 
      xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    return xhr; 
} 

function updatePage(theData){ 
    $('results').innerHTML = theData; //TODO: pretty this up with mootools 
} 

var xhr = getXMLHTTP(); 

if (xhr) { 
    xhr.onreadystatechange = function(){ 
     if (xhr.readyState == 4) { 
      if (xhr.status == 200) { 
       var theData = xhr.responseText; 
       updatePage(theData);    
      } 
      else{ 
       alert("Error communicating to web service!"); 
      } 
     } 
    } 

    $('submit_btn').onclick = function(xhr){ 
     if ($('state').value != "") { 
      var theValue = $('state').value; 
      xhr.open("GET", "/inc/calc.php?state="+theValue, true); //Ajax 101: 3rd argument marks object as asynchronous 
      xhr.send(NULL); 
     } 
     else if ($('city').value != "") { 
      xhr.open("GET", "/inc/calc.php?city="+$('city').value, true); 
      xhr.send(NULL);   
     } 
     else if ($('county').value != "") { 
      xhr.open("GET", "/inc/calc.php?county="+$('county').value, true); 
      xhr.send(NULL);   
     } 
     else { 
      //the form is empty, or just down payment is filled. returns whole freakin' table. 
      xhr.open("GET", "/inc/calc.php", true); 
      xhr.send(NULL);    
     } 
    } 
} 

}

+0

你確定你不是叫false.open() 檢查類XHR的Firebug控制檯。 – klochner 2009-08-12 01:47:46

回答

1

與您的代碼的問題是的onclick功能。你已經把xhr放在函數的參數列表中。請記住,當一個函數被調用時,這個變量的值由調用者設置。在這種情況下,它將是事件調度程序,它可能會將xhr變量設置爲事件對象,該對象沒有打開的函數。

如果您從的onclick函數的參數列表中的XHR變量,那麼它會尋找父範圍,在全球範圍內XHR變量,它會找到它,它應該工作。我還沒有測試過它。

我假設你正在使用某種框架,以及(由頻繁使用$的判斷,並引用MooTools的)。這個框架可能有一個內置的ajax函數,以及一個跨瀏覽器事件模型。嘗試使用它,你會遇到更少的問題。

0

分配時創建新的函數,它接受一個名爲xhr參數onclick處理程序:

$('submit_btn').onclick = function(xhr){ 
    ... 
    xhr.open("GET", "/inc/calc.php?state="+theValue, true); 
    ... 
} 

按鈕上的點擊將無法通過一個XMLHttpRequest對象的處理程序,所以xhr不會有open()方法。 xhr的全局定義並不重要,因爲它受到本地參數定義的影響。

通常,您應該在需要時生成新的本地XMLHttpRequest對象,而不是嘗試使用全局的XMLHttpRequest對象。例如使用onclick功能,創建一個新的本地的XMLHttpRequest:

$('submit_btn').onclick = function(){ 
    var xhr = getXMLHTTP(); 
    xhr.open("GET", "/inc/calc.php?state="+theValue, true); 
    ... 
}