2013-01-24 7 views
6

Ich habe einen Ashx-Dateihandler, der meine Bilder generiert.Dynamisch erzeugtes Bild wird zweimal angefordert, wenn jQuery in Google Chrome geladen wird

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

Das alles funktioniert gut.

Jetzt möchte ich Lazy Loading verwenden. Mit diesem jquery lazy loading plugin

So ich so meine HTML-Bilder eingestellt:

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

und hinzugefügt, um das folgende Skript:

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

ich in der Registerkarte Netzwerk von Google Chrome devoloper Tools bemerkt, dass es zwei Aufrufe an diesen Dateihandler.

Ich habe hier eine Testgeige erstellt: link Wenn Sie auf dieser Geige nach unten scrollen, werden zwei Bildanforderungen angezeigt, wenn das Bild in Google Chrome geladen wird. In Firefox und IE funktioniert dies mit nur einem Anruf.

Gibt es eine Möglichkeit, dieses Verhalten zu vermeiden?

UPDATE:

Die folgenden Header in der Datei-Handler festgelegt sind:

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

Und die Verfällt Eigenschaft des Response-Objekts ist:

context.Response.Expires = 0 
+0

Können Sie nach auch den Inhalt der 'ProcessRequest' des Image-Handlers? Der Grund dafür ist, dass das Verhalten nur auftritt, wenn das 'data-original' den Image-Handler verwendet (' www.mywebsite.com/action/getimage.ashx? ImageID = f8be4bf6 & width = 100 & height = 700 & bgcolor = 999'), aber wenn es a Statisches Bild wie 'http: // www.appelsiini.net/anhangs/jquery.png' dann gibt es nur einen Anruf. –

+0

Das habe ich auch bemerkt. Statische Bilder funktionieren einwandfrei. Der Dateihandler, der in der Beispielgeige verwendet wird, ist nicht der Dateihandler, der in meiner eigenen Lösung verwendet wird. Ich habe verschiedene Datei-Handler ausprobiert, die ich im Internet gefunden habe, um zu sehen, ob das Problem nicht mein Code ist. Bis jetzt hatten sie alle das gleiche Problem. Ich denke also nicht, dass das Problem mit dem Image-Handler selbst besteht. – ThdK

Antwort

7

Ich glaube, das Root-Problem besteht darin, dass Chrome das Bild nicht zwischenspeichert.In dieser demo stellt Chrome jedes Mal eine neue Anfrage aus, wenn Sie auf die Schaltfläche klicken.

Das Lazy Load-Skript löst 2 Anfragen aus, da es zuerst (vor) das Bild in ein privates img-Element lädt und dann die Bild-URL dem ursprünglichen img-Element zuweist.

Ich schlage vor, das Hinzufügen eines Expires oder Cache-Control-Header und ein Last-Modified oder ETag Header, auf die Antwort von Ihrem Bild-Handler so, dass Chrome wird das Bild zwischenzuspeichern. (Weitere Informationen über Caching finden Sie im Caching Tutorial for Web Authors and Webmasters.)


Update: ich das Hinzufügen empfehlen, so etwas zu Ihrem Bild-Handler (von MSDN):

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

Wenn es (vor) das Bild lädt, würde das nicht den Zweck des (faulen) Ladens besiegen? –

+0

Die 'Pre'-Last tritt nur auf, wenn das Bild tatsächlich sichtbar ist. Ich weiß nicht, wie die Lazy-Load-Plugins wirklich funktionieren, aber ich kann sagen, dass sowohl der erste Aufruf als auch der zweite Aufruf erfolgt, wenn das Bild in das Ansichtsfenster gelangt. Ich habe meine Frage mit einem der aktuellen Caching-Header der Antwort in meinem Bild-Handler aktualisiert. – ThdK

+0

@ThdK Tatsächlich hebt Ihr Kommentar meine Antwort hervor, dass Chrome '$ (" img ") .attr (" src "," ")' anders behandelt. Wenn Sie in den Code des Plugins schauen, sind 'line 110' und' line 115' die einzigen Stellen, an denen der Attributwert 'src' auf die URL des Image-Handlers gesetzt ist. Wenn diese Zeilen in meinen Tests ausgeführt werden, wird eine Anforderung für das Bild ausgelöst. Der einzige Unterschied ist, dass vor 'Zeile 110' die' ' ausgeblendet wird. –

3

Es scheint, dass Google Chrome Griffe $("img").attr("src", "") anders als andere Browser.

Mit Blick auf den Quellcode des Plugins on GitHub, und das Hinzufügen einer Bruchstelle in Chrome (Schritt für Schritt zu gehen), die Anrufe an die Bild Handler tritt auf, wenn es das Attribut des Bildes auf den Wert von original-datasrc modifiziert.

Während es möglich ist, dass der Bild-Handler ist das Problem (wie ich kommentierte vor), die Lösung, die ich gefunden line 115 of the plugin's source von

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

zu

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

den neuen Wert zu ändern ist eine Base64-codierte Zeichenfolge für ein 1px by 1px transparentes GIF-Bild.

In Ihrem Test fiddle, finden in der verkleinerten Version der 2. Auftreten von

c.data(h.data_attribute) 

und ändern Sie es in

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

Es wird noch zweimal anrufen, aber der erste Anruf vernachlässigbar (0kb ?) und andere Browser sind von dieser Änderung nicht betroffen.

+0

Warum wurde diese Antwort abgelehnt? Ich habe deine Änderung im Plugin vorgenommen und dann sehe ich zwar den zweiten Anruf nur für das 1x1px gemacht. Ich werde diese Option mit jemand anderem besprechen, um zu sehen, ob wir etwas tun können. Ich bin kein JQuery-Experte, deshalb kann ich nicht wirklich herausfinden, warum diese Codezeile wirklich funktioniert und ob es 100% sicher ist, sie zu ändern. Also, wenn jemand von euch eine andere Meinung dazu hat. Lass es mich wissen, bitte! Vielen Dank, dass Sie Ihre Zeit hier verbracht haben! – ThdK

+0

Ich bin auch verblüfft, warum Chrome sich so für dieses Plugin verhält, aber mein Denkansatz war, dass wir das Verhalten des Browsers nicht ändern können und wir den Image-Handler nicht ändern können, so dass wir nur mit dem Plugin übrig bleiben . Ich bin auch kein jQuery-Experte, also wenn du eine schlüssige Antwort für dieses Verhalten bekommst, poste es bitte hier auch. :) –

+0

Wie für den Downvote habe ich keine Ahnung warum. Ich denke, dies ist die beste Lösung, um zu vermeiden, dass Sie in Chrome das gleiche Bild zweimal anfordern, es sei denn, Sie möchten Ihr Lazy-Loader-Plugin ändern (fragen Sie mich nicht, welchen Ersatz ich verwenden möchte). –