簡體   English   中英

javascript在chrome中表現怪異

[英]javascript acting weird in chrome

var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
alert(check);

在Firefox中,它只彈出true,而在chrome中,它分別彈出兩次false和true。 ???

非常感謝

“ onreadystatechange”回調可能被調用一次,也可能被稱為無數次(實際上是zillion )。 無論“檢查”的值如何,都會發生“警報”調用。

該代碼必須執行多次,否則沒有警報的單個調用將導致三個對話框的彈出而沒有該調用的上下文,這是無法回答的。 如果將alert(check)更改為alert(“ hello world”)會發生什么情況,那么在chrome中它仍然會發生三次,在fire fox中會發生一次,如果您知道三元表達式沒有問題並且問題在於調用任何東西該代碼被包裝,而不是表達式本身有任何錯誤。 瀏覽器處理和分派事件的方式各不相同,因此可能是因為在某些事件處理程序中,chrome和firefox多次分派了該事件,規范的不同解釋導致這些類型的瀏覽器行為之間存在差異(原因一進入並堅持使用Flex,至少瀏覽器兼容性問題是在單個實體(Adobe)上,這種方式導致有人責備並提交錯誤報告)。

為什么這會令人驚訝? 我假設您處於Ajax回調中,不同的瀏覽器在執行HTTP提取時會經歷不同的階段。 Chrome會在“就緒”之前知道中間狀態,並會在可能對事實有所幫助的情況下調用回調。 Firefox僅在數據准備好后才發現請求。 與JavaScript 本身無關,在[XHR][1]的實現中只有很小的差異。

正確的代碼將是:

var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
if (check) {
   alert("Page done loading and is OK");
}
function check(){
        var check=httpReq.readyState==4&&httpReq.status==200?true:false;
        alert(check);
}

this.connect=function(frm){
        if (isFirefox() && firefoxVersion() >= 3) {
            httpReq.onload = check;
        } else {
            httpReq.onreadystatechange = check;
        }
       httpReq.open('GET',url(frm),false);
       httpReq.send(null);
}}

好的,我會更詳細地解釋這一點。

發出請求后,readyState經歷5個階段:

  • 0)未初始化
  • 1)連接已打開
  • 2)發送請求
  • 3)收到回應
  • 4)數據傳輸完成

數據傳輸完成后,狀態屬性會根據服務器響應代碼進行更改。 通常,成功傳輸的代碼為200。如果發生內部服務器錯誤,則此代碼將更改,但您仍將接收數據或至少可以發送數據。

因此,為了防止警報觸發多次,您需要測試狀態,然后測試響應代碼:

if (httpReq.readyState == 4) {  // data is received, now we play with it
    if (httpReq.status == 200) {
        // process data
        alert('Data received!');
    } else {
        // handle server-side error
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM