Muat secara sinkron gambar dengan jQuery

142

Saya ingin memuat gambar eksternal pada halaman saya secara tidak sinkron menggunakan jQuery dan saya telah mencoba yang berikut ini:

$.ajax({ 
   url: "http://somedomain.com/image.jpg", 
   timeout:5000,
   success: function() {

   },
   error: function(r,x) {

   }
});

Tetapi selalu mengembalikan kesalahan, apakah mungkin memuat gambar seperti ini?

Saya mencoba menggunakan .loadmetode dan berfungsi tetapi saya tidak tahu bagaimana saya dapat mengatur batas waktu jika gambar tidak tersedia (404). Bagaimana saya bisa melakukan ini?

Arief
sumber
Ini berfungsi untuk saya: stackoverflow.com/questions/6150289/…
MrRhoads

Jawaban:

199

Tidak perlu untuk ajax. Anda dapat membuat elemen gambar baru, mengatur atribut sumbernya dan menempatkannya di suatu tempat di dokumen setelah selesai memuat:

var img = $("<img />").attr('src', 'http://somedomain.com/image.jpg')
    .on('load', function() {
        if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
            alert('broken image!');
        } else {
            $("#something").append(img);
        }
    });
karim79
sumber
20
apa yang harus dilakukan dengan batas waktu dan 404?
Arief
1
cara mengatur batas waktu dengan ini? Saya mencoba metode ini tetapi entah bagaimana halaman tersebut masih menunggu gambar untuk dimuat.
Arief
7
Jika Anda memeriksa timeline browser Anda, misalnya, timeline dev alat Chrome Google, Anda akan melihat bahwa membuat elemen DOM (apakah Anda melampirkan ke DOM tampaknya tidak relevan) dan kemudian mengatur sumbernya menambahkannya ke beban dokumen saat ini daftar - jadi halaman TIDAK akan menyelesaikan "memuat" sampai elemen yang dibuat dimuat. Solusi Anda sebenarnya bukan peristiwa asinkron dalam arti bahwa window.load () tidak akan menyala sampai gambar dimuat, mungkin menunda operasi paintatau tertentu layout, dan tentu saja menunda setiap onloaddependensi acara.
Tom Auger
2
@ TomAuger: Jadi bagaimana kita bisa membuatnya benar-benar tidak sinkron? Saya baru saja menguji kode dengan load () dan BUKAN asinkron.
basZero
2
@gidzior Tidak berfungsi di IE8 karena Anda tidak dapat mengatur atribut SRC di IE8 menggunakan jquery. lihat di sini: stackoverflow.com/questions/12107487/…
Kaya
78

JIKA ANDA SANGAT PERLU MENGGUNAKAN AJAX ...

Saya mendatangi kami di mana handler yang menangani bukan pilihan yang tepat. Dalam kasus saya saat mencetak melalui javascript. Jadi sebenarnya ada dua opsi untuk menggunakan gaya AJAX untuk ini:

Solusi 1

Gunakan data gambar Base64 dan layanan gambar REST. Jika Anda memiliki layanan web Anda sendiri, Anda bisa menambahkan skrip JSP / PHP REST yang menawarkan gambar dalam penyandian Base64. Sekarang bagaimana itu berguna? Saya menemukan sintaks baru yang keren untuk penyandian gambar:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhE..."/>

Jadi, Anda dapat memuat data Image Base64 menggunakan Ajax dan setelah selesai Anda membangun string data Base64 ke gambar! Sangat menyenangkan :). Saya merekomendasikan untuk menggunakan situs ini http://www.freeformatter.com/base64-encoder.html untuk penyandian gambar.

$.ajax({ 
    url : 'BASE64_IMAGE_REST_URL', 
    processData : false,
}).always(function(b64data){
    $("#IMAGE_ID").attr("src", "data:image/png;base64,"+b64data);
});

Solusi2:

Trik browser untuk menggunakan cache-nya. Ini memberi Anda fadeIn () yang bagus ketika sumber daya ada di cache browser:

var url = 'IMAGE_URL';
$.ajax({ 
    url : url, 
    cache: true,
    processData : false,
}).always(function(){
    $("#IMAGE_ID").attr("src", url).fadeIn();
});   

Namun, kedua metode ini memiliki kelemahan: Yang pertama hanya berfungsi di browser modern. Yang kedua memiliki gangguan kinerja dan bergantung pada asumsi bagaimana cache akan digunakan.

bersorak, akan

mschmoock
sumber
1
Jika keadaan dukungan browser saat ini dapat Anda terima ( caniuse.com/#search=Blob ), Anda dapat menggunakan Blobs sebagai ganti URI data. Ini 'terasa' kurang hacky daripada menggunakan URI data yang disandikan base64 dan juga tidak boros memori (karena base64 bukan format yang efisien memori), meskipun yang terakhir mungkin tidak masalah sebagian besar waktu di dunia nyata.
Mark Amery
11

Menggunakan jQuery, Anda cukup mengubah atribut "src" menjadi "data-src". Gambar tidak akan dimuat. Tetapi lokasi disimpan dengan tag. Yang saya suka.

<img class="loadlater" data-src="path/to/image.ext"/>

Sepotong jQuery sederhana menyalin data-src ke src, yang akan mulai memuat gambar saat Anda membutuhkannya. Dalam kasus saya ketika halaman selesai memuat.

$(document).ready(function(){
    $(".loadlater").each(function(index, element){
        $(element).attr("src", $(element).attr("data-src"));
    });
});

Saya yakin kode jQuery bisa disingkat, tetapi bisa dimengerti dengan cara ini.

htho
sumber
4
Kiat: jika Anda menggunakan data-tag, lebih mudah untuk mengaksesnya melalui tag $(element).data('src')daripada$(element).attr('data-src')
Maxim Kumpan
Sebenarnya hari ini saya tidak akan menggunakan jQuery lagi. Tapi itu pertanyaan tentang selera pribadi, dan tergantung pada skala situs web yang Anda bangun. Tapi topik hangat saat itu adalah "Gambar Progresif", mungkin itu sesuatu yang harus dicari. smashingmagazine.com/2018/02/…
htho
8
$(<img />).attr('src','http://somedomain.com/image.jpg');

Seharusnya lebih baik daripada ajax karena jika ini adalah galeri dan Anda mengulang daftar foto, jika gambar sudah dalam cache, itu tidak akan mengirim permintaan lain ke server. Ini akan meminta dalam kasus jQuery / ajax dan mengembalikan HTTP 304 (Tidak dimodifikasi) dan kemudian menggunakan gambar asli dari cache jika sudah ada di sana. Metode di atas mengurangi permintaan kosong ke server setelah loop pertama gambar di galeri.

Jaseem
sumber
4

Anda dapat menggunakan objek Ditangguhkan untuk memuat ASYNC.

function load_img_async(source) {
    return $.Deferred (function (task) {
        var image = new Image();
        image.onload = function () {task.resolve(image);}
        image.onerror = function () {task.reject();}
        image.src=source;
    }).promise();
}

$.when(load_img_async(IMAGE_URL)).done(function (image) {
    $(#id).empty().append(image);
});

Harap perhatikan: image.onload harus ada sebelum image.src untuk mencegah masalah dengan cache.

phpcoding
sumber
3

Jika Anda hanya ingin mengatur sumber gambar, Anda dapat menggunakan ini.

$("img").attr('src','http://somedomain.com/image.jpg');
slobodan
sumber
3

Ini juga berfungsi ..

var image = new Image();
image.src = 'image url';
image.onload = function(e){
  // functionalities on load
}
$("#img-container").append(image);
Basilin Joe
sumber
2

AFAIK Anda harus melakukan fungsi .load () di sini sesuai dengan .ajax (), tetapi Anda bisa menggunakan jQuery setTimeout untuk membuatnya tetap hidup (ish)

<script>
 $(document).ready(function() {
 $.ajaxSetup({
    cache: false
});
 $("#placeholder").load("PATH TO IMAGE");
   var refreshId = setInterval(function() {
      $("#placeholder").load("PATH TO IMAGE");
   }, 500);
});
</script>
benhowdle89
sumber
2
maaf saya sedikit salah paham tentang Q Anda, saya pikir Anda sedang memuat gambar yang sedang berubah atau semacamnya (karenanya ajax bit)
benhowdle89
2

gunakan .load untuk memuat gambar Anda. untuk menguji jika Anda mendapatkan kesalahan (misalkan 404) Anda dapat melakukan hal berikut:

$("#img_id").error(function(){
  //$(this).hide();
  //alert("img not loaded");
  //some action you whant here
});

cermat - .error () acara tidak akan memicu ketika atribut src kosong untuk gambar.

Poelinca Dorin
sumber
0

$ (function () {

    if ($('#hdnFromGLMS')[0].value == 'MB9262') {
        $('.clr').append('<img src="~/Images/CDAB_london.jpg">');
    }
    else
    {
        $('.clr').css("display", "none");
        $('#imgIreland').css("display", "block");
        $('.clrIrland').append('<img src="~/Images/Ireland-v1.jpg">');
    }
});
MadhaviLatha Bathini
sumber
Ini berfungsi dengan sempurna, saat memuat beranda kami dapat mengatur gambar yang berbeda - dari Polaris
MadhaviLatha Bathini
Terlalu banyak kekacauan, tidak ada hubungannya dengan menjawab pertanyaan.
Maxim Kumpan