2013-10-04 71 views
0

我正在做一個ajax請求,它可能需要很多時間來處理server-end。所以我想在請求過程中顯示一個加載圖像。但是加載圖像不會在Ajax請求時顯示。
Ajax在處理請求時阻塞窗口嗎?

var ref = createAjaxRequest();//Ajax req is created here... 
if(ref){ 
     showLoadingImg(); 
     ref.open('POST','x.jsp',false); 
     ref.onreadystatechange = eventStateChange; 
     ref.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
     ref.setRequestHeader("Connection", "keep-alive"); 
     ref.send(); 
    } 
    else{ alert("Your browser does not support this feature"); 
} 
function eventStateChange(){ 
if(ref.readyState==4){ 
    //processing response here...... 
    hideLoadingImg(); 
} 
} 

function showLoadingImg();{ 
/* <div id="ajaxLoading">(with background image is in page) 
    It is displayed properly when I set display:inline 
    manually through developer tools of a browser.</div> 
*/ 
    document.getElementById('ajaxLoading').style.display='inline'; 
} 
function hideLoadingImg();{ 
    document.getElementById('ajaxLoading').style.display='none'; 
} 

有什麼不對?

我試圖調試,發現:

  1. 雖然showLoadingImg()被調用之前open()方法,加載圖像只ref.readyState==2後顯示在瀏覽器中。

  2. 但不幸的是,readyState==2readyState==4之間的時間差很小,加載圖像立即隱藏。
    因此用戶無法看到加載圖像...

那麼,是什麼我懷疑是,不AJAX運行該腳本,除非它去readyState==2

+0

createAjaxRequest中發生了什麼?是否有理由在創建請求之前無法顯示圖像,然後在出現錯誤(或完成後)時將其隱藏? – mjk

回答

1

我認爲您致電open是錯誤的。 第三個參數(布爾值)指示請求是否是異步的。

這裏考慮完整的文檔:http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

ref.open('POST','x.jsp',true); 

應該解決您的問題。

Regards

+0

謝謝你..你的權利。但如果一個負載圖像必須顯示,雖然Ajax調用是同步? –

2

XMLHttpRequest塊如果您將async設置爲false就像您對第三個參數在這裏:ref.open('POST','x.jsp',false);

+0

這就是我的想法,但OP在打開之前調用了showLoadingImg,並且仍然必須等待ref.readyState == 2才能看到圖像。 –

+0

@grape_mao - 它阻止從完成的功能,所以瀏覽器運行DOM繪圖需要一段時間。 – Quentin

+0

所以在js中,一個函數可以在前一個函數完成之前開始執行?或者只是因爲這是一個DOM操作? –