2010-03-20 42 views
6

我完全不熟悉javascript和ajax世界,但努力學習。我在XMLHttpRequest中缺少什麼?

現在我正在測試XMLHttpRequest,即使是最簡單的示例,我也無法完成工作。這是代碼,我試圖運行

<script type="text/javascript"> 
     function test() { 
      xhr = new XMLHttpRequest(); 

      xhr.onreadystatechange = function() { 
       if (xhr.readyState == 4 && xhr.status == 200){ 
        var container = document.getElementById('line'); 
        container.innerHTML = xhr.responseText; 
       } else { 
        alert(xhr.status); 
       } 
      } 

      xhr.open('GET', 'http://www.google.com', true);     
      xhr.send(null); 
     } 
    </script> 

我總是與狀態0我讀過噸腹板這個得到警報,我不知道我錯過了什麼。我會感謝任何幫助,謝謝!

回答

13

您正在遇到Same Origin Policy

除非您的代碼實際上在www.google.com上運行(這不太可能),否則會出現錯誤。

此外,雖然這不會導致您目前遇到問題,但這種做法很差,可能會導致競爭狀況,因此您會在整個地方使用全局變量。

充分利用XHR局部變量的函數

var xhr = new XMLHttpRequest(); 

,並參考其與thisonreadstatechange方法內。

if (this.readyState == 4 && this.status == 200){ 
// etc etc 
8

David's answer以下:

你必須使用相對路徑保持相同的起源策略中。否則大多數瀏覽器將簡單地返回一個空的responseTextstatus == 0

作爲一種可能的解決方法,您可以設置一個非常簡單的reverse proxy(如果您使用的是Apache,則爲mod_proxy)。這將允許您在AJAX請求中使用相對路徑,而HTTP服務器將充當任何「遠程」位置的代理。

在mod_proxy中設置反向代理的基本配置指令是ProxyPass。如下您通常會使用它:

ProxyPass  /ajax/  http://google.com/ 

在這種情況下,瀏覽器會請求/ajax/search?q=stack+overflow但服務器會通過充當代理http://google.com/search?q=stack+overflow服務於這個。

1

對丹尼爾和大衛+1正確的答案,我想補充說,有很少的情況下(除非你只是想更好地學習JS),你應該直接使用xhr副使用像jQuery這樣的數據庫,經過全球數百萬開發者的測試和驗證。它還有很多其他有用的功能,可以幫助您進行ajax開發(如動畫和DOM操作)。

保羅

2

除了同源策略的問題,您alert是不合邏輯的地方。當您使用XMLHttpRequest時,只要readyState發生更改,將調用分配給xhr.onreadystatechange的函數。 readyState應該(從理論上)從0(初始化)到1(發送)到2(加載)到3(交互)到4(完成)。

你的代碼做什麼檢查readyState,看看是否請求完成(if (xhr.readyState == 4)),如果沒有,alertHTTP status code。由於請求尚未發送(或剛剛發送),因此不應該有HTTP狀態。

理想情況下,您應該將alert移動到if塊內,以便它在完成時告訴您。