jQueryで要素(画像)を再読み込み/更新する方法


262

jQueryを使用してサーバーから同じファイル名の画像を再読み込みすることは可能ですか?

たとえば、ページに画像がありますが、物理的な画像はユーザーの操作に基づいて変化する可能性があります。これはファイル名の変更を意味するのではなく、実際のファイル自体を意味することに注意してください。

つまり:

  • ユーザーがデフォルトページに画像を表示
  • ユーザーが新しい画像をアップロードします
  • ページ上のデフォルトの画像は変更されません(これはファイル名が同一であるためだと思います。ブラウザはキャッシュされたバージョンを使用します)

以下のコードが呼び出される頻度に関係なく、同じ問題が解決しません。

$("#myimg").attr("src", "/myimg.jpg");

jQueryのドキュメントでは、「ロード」関数は、コールバック関数を要素のロードの成功/完了にバインドするのではなく、イベントを発生させるデフォルトのメソッドがあれば完璧です。

どんな援助も大歓迎です。


1
@Alexis、あなたの問題は、画像がブラウザにキャッシュされ、サーバーで変更された後に更新されないことですか?
ジェイ・

1
@jeerose、ファイルが実際に変更され(同じファイル名)、ページ全体を更新するとページに反映されるため、これが問題であると思います。
Alexis Abril

回答:


551

それはあなたのブラウザが画像をキャッシュしているようです(私は今あなたがあなたの質問に書いたことに気づきました)。次のように追加の変数を渡して、ブラウザに強制的に画像をリロードさせることができます:

d = new Date();
$("#myimg").attr("src", "/myimg.jpg?"+d.getTime());

1
クエリ文字列変数を追加すると、私の心は完全に変わりました。これで問題が解決し、リクエストに応じて画像がリロードされるようになりました。
Alexis Abril、2010年

45
ギャングスタのヒント、大好きです
デイブジェリソン2013年

4
それは機能し、素晴らしい回避策ですが、それでも回避策です!キャッシュされたものを忘れるようにブラウザに伝える画像をフェッチする別の方法はありませんか?
spuas 2013

パラメータを含む静的画像のリクエストを禁止するように見える非常にうるさいウェブカメラがあります。ああ。それ以外の場合、これは優れたソリューションです。
dangowans

3
@TomasGonzalez B / c との衝突が発生する可能性があり本当に迅速randomDateない限り、衝突することはありません。; ^)クライアントで日付を取得することは、リソースを大量に消費することはなく、一度にプルする必要があるだけの画像に再利用できるので、ステップ4に進みます。利益。
ruffin

57

これはおそらく最善の方法ではありませんが、JavaScriptを使用して画像のURLにタイムスタンプを追加するだけで、過去にこの問題を解決しました。

$("#myimg").attr("src", "/myimg.jpg?timestamp=" + new Date().getTime());

次にロードするとき、タイムスタンプは現在の時刻に設定され、URLは異なるため、ブラウザはキャッシュされたバージョンを使用する代わりに画像に対してGETを実行します。


2
これは私にとって何年にもわたって機能しましたが、今日、私の画像サーバー(私が制御していない)は、ファイル名が正確でない場合、リンク切れを返し始めました。誰かが別の回避策を持っているなら、それは大いに感謝されます。残念ながら、このスレッドのすべての回答はこの回答のバリエーションです。
felwithe 16

@felwithe、このサーバーはクエリの最後で拡張子のみを探すのでしょうか?したがって、このアプローチをテストすることができます:imagename.jpg?t=1234567&q=.jpgまたはimagename.jpg#t1234567.jpg
FlameStorm 2017年

26

これは、あなたが言う2つの問題の1つかもしれません。

  1. サーバーは画像をキャッシュしています
  2. jQueryが起動しない、または少なくとも属性を更新しない

正直なところ、2つ目だと思います。さらにjQueryが表示されれば、はるかに簡単になります。ただし、最初に属性を削除してから、もう一度設定してください。それが役立つかどうかを確認するだけです:

$("#myimg").removeAttr("src").attr("src", "/myimg.jpg");

これが機能する場合でも、これは最適ではないため、いくつかのコードを投稿してください、imo :-)


@Kordonme、これは誰かが「悪い」jQueryについてコメントする場所ですか?(私は冗談を言っている、私は冗談を言っている);)
ジェイ

@Kordonme、これは実際にはイベントハンドラーに保持されており、現時点では唯一のコード行です。イベントが実際に発生していることを確認するために、この行の直前にアラートを追加しました。イベントはエラーなしで発生します。
Alexis Abril

3
パラメータを含む静的画像のリクエストを禁止するように見える非常にうるさいウェブカメラがあります。ああ。これは私のユニークなケースに最適なソリューションです。ありがとう。
dangowans 2014

これは、残りのパラメータが必要ない、または必要ない場合の最良の答えです
RafaSashi 2017

これを助けてくれてありがとう(それは私のためにそれをChromeにキャッシュしただけです)
Daniel Resch

14

画像のsrcをjavascriptにハードコーディングすることについて心配することなく、1行で(アイデアについてはjeeroseに感謝します:

$("#myimg").attr("src", $("#myimg").attr("src")+"?timestamp=" + new Date().getTime());

13
URLの末尾に文字が無限に追加されるので注意してください
Alfo

9

キャッシングをバイパスし、画像のURLに無限のタイムスタンプを追加ないようにするには、新しいタイムスタンプを追加する前に前のタイムスタンプを削除します。これが私が行った方法です。

//refresh the image every 60seconds
var xyro_refresh_timer = setInterval(xyro_refresh_function, 60000);

function xyro_refresh_function(){
//refreshes an image with a .xyro_refresh class regardless of caching
    //get the src attribute
    source = jQuery(".xyro_refresh").attr("src");
    //remove previously added timestamps
    source = source.split("?", 1);//turns "image.jpg?timestamp=1234" into "image.jpg" avoiding infinitely adding new timestamps
    //prep new src attribute by adding a timestamp
    new_source = source + "?timestamp="  + new Date().getTime();
    //alert(new_source); //you may want to alert that during developement to see if you're getting what you wanted
    //set the new src attribute
    jQuery(".xyro_refresh").attr("src", new_source);
}

6

これはうまくいきます!ただし、srcを複数回リロードすると、タイムスタンプもURLに連結されます。私はそれを処理するために受け入れられた答えを修正しました。

$('#image_reload_button').on('click', function () {
    var img = $('#your_image_selector');
    var src = img.attr('src');
    var i = src.indexOf('?dummy=');
    src = i != -1 ? src.substring(0, i) : src;

    var d = new Date();
    img.attr('src', src + '?dummy=' + d.getTime());
});

3

画像コンテナーhtmlをリセットしてみましたか?もちろん、キャッシュしているのがブラウザの場合、これは役に立ちません。

function imageUploadComplete () {
    $("#image_container").html("<img src='" + newImageUrl + "'>");
}

2

時々実際のような解決策-

$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

また、srcを適切に更新しないでください、これを試してください、それは私のために働きました->

$("#Image").attr("src", "dummy.jpg");
$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

1

区切り文字として「#」を使用すると便利な場合があります

私の画像は「www」の上の「非表示」フォルダに保存されているため、ログインしたユーザーのみが画像にアクセスできます。このため、通常は使用できません<img src=/somefolder/1023.jpg>が、サーバーにリクエストを送信し、<img src=?1023>「1023」という名前で保存された画像を返信します。

このアプリケーションは画像のトリミングに使用されるため、画像をトリミングするajaxリクエストの後、サーバー上のコンテンツとして変更されますが、元の名前は保持されます。トリミングの結果を確認するために、ajaxリクエストが完了した後、最初の画像がDOMから削除され、同じ名前で新しい画像が挿入され<img src=?1023>ます。

キャッシングを回避するために、「#」を前に付けた「time」タグをリクエストに追加し<img src=?1023#1467294764124>ます。サーバーは自動的にリクエストのハッシュ部分を除外し、「1023」として保持されている画像を送り返すことで正しく応答します。したがって、サーバー側のデコードをあまり行わずに、常に画像の最新バージョンを取得します。


1
なぜ画像を提供するためにそのすべてのトラブルを経験するのですか?無意味な煩わしさのようです
lucasreta 2017

0

画像ソースを数回再読み込みする必要があるかもしれません。私はLodashでうまくいく解決策を見つけました:

$("#myimg").attr('src', _.split($("#myimg").attr('src'), '?', 1)[0] + '?t=' + _.now());

既存のタイムスタンプは切り捨てられ、新しいタイムスタンプに置き換えられます。


-1

@kasper Taeymansの回答に基づく。

uが単にイメージをリロードする必要がある場合(srcをsmth newで置き換えるのではなく)、試してください:

$(function() {
  var img = $('#img');

  var refreshImg = function(img) {
    // the core of answer is 2 lines below
    var dummy = '?dummy=';
    img.attr('src', img.attr('src').split(dummy)[0] + dummy + (new Date()).getTime());

    // remove call on production
    updateImgVisualizer();
  };


  // for display current img url in input
  // for sandbox only!
  var updateImgVisualizer = function() {
    $('#img-url').val(img.attr('src'));
  };

  // bind img reload on btn click
  $('.img-reloader').click(function() {
    refreshImg(img);
  });

  // remove call on production
  updateImgVisualizer();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<img id="img" src="http://dummyimage.com/628x150/">


<p>
  <label>
    Current url of img:
    <input id="img-url" type="text" readonly style="width:500px">
  </label>
</p>

<p>
  <button class="img-reloader">Refresh</button>
</p>


-2

私は単にこれをhtmlで行います:

<script>
    $(document).load(function () {
        d = new Date();
        $('#<%= imgpreview.ClientID %>').attr('src','');
    });
</script>

そして、このようにコードビハインドで画像をリロードします:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        image.Src = "/image.jpg"; //url caming from database
    }

}


1
ここでは、ページの再読み込みとasp.NET WebFormsでの設定についてはあまり取り上げません。
Jonas Stensved、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.