Cara memuat ulang / menyegarkan elemen (gambar) di jQuery


262

Apakah mungkin memuat ulang gambar dengan nama file yang identik dari server menggunakan jQuery?

Misalnya, saya memiliki gambar pada halaman, namun, gambar fisik dapat berubah berdasarkan tindakan pengguna. Catatan, ini tidak berarti nama file berubah, tetapi file yang sebenarnya itu sendiri.

yaitu:

  • Pengguna melihat gambar pada halaman default
  • Pengguna mengunggah gambar baru
  • Gambar default di halaman tidak berubah (saya menganggap ini karena nama file identik, browser menggunakan versi cache)

Terlepas dari seberapa sering kode di bawah ini dipanggil, masalah yang sama tetap ada.

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

Dalam dokumentasi jQuery, fungsi "load" akan sempurna jika memiliki metode default untuk menembakkan peristiwa yang bertentangan dengan pengikatan fungsi callback ke pemuatan elemen yang berhasil / lengkap.

Setiap bantuan sangat dihargai.


1
@Alexis, apakah masalah Anda bahwa gambar di-cache di browser dan tidak akan diperbarui setelah diubah di server?
jay

1
@jeerose, saya percaya ini adalah masalah karena file benar-benar berubah (nama file yang sama) dan tercermin pada halaman jika Anda melakukan refresh halaman penuh.
Alexis Abril

Jawaban:


551

Kedengarannya seperti itu browser Anda yang sedang meng-cache gambar (yang sekarang saya perhatikan Anda tulis di pertanyaan Anda). Anda dapat memaksa browser untuk memuat ulang gambar dengan mengirimkan variabel tambahan seperti:

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

1
Menambahkan variabel string kueri sepenuhnya terlintas di benak saya. Ini menyelesaikannya dan gambar sekarang memuat ulang berdasarkan permintaan.
Alexis Abril

45
tip gangsta, menyukainya
Dave Jellison

4
Ini bekerja, dan itu solusi yang bagus, tetapi masih ada solusi! Apakah tidak ada cara berbeda untuk mengambil gambar yang memberitahu browser untuk melupakan yang di-cache?
spuas

Saya memiliki webcam yang sangat pemilih yang tampaknya melarang permintaan gambar statis yang berisi parameter. Ugh. Sebaliknya, ini adalah solusi yang bagus.
dangowans

3
@TomasGonzalez B / c ada adalah kesempatan untuk mendapatkan tabrakan dengan random, dan tidak pernah harus dengan Datekecuali Anda benar-benar sangat cepat. ; ^) Mendapatkan kencan pada klien bukanlah sumber daya yang intensif, dan Anda dapat menggunakan kembali sebanyak mungkin gambar yang perlu Anda tarik sekaligus, jadi lanjutkan ke langkah 4. Untung.
ruffin

57

Ini mungkin bukan cara terbaik, tapi saya telah memecahkan masalah ini di masa lalu dengan hanya menambahkan stempel waktu ke URL gambar menggunakan JavaScript:

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

Lain kali ketika memuat, stempel waktu diatur ke waktu saat ini dan URL berbeda, sehingga browser melakukan GET untuk gambar alih-alih menggunakan versi cache.


2
Ini bekerja untuk saya selama bertahun-tahun, tetapi hari ini server gambar saya (tidak dikontrol oleh saya) mulai mengembalikan tautan yang rusak jika nama file tidak tepat. Jika ada yang punya solusi lain itu akan sangat dihargai. Sayangnya setiap jawaban di utas ini adalah variasi untuk yang ini.
felwithe

@felwithe, mungkin server ini hanya mencari ekstensi di akhir permintaan? Jadi, Anda dapat mencoba menguji pendekatan ini: imagename.jpg?t=1234567&q=.jpgatauimagename.jpg#t1234567.jpg
FlameStorm

26

Ini bisa menjadi salah satu dari dua masalah yang Anda sebutkan sendiri.

  1. Server sedang melakukan caching gambar
  2. JQuery tidak menyala atau setidaknya tidak memperbarui atribut

Sejujurnya, saya pikir ini nomor dua. Akan jauh lebih mudah jika kita bisa melihat lebih banyak jQuery. Tapi sebagai permulaan, coba hapus atributnya terlebih dahulu, lalu atur kembali. Hanya untuk melihat apakah itu membantu:

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

Bahkan jika ini berhasil, posting beberapa kode karena ini tidak optimal, imo :-)


@ Kordonme, apakah ini tempat seseorang berkomentar tentang jQuery "buruk"? (Saya bercanda, saya bercanda);)
jay

@ Kordonme, ini sebenarnya diadakan di event handler dan saat ini adalah satu-satunya baris kode. Saya telah menambahkan lansiran tepat sebelum baris ini hanya untuk memverifikasi acara benar-benar menyala. Acara menyala tanpa kesalahan.
Alexis Abril

3
Saya memiliki webcam yang sangat pemilih yang tampaknya melarang permintaan gambar statis yang berisi parameter. Ugh. Ini adalah solusi yang bagus untuk kasus unik saya. Terima kasih.
dangowans

Ini adalah jawaban terbaik jika Anda tidak ingin / memerlukan parameter sisa
RafaSashi

Terima kasih ini membantu (ini hanya menyimpannya untuk saya di Chrome)
Daniel Resch

14

dengan satu baris tanpa khawatir tentang hardcoding src gambar ke dalam javascript (terima kasih kepada jeerose untuk ide-ide:

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

13
Berhati-hatilah karena ini akan secara tak terbatas menambahkan lebih banyak karakter ke bagian akhir URL
Alfo

9

Untuk mem-bypass caching dan menghindari menambahkan cap waktu tak terbatas ke url gambar, lepaskan cap waktu sebelumnya sebelum menambahkan yang baru, beginilah cara saya melakukannya.

//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

Ini sangat bagus! namun jika Anda memuat ulang src beberapa kali, stempel waktu akan digabungkan ke url juga. Saya telah memodifikasi jawaban yang diterima untuk menghadapinya.

$('#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

Sudahkah Anda mencoba mengatur ulang wadah gambar html. Tentu saja jika browser yang melakukan caching maka ini tidak akan membantu.

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

2

Beberapa kali sebenarnya solusi seperti -

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

juga tidak menyegarkan src dengan benar, coba ini, itu berhasil untuk saya ->

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

1

Menggunakan "#" sebagai pembatas mungkin berguna

Gambar saya disimpan di folder "tersembunyi" di atas "www" sehingga hanya pengguna yang login yang diizinkan mengaksesnya. Untuk alasan ini saya tidak bisa menggunakan yang biasa <img src=/somefolder/1023.jpg>tapi saya mengirim permintaan ke server seperti<img src=?1023> dan itu merespon dengan mengirim kembali gambar yang disimpan dengan nama '1023'.

Aplikasi ini digunakan untuk memotong gambar, jadi setelah permintaan ajax untuk memotong gambar, itu diubah sebagai konten di server tetapi tetap menggunakan nama aslinya. Untuk melihat hasil pemangkasan, setelah permintaan ajax selesai, gambar pertama dihapus dari DOM dan gambar baru dimasukkan dengan nama yang sama<img src=?1023> .

Untuk menghindari menguangkan saya menambahkan ke permintaan tag "waktu" yang diawali dengan "#" sehingga menjadi seperti <img src=?1023#1467294764124>. Server secara otomatis menyaring bagian hash permintaan dan merespons dengan benar dengan mengirim kembali gambar saya disimpan sebagai '1023'. Jadi saya selalu mendapatkan versi terakhir dari gambar tanpa banyak decoding sisi server.


1
Mengapa harus melalui semua kesulitan itu untuk menyajikan gambar? Sepertinya masalah yang tidak ada gunanya
lucasreta

0

Saya mungkin harus memuat ulang sumber gambar beberapa kali. Saya menemukan solusi dengan Lodash yang berfungsi baik untuk saya:

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

Stempel waktu yang ada akan dipotong dan diganti dengan yang baru.


-1

Berdasarkan jawaban @kasper Taeymans.

Jika Anda hanya perlu memuat ulang gambar (bukan ganti src dengan smth baru), coba:

$(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

Saya cukup melakukan ini di html:

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

Dan muat ulang gambar dalam kode di belakang seperti ini:

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

}


1
Memuat ulang halaman dan pengaturan di asp.NET WebForms tidak benar-benar pada topik di sini.
Jonas Stensved
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.