2013-01-24 28 views
6

Tôi có trình xử lý tệp ashx tạo hình ảnh của mình.Hình ảnh được tạo động được yêu cầu hai lần khi sử dụng tải chậm jquery trong Google Chrome

<img src="www.mywebsite.com/action/getimage.ashx?imageID=f8be4bf6&width=100&height=700&bgcolor=999" /> 

Tất cả đều hoạt động tốt.

Bây giờ, tôi muốn sử dụng tải chậm. Sử dụng này jquery lazy loading plugin

Vì vậy, tôi điều chỉnh hình ảnh html của tôi như thế này:

<img src="imageplaceholder.gif" original-data="www.mywebsite.com/action/getimage.ashx?imageID=f8be4bf6&width=100&height=700&bgcolor=999" /> 

Và thêm đoạn mã sau:

$(function() { 
    $("img").lazyload(); 
}); 

tôi nhận thấy trong tab mạng của google công cụ chrome devoloper rằng có hai cuộc gọi đến trình xử lý tệp này.

Tôi đã tạo một fiddle thử nghiệm tại đây: link Nếu bạn cuộn xuống trên fiddle này, bạn sẽ thấy hai yêu cầu hình ảnh khi hình ảnh được tải trong Google Chrome. Trong Firefox và IE, thao tác này chỉ hoạt động với một cuộc gọi.

Có cách nào để tránh hành vi này không?

UPDATE:

Các tiêu đề sau đây được đặt trong file handler:

[0] "Server" "Microsoft-IIS/7.5" 
[1] "Set-Cookie" "lang=nl; expires=Tue, 04-Feb-2014 13:08:56 GMT; path=/" 

Và Hết hạn tài sản của đối tượng Response là:

context.Response.Expires = 0 
+0

thể bạn cũng đăng các nội dung của 'ProcessRequest' của trình xử lý hình ảnh? Lý do là vì hành vi chỉ xảy ra nếu 'data-original' sử dụng trình xử lý hình ảnh (' www.mywebsite.com/action/getimage.ashx? ImageID = f8be4bf6 & width = 100 & height = 700 & bgcolor = 999') nhưng khi hình ảnh tĩnh như 'http: // www.appelsiini.net/attachments/jquery.png' thì chỉ có một cuộc gọi. –

+0

Tôi cũng nhận thấy điều đó. Hình ảnh tĩnh hoạt động tốt. Trình xử lý tệp được sử dụng trong ví dụ fiddle không phải là trình xử lý tệp được sử dụng trong sollution của riêng tôi. Tôi đã thử các trình xử lý tệp khác nhau mà tôi tìm thấy trên web để xem sự cố không phải là mã của tôi hay không. Cho đến nay, tất cả họ đều có cùng một vấn đề. Vì vậy, tôi không nghĩ rằng vấn đề sẽ được với bộ xử lý hình ảnh chính nó. – ThdK

Trả lời

7

Tôi tin rằng vấn đề gốc là Chrome không lưu vào bộ nhớ cache hình ảnh.Trong số demo này, Chrome sẽ đưa ra yêu cầu mới mỗi khi bạn nhấp vào nút.

Kịch bản tải chậm kích hoạt 2 yêu cầu vì trước tiên (trước) tải hình ảnh vào phần tử img riêng, sau đó gán URL hình ảnh cho phần tử img gốc.

Tôi đề nghị thêm một Expires hoặc Cache-Control tiêu đề, và một Last-Modified hoặc ETag tiêu đề, để phản hồi từ xử lý hình ảnh của bạn để Chrome sẽ bộ nhớ cache hình ảnh. (Để biết thêm về bộ nhớ đệm, xem Caching Tutorial for Web Authors and Webmasters.)


Cập nhật: Tôi đề nghị bổ sung thêm một cái gì đó như thế này để xử lý hình ảnh của bạn (từ MSDN):

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetValidUntilExpires(true); 
+0

Nếu nó (trước) tải hình ảnh sau đó sẽ không đánh bại mục đích của (lười biếng) tải? –

+0

Tải 'trước' chỉ xảy ra khi hình ảnh thực sự hiển thị. Tôi không biết làm thế nào các plugin tải lười biếng thực sự hoạt động, nhưng tôi có thể nói rằng cả hai cuộc gọi đầu tiên và cuộc gọi thứ hai được thực hiện khi hình ảnh trở thành bên trong khung nhìn. Tôi đã cập nhật câu hỏi của mình với tiêu đề bộ nhớ đệm hiện tại của phản hồi trong trình xử lý hình ảnh của tôi. – ThdK

+0

@ThdK Trên thực tế, nhận xét của bạn làm nổi bật câu trả lời của tôi rằng Chrome xử lý '$ (" img "). Attr (" src "," ")' khác nhau. Nếu bạn nhìn vào mã của plugin, 'dòng 110' và' dòng 115' là những nơi duy nhất mà giá trị của thuộc tính 'src' được đặt thành url của trình xử lý hình ảnh. Trong các thử nghiệm của tôi, khi các dòng này được thực hiện, một yêu cầu được kích hoạt cho hình ảnh. Điểm khác biệt duy nhất là trước 'dòng 110',' 'bị ẩn. –

3

Dường như tay cầm của Google Chrome $("img").attr("src", "") khác với các trình duyệt khác.

Nhìn vào mã nguồn của plugin on GitHub, và thêm một điểm break trong Chrome (đi từng bước), các cuộc gọi đến xử lý hình ảnh xảy ra khi nó đổi src thuộc tính của hình ảnh với giá trị của original-data.

Trong khi nó có thể là bộ xử lý hình ảnh là vấn đề (như tôi nhận xét trước đó), các giải pháp mà tôi thấy được sự thay đổi line 115 of the plugin's source từ

.attr("src", $self.data(settings.data_attribute)); 

để

.attr("src", "data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="); 

giá trị mới là một chuỗi được mã hóa base64 cho hình ảnh GIF trong suốt 1px x 1px.

Trong thử nghiệm của bạn fiddle, tìm thấy trong phiên bản rút gọn sự xuất hiện lần thứ 2 của

c.data(h.data_attribute) 

và thay đổi nó để

"data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" 

Nó vẫn sẽ gọi hai lần nhưng các cuộc gọi đầu tiên sẽ là không đáng kể (0KB ?) và các trình duyệt khác không bị ảnh hưởng bởi thay đổi này.

+0

Tại sao câu trả lời này bị giảm giá? Tôi đã thực hiện thay đổi của bạn trong plugin và sau đó tôi thấy thực sự cuộc gọi thứ hai được thực hiện chỉ cho 1x1px. Tôi sẽ thảo luận về tùy chọn này với người khác ở đây để xem đó có phải là điều chúng ta có thể làm hay không. Tôi không phải là một chuyên gia jquery vì vậy tôi không thể thực sự tìm ra lý do tại sao dòng mã thực sự làm và nếu nó 100% an toàn để thay đổi nó. Vì vậy, nếu có ai trong các bạn có ý kiến ​​khác về điều này. Làm ơn cho tôi biết! Cảm ơn rất nhiều vì đã dành thời gian cho việc này! – ThdK

+0

Tôi cũng bối rối vì sao Chrome cư xử như thế này cho plugin này nhưng dòng suy nghĩ của tôi là chúng tôi không thể thay đổi hành vi của trình duyệt và chúng tôi không thể thay đổi trình xử lý hình ảnh vì vậy chúng tôi chỉ còn lại plugin . Tôi cũng không phải là chuyên gia jQuery vì vậy nếu bạn nhận được câu trả lời cuối cùng cho hành vi này, hãy đăng nó ở đây. :) –

+0

Đối với các downvote, tôi không có ý tưởng tại sao. Tôi nghĩ đây là giải pháp tốt nhất để tránh yêu cầu cùng một hình ảnh hai lần trong Chrome, trừ khi bạn muốn thay đổi plugin trình tải chậm của mình (đừng hỏi tôi thay thế gì - tôi không sử dụng bất kỳ plugin nào). –

Các vấn đề liên quan