2015-10-14 76 views
0

下面是我的java腳本,用於在啓動ajax時加載圖像。.show()在ajaxstart()中不工作

<script type="text/javascript"> 
     jQuery(function(){ 
      $(document).ajaxStop(function() { 
       $("#ajax_loader").hide(); 
       //alert("end"); 
       console.log(new Date().getTime()); 
      }); 
      $(document).ajaxStart(function() { 
       $("#ajax_loader").show(); 
       //alert("start"); 
       console.log(new Date().getTime()); 
      }); 
     }); 
    </script> 

以下是我隱藏/顯示的內容。

<div id='ajax_loader' 
      style="position: fixed; left: 50%; top: 40%; color: red; font-size: 3em; display : none; zIndex : 1;"> 
      processing..... 
     </div> 

問題是,當任何AJAX稱爲ajaxStart()方法被執行,但它沒有顯示了「#ajax_loader」的內容。

該請求還需要2到3秒才能響應。

但是,如果我們在ajasStart()方法內取消註釋警報,那麼它將啓用「#ajax_loader」內容。

任何請幫我在這個問題上?

+1

是阿賈克斯同步?同步ajax會阻止調用堆棧清除,直到ajax完成,這也會阻止瀏覽器渲染任何內容,包括加載指示符。 –

+0

是的。它是同步的。 – Pavan

+0

放一些寬度;顯示和邊框顏色,以檢查它是否顯示或不顯示 – brk

回答

2

如果不以異步方式執行ajax,就不可能有加載指示符和同步ajax。

這是因爲瀏覽器呈現器被放入回調隊列中,並且只有在callstack爲空時纔會處理回調隊列。同步ajax可防止調用堆棧清空,直到ajax完成,因此無法在頁面上完成之前在頁面上呈現任何內容。

一種解決方法是將ajax請求包裝在setTimeout中,從而允許在發送ajax請求之前清除callstack和渲染器。但是,這不會與ajaxStart一起工作,因爲直到...你猜對了,ajax纔會啓動。這可能也會打破任何要求您將其作爲同步請求的情況。

唯一真正的解決方案是不使用同步ajax並重構將這個瘋狂要求強加給你的代碼。

async: true 
0

這就像你寫的那樣運行得很好。當然,這假定AJAX操作是有效的。您可能需要在瀏覽器中打開開發人員面板並觀看流量。

//your part 
    jQuery(function() { 

     $(document).ajaxStop(function() { 
      $("#ajax_loader").hide(); 
      //alert("end"); 
      console.log(new Date().getTime()); 
     }); 
     $(document).ajaxStart(function() { 
      $("#ajax_loader").show(); 
      //alert("start"); 
      console.log(new Date().getTime()); 
     }); 
    }); 

    //my part 
    jQuery(function() { 
     $("#thebutton").click(function() { 

      $.ajax({ 
       crossDomain: true, 
       url: "/", 
       success: function(e) { 
        var piece = $("<div></div>"); 
        piece.html(e); 
        $("#log").append(piece); 
       }, 
       error: function(e) { 
        //alert(e) 
       } 
      }) 
     }); 
    }) 

https://jsfiddle.net/8uhxh9uv/