2011-05-29 14 views
0
$(document).ready(function(){ 
    $("#submit").click(function() { 

     var startDate = $("#startdate").val(); 
     var endDate = $("#enddate").val(); 
     var selected = $("#selected").val(); 

     $.ajax({ 
      type: "POST", 
      url: "/json/chart", 
      data: { 
       selected:selected, 
       startDate:startDate, 
       endDate:endDate 
      }, 
      success: function(data) { 

       $("#pkgLineDiv").empty().html("");     

       $.each(data, function(index) {       
        $('#pkgLineDiv').prepend('<img id="'+ index+'" src="/public/images/ajax-loader.gif" /><br />'); 
        $('#'+index).attr('src', 'chart/'+ data[index].pkgLineId +'/'+ data[index].wrapSpecId +'/'+ data[index].startDate +'/'+ data[index].endDate);     
       });       
      } 

     }); 
     return false;   
    }); 
}); 

這是我的代碼。我正在做一個ajax提交併獲取一些json數據。然後我將這些數據傳遞給圖表網址。此圖表網址是一個在後端生成圖片的功能。問題是這可能是一個漫長的過程。一個簡單的ajax加載圖像不起作用,因爲ajax調用很快(獲得一個快速的json數組)。在ajax調用之後會發生什麼,需要一段時間。我想要做的是獲得一張圖像來顯示圖像的位置。我不能擁有佔位符,因爲我不知道要創建多少圖像。jQuery追加gif,而ajax調用不適用於Chrome,Firefox。在IE中工作(儘管沒有動畫)

此代碼將在IE 8中工作。動畫不會播放,但至少圖像顯示最終圖像的位置。在Chrome和Firefox(我的主要測試環境)中,圖像根本不會顯示。有什麼我在這裏失蹤?謝謝。

編輯

 $("#pkgLineDiv").empty().html(""); //Empty all contents of the div to push new chart images  
       $.blockUI(); 
       $.each(data, function(index) {  

        var chartUrl = 'chart/'+ data[index].pkgLineId +'/'+ data[index].wrapSpecId +'/'+ data[index].startDate +'/'+ data[index].endDate; //Build chart URL 
        $('#pkgLineDiv').prepend(''+ data[index].description +'<div><img id="'+ index +'" src="/public/images/ajax-loader4.gif" /></div'); 


        $.get(chartUrl, function() {       
         $('#'+index).attr('src', chartUrl); 

         if (index == data.length - 1) { 
          $.unblockUI(); 
         }      
        });  
       }); 

回答

1

我以前沒做過這個,所以我不能肯定地說,但也許嘗試最初設置的IMG索馬里紅新月會向loader.gif然後進行AJAX請求每個圖表'+'數據...(即圖表圖像),然後成功將src設置爲圖表圖像。如果圖表圖像的標題指示客戶端可以緩存該URL,那麼我相信它應該按照您想要的方式工作。

我相信問題是不同的瀏覽器如何處理img src的更改。如果在知道圖像已由服務器呈現並由客戶端緩存之前,您不更改src,則應該很好。

事情是這樣的:

$(document).ready(function(){ 

    $("#submit").click(function() { 

     var startDate = $("#startdate").val(); 
     var endDate = $("#enddate").val(); 
     var selected = $("#selected").val(); 

     $.ajax({ 
      type: "POST", 
      url: "/json/chart", 
      data: { 
       selected:selected, 
       startDate:startDate, 
       endDate:endDate 
      }, 
      success: function(data) { 

       $("#pkgLineDiv").empty().html("");     

       $.each(data, function(index) {       
        $('#pkgLineDiv').prepend('<img id="'+ index+'" src="/public/images/ajax-loader.gif" /><br />'); 

        var chartUrl = 'chart/'+ data[index].pkgLineId +'/'+ data[index].wrapSpecId +'/'+ data[index].startDate +'/'+ data[index].endDate; 

        $.get(chartUrl, function(data){ $('#'+index).attr('src', chartUrl); }); // get 


       }); // each       
      } // success 

     }); // ajax 
     return false;   
    }); // click 
}); // ready 
+0

對圖表的URL進行ajax請求,成功時將圖像的src設置爲圖表的URL。瀏覽器應該已經將圖像緩存到本地,您可以通過將正確的HTTP標頭添加到生成圖表的頁面來確保它。例如,如果對「chart?a = 10&b = 5」的調用總是生成相同的圖表,則應該已經確保圖像在客戶端上緩存了一段時間,因此請充分利用該圖表。 – mikey 2011-05-30 13:20:10

+0

非常感謝。這完美地解決了圖像問題。我一直在嘗試在圖表加載時阻止頁面上的交互。你對此沒有任何想法。如果我在$ .get的開始和結尾放置阻塞,它不起作用。它會阻止並立即取消阻止。我猜想沒什麼大不了的。就是想。謝謝。 – 2011-05-30 15:46:57

+0

Drew,嗯 - 在$ .each ...行之前開始阻塞。然後你需要記住ajax調用是異步的,所以它們被髮送到服務器,然後當響應從服務器返回時,「函數(數據)」部分在「回調」中執行。只有在所有$ .get *調用都有「回叫」後,纔想停止阻止。所以在回調中,請在那裏進行檢查,如果他們全部完成加載並回叫,然後解除封鎖。有很多方法可以實現它我會把它留給你。 – mikey 2011-05-30 23:37:32

0

也許嘗試類似的BlockUI插件從http://jquery.malsup.com/block/

您可以手動設置在屏幕的封鎖和解鎖。

+0

與此相關的問題是Ajax請求很短。這是一個簡單的JSON請求。我把這個JSON數據,然後建立圖表的URL。當我將這些數據傳遞給URL時,圖表會在後臺生成。我不知道這會花多長時間,所以我不能使用這樣的事情。除非有人可以指示我如何使用ajax請求獲取圖像,然後將其放到屏幕上。 – 2011-05-30 12:54:40

+0

您應該在Ajax調用上使用async:false選項,以便在清除屏幕之前等待直到調用完成。 – 2011-05-31 00:47:20

+0

那麼有兩個ajax調用。一個是獲取JSON數據的主要調用。那個很快。第二個是對圖表的ajax調用。這是最長的一個。我必須將其更改爲常規調用,因爲我認爲您不能將簡寫ajax方法的async設置爲false。 無論哪種方式,我可以讓blockui在需要禁用時禁用。圖表上的異步:false ajax調用只會凍結頁面。如果可以,我想要顯示阻塞的用戶界面。 – 2011-05-31 12:17:03

相關問題