フェード効果のある画像スライドショーを実装する小さなjQueryプログラムがあります。画像がレンダリングされ、次の画像を表示する必要がある場合、最初に背景に読み込まれ、次にレンダリングされます。画像をロードするコードは以下のとおりです。
var img = $('<img/>');
img.attr('src', imageUrl);
img.load(function()
{
$(photo).attr('loaded' + mediaSize, true)
.attr('width', this.width)
.attr('height', this.height);
renderPhoto(photo, mediaSize);
});
renderPhoto()で写真をレンダリングするための関連部分は次のとおりです。
$("#image" + activeContainer).css({ "background-image" : "url(" + imageUrl + ")" });
ロードされた画像を追跡し、それらを2回再読み込みしないコントロールもあります。これは、以前にロードされた画像がブラウザのキャッシュにあることを前提としています。
キャッシュ以外はすべて正常に動作しています。(上記の最新のコード行を使用して)画像がレンダリングされるたびに、画像は常にサーバーから再ロードされ、フェードイン効果が損なわれます。
サーバーから返されたヘッダーは、キャッシュに問題がないようです。
% curl -o /tmp/x -v http://stoppingdown.net/media/stillimages/20100102-0072/1280/image.jpg
* About to connect() to stoppingdown.net port 80 (#0)
* Trying 78.46.194.117... % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0connected
* Connected to stoppingdown.net (78.46.194.117) port 80 (#0)
> GET /media/stillimages/20100102-0072/1280/image.jpg HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: stoppingdown.net
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 04 Nov 2012 11:52:08 GMT
< X-NorthernWind-Version: 1.1-ALPHA-19
< Content-Type: image/jpeg
< Content-Length: 2207579
< Last-Modified: Thu, 01 Nov 2012 00:08:11 CET
< ETag: "1351724891000"
< Expires: Sun, 11 Nov 2012 12:52:08 CET
< Server: Jetty(6.1.24)
<
{ [data not shown]
Chromeでデバッグし、リソースペインを見ると、同じ画像の複数のエントリが各ラウンドで再読み込みされていることがわかります(たとえば、最初のラウンドでは20031227-0085.jpgが表示され、スライドショーが2番目のサイクルを開始すると2つ表示されます) 20031227-0085.jpg、次に3など)。間違いなく、リソースはブラウザのキャッシュにロードされていません...そしてその理由がわかりません。
ありがとう。
PS完全なコードはここから入手できます。