2013-01-24 10 views
6

Ho un gestore di file ashx che genera le mie immagini.L'immagine generata dinamicamente è richiesta due volte quando si utilizza il caricamento lento di jquery in Google Chrome

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

Tutto funziona correttamente.

Ora, voglio utilizzare il caricamento lazy. L'utilizzo di questo jquery lazy loading plugin

Così ho regolato le mie immagini html come questo:

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

e ha aggiunto il seguente script:

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

ho notato nella scheda di rete di Google Strumenti di cromo devoloper che ci sono due chiamate fatte a questo filehandler.

Ho creato un violino di prova qui: link Se scorri verso il basso su questo violino vedrai due richieste di immagine quando l'immagine viene caricata in Google Chrome. In Firefox e IE funziona con una sola chiamata.

C'è un modo per evitare questo comportamento?

UPDATE:

le seguenti intestazioni sono impostati nel gestore di file:

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

E la Scade proprietà dell'oggetto Response è:

context.Response.Expires = 0 
+0

Potete anche inviare i contenuti di 'ProcessRequest' del gestore immagini? Il motivo è dovuto al fatto che il comportamento si verifica solo se 'data-original' utilizza il gestore di immagini (' www.mywebsite.com/action/getimage.ashx? ImageID = f8be4bf6 & width = 100 & height = 700 & bgcolor = 999') ma quando è un immagine statica come 'http: // www.appelsiini.net/attachments/jquery.png' quindi c'è una sola chiamata. –

+0

L'ho notato anche io. Le immagini statiche funzionano bene. Il gestore di file usato nell'esempio fiddle non è il gestore di file usato nella mia sollution. Ho provato diversi gestori di file che ho trovato sul web per vedere se il problema non era il mio codice. Finora, avevano tutti lo stesso problema. Quindi non penso che il problema sarà con il gestore di immagini stesso. – ThdK

risposta

7

Credo che il problema di root sia che Chrome non sta memorizzando l'immagine nella cache.In questo demo, Chrome invierà una nuova richiesta ogni volta che si fa clic sul pulsante.

Lo script di caricamento lazy fa scattare 2 richieste perché prima (pre) carica l'immagine in un elemento privato img, quindi assegna l'URL dell'immagine all'elemento img originale.

ti suggerisco di aggiungere un header Expires o Cache-Control, e un colpo di testa Last-Modified o ETag, per la risposta dal vostro gestore di immagine in modo che Chrome memorizza nella cache l'immagine. (Per maggiori informazioni sulla memorizzazione nella cache, vedere la Caching Tutorial for Web Authors and Webmasters.)


Aggiornamento: Suggerisco di aggiungere qualcosa di simile al gestore di immagini (da MSDN):

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

Se (pre) carica l'immagine, allora non sarebbe questo a vanificare lo scopo del caricamento (pigro)? –

+0

Il caricamento "pre" si verifica solo quando l'immagine è effettivamente visibile. Non so come funzionano i plugin di caricamento pigro, ma posso dire che sia la prima chiamata sia la seconda chiamata vengono effettuate quando l'immagine si trova all'interno del viewport. Ho aggiornato la mia domanda con le intestazioni di cache corrente della risposta nel mio gestore di immagini. – ThdK

+0

@ThdK In realtà il tuo commento evidenzia la mia risposta che Chrome gestisce '$ (" img "). Attr (" src "," ")' diversamente. Se si guarda nel codice del plugin, 'line 110' e' line 115' sono gli unici posti in cui il valore dell'attributo 'src' è impostato sull'URL del gestore di immagini. Nei miei test, quando vengono eseguite queste righe, viene scattata una richiesta per l'immagine. L'unica differenza è che prima di 'line 110',' ' viene nascosto. –

3

Sembra che le maniglie di Google Chrome $("img").attr("src", "") in modo diverso rispetto ad altri browser.

Guardando il codice sorgente del plugin on GitHub, e l'aggiunta di un punto di rottura in Chrome (andando passo dopo passo), le chiamate al gestore immagine si verifica quando si modifica l'attributo src dell'immagine al valore della original-data.

Mentre è possibile che il gestore immagine è il problema (come ho commentato prima), la soluzione che ho trovato è stato quello di cambiare line 115 of the plugin's source da

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

a

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

il nuovo valore è una stringa codificata in base 64 per un'immagine GIF trasparente da 1px per 1px.

nel test fiddle, trovare in versione minified il 2 ° verificarsi di

c.data(h.data_attribute) 

e modificarlo in

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

Sarà ancora chiamare due volte, ma la prima chiamata sarà trascurabile (0KB ?) e altri browser non sono interessati da questa modifica.

+0

Perché questa risposta è stata downvoted? Ho apportato le modifiche al plug-in e quindi vedo effettivamente che la seconda chiamata viene effettuata solo per 1x1px. Discuterò questa opzione con qualcun altro qui per vedere se è qualcosa che possiamo fare. Non sono un esperto di jquery quindi non posso davvero scoprire perché questa linea di codice fa davvero e se è sicuro al 100% di cambiarlo. Quindi se qualcuno di voi ha altre opinioni su questo. Per favore mi faccia sapere! Grazie mille già per aver passato il tuo tempo su questo! – ThdK

+0

Sono anche sconcertato dal motivo per cui Chrome si comporta in questo modo per questo plug-in, ma la mia linea di pensiero era che non possiamo cambiare il comportamento del browser e non possiamo cambiare il gestore di immagini in modo che restiamo solo con il plugin . Non sono un esperto di jQuery e quindi se ottieni una risposta definitiva a questo comportamento, per favore pubblica anche qui. :) –

+0

Per quanto riguarda il downvote, non ho idea del perché. Penso che questa sia la soluzione migliore per evitare di richiedere due volte la stessa immagine in Chrome, a meno che tu non voglia cambiare il plug-in del caricatore pigro (non chiedermi quale sostituzione - non ne uso). –