2012-01-06 5 views
0

画像URLを含むJSONを返すAJAX呼び出しがあります。私は彼らのためにDOMに画像を追加したいと思いますが、同じ画像を何度も何度も繰り返していくつもりです。私は帯域幅のコストを上げたくありません。ブラウザはデフォルトでこれらの画像をキャッシュしません.JQueryでimg要素を作成して追加すると、ブラウザはそのたびにその画像を要求します。JQuery append()で画像を追加する際の画像の再読み込みを防止する

は、だから私はそうのような隠されたdiv要素の形でキャッシュを追加しました:

<div id="imageCache" style="display: none;"></div> 

およびそれらにimageKeyがある可能性があります、サーバーから返されるオブジェクトJSONをループするときにはJQueryでこれをやった:

if (post.imageKey) { 
    var cachedImage = $("#imageCache ." + post.imageKey); 

    if (cachedImage.length) { 
     var newImage = $(cachedImage).clone(); 
     $("#" + post.key).append(newImage); 
    } 
    else {     
     var newImage = $("<img src='/image?key=" + post.imageKey + "' alt='" + post.title + "' class='offeredPost " + post.imageKey + "'/>"); 
     $("#" + post.key).append(newImage); 

     cachedImage = $(newImage).clone(); 
     $("#imageCache").append(cachedImage); 
    } 
} 

しかし、喜びはありません。クローンされたイメージはDOMに追加されますが、JSがページを完了するとすぐにブラウザ(Chrome)がイメージの新しいリクエストを行います。

アイデア?ありがとう。

+0

SRCでクエリ文字列を使用しているため、おそらくブラウザに画像がキャッシュされていません。代わりにそれらの画像に静的URLを使用できますか? – Blazemonger

+0

@ mblase75これはクエリーストリングが変更された場合のみです。これは、URLの最後に乱数を追加して毎回リロードを強制する古いトリックのようなものです。それは数が違うためにのみ機能します。 – Archer

+0

@Archerありがとう、私は覚えていました - 私はOPの 'post.imageKey'がいつも変わっていないことを確認するのに十分な情報がありませんでした。私は彼が考慮するためにそこにそれを投げたいと思った。 – Blazemonger

答えて

2

divの幅と高さを画像の幅と高さに設定し、backgroundプロパティを使用して画像url( 'myImage.jpg')を読み込みます。 divがピクチャよりも大きい場合はno-repeatを使用してください。

+1

+1また、バックグラウンドを常にコンテナの中央に保つためには、 'background-position:center center;'を使うのも良い方法です。 –

+0

ありがとうございます。これはうまくいくように見えますが、読み込む前に画像の暗い部分を知る必要があります。これはややこしいことです。サーバーサイドを追加してAJAXレスポンスに渡してみてください。 – Eliot

+0

はそれに対する単純な解決策は考えられませんが、画像を変更するたびにdivのサイズを動的に設定することができます。 ajax呼び出しを使用してイメージのサイズを取得します(php GDライブラリにはgetimagesize()があります)http://www.php.net/manual/en/function.getimagesize.php) –