2010-03-15 118 views
2

我有下面一段代碼:「未指定的錯誤」爲什麼IE不顯示此警報()?

// setup the AJAX request 
var pageRequest = false; 
if(window.XMLHttpRequest)  pageRequest = new XMLHttpRequest(); 
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP"); 

// callback 
pageRequest.onreadystatechange = function() { 

    alert('pageRequest.readyState: ' + pageRequest.readyState 
     + '\npageRequest.status: ' + pageRequest.status); 
} 

pageRequest.open('POST','ajax.php',true); 

// q_str contains something like 'data=value...' 

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
pageRequest.setRequestHeader("Content-length", q_str.length); 
pageRequest.setRequestHeader("Connection", "close"); 

pageRequest.send(q_str); 

這正常在Chrome中,但是IE扼流圈上,吐出的並且它指向alert()的行。爲什麼它不顯示警報?

編輯:好吧,以後我取消錯誤對話框,我得到三個警報預期....

編輯:現在真的越來越怪異。如果我改變

alert('pageRequest.readyState: ' + pageRequest.readyState 
     + '\npageRequest.status: ' + pageRequest.status); 

alert('pageRequest.readyState: ' + pageRequest.readyState); 

,然後它工作,我得到5個警報。 (1,1,2,3,4)

+0

你確定pageRequest的構建是否正確?如果您在本地運行此IE,則默認情況下,IE會拒絕將ActiveX用於本地頁面。 – 2010-03-15 22:56:04

+0

我正在本地網絡服務器上運行此操作。 – 2010-03-15 22:56:34

+1

你可以站起來;在你之後}。也許這是相關的。 – 2010-03-15 22:58:49

回答

1

狀態是HTTP響應前兩次調用方法時,您將返回1和1作爲readyState。 readyState 1表示"The object has been created, but the send method has not been called."。那時服務器沒有狀態響應,因爲它沒有收到任何請求,因此在警報中使用狀態會給你一個錯誤。

+0

謝謝您最終解釋爲什麼此警報會產生錯誤。我想知道爲什麼它可以在Chrome和FF ... – 2010-03-15 23:21:33

+3

[離線]有點失望,看到紙Clippy頭像沒有答案開始「看起來你正在嘗試...」:( – akamike 2010-03-15 23:28:22

+0

內心深處(好的,非常深的) – Adam 2010-03-16 16:06:41

1

Chrome 4也產生錯誤(INVALID_STATE_ERR:DOM例外11)。如果您打開Chrome Javascript控制檯,就會看到該錯誤。

Firefox 3.6也引發了一個錯誤,但似乎默默丟棄它(它在錯誤控制檯中不可見)。如果你換行功能的try..catch塊,你會看到錯誤消息(組件返回故障代碼:0x80040111(NS_ERROR_NOT_AVAILABLE)):

pageRequest.onreadystatechange = function() { 
    try { 
    alert('pageRequest.readyState: ' + pageRequest.readyState 
      + '\npageRequest.status: ' + pageRequest.status); 
    } 
    catch (e) { 
    alert(e); 
    } 
} 

前兩次onreadystatechange在Internet Explorer中調用,readyState爲1(開)。在這種狀態下,請求正在發送,但尚未收到響應。調用中的status屬性時會出現此錯誤,因爲沒有HTTP響應來讀取狀態。

此行爲與舊版本的W3C XMLHttpRequest specification的,其狀態兼容:

如果status屬性不 可用時,它必須拋出一個異常。 當readyState 爲3(接收)或4(加載)時它必須可用。當可用 時,它必須表示HTTP 狀態碼(對於 成功連接,通常爲200)。如果這個屬性被訪問時 readyState的有不適當的值上檢索

拋出:DOMException INVALID_STATE_ERR

異常應該得到提升。

規範的Newer versions,然而,狀態status必須返回一個值:

status屬性必須返回運行這些步驟的 結果:

  1. 如果狀態是UNSENT或OPENED返回0並終止這些步驟。
  2. 如果錯誤標誌爲真,則返回0並終止這些步驟。
  3. 返回HTTP狀態碼。
+0

好的,我有點忘了Chrome中的錯誤控制檯,它也彈出修改頭文件的錯誤,所以我只是忽略了控制檯,我的錯誤 – 2010-03-16 04:07:44

0

我認爲你有一個字符串連接問題,評估PageRequest.status(這是一個整數)時。試試這個:

status = pageRequest.status; 
status += ''; 
alert('pageRequest.readyState: ' + pageRequest.readyState \ 
+ '\npageRequest.status: ' + status); 
+0

If不,像readyState一樣執行 – Sergi 2010-03-15 23:26:10

+1

這與字符串連接無關,string + integer的結果是將integer轉換爲一個字符串,然後將其連接起來,而且,對於連續行,Javascript不需要轉義。第三行末尾的反斜槓只會導致語法錯誤(無效字符)。 – 2010-03-15 23:42:52