JQuery ile görüntüleri eşzamansız olarak yükleyin


142

JQuery kullanarak sayfamdaki dış görüntüleri zaman uyumsuz olarak yüklemek istiyorum ve aşağıdakileri denedim:

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

   },
   error: function(r,x) {

   }
});

Ama her zaman hata döndürür, böyle bir görüntüyü yüklemek bile mümkün mü?

.loadYöntemi kullanmaya çalıştım ve işe yarıyor, ancak görüntü mevcut değilse zaman aşımını nasıl ayarlayabileceğime dair hiçbir fikrim yok (404). Bunu nasıl yapabilirim?


Bu benim için çalışıyor: stackoverflow.com/questions/6150289/…
MrRhoads

Yanıtlar:


199

Ajax'a gerek yok. Yeni bir resim öğesi oluşturabilir, kaynak niteliğini ayarlayabilir ve yüklemeyi bitirdikten sonra belgenin herhangi bir yerine yerleştirebilirsiniz:

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);
        }
    });

20
zaman aşımı ve 404 ile ne yapmalı?
Arief

1
bununla zaman aşımı nasıl ayarlanır? Bu yöntemi denedim ama bir şekilde sayfa hala görüntünün yüklenmesini bekliyor.
Arief

7
Tarayıcınızın zaman çizelgesini (örneğin, Google Chrome'un geliştirici araçları zaman çizelgesini) kontrol ederseniz, herhangi bir DOM öğesi oluşturmanın (DOM'a ekleyip eklememenizin görünüşte alakasız olduğunu) ve ardından kaynağını ayarlamanın geçerli belgenin yüküne eklediğini göreceksiniz. list - böylece oluşturulan öğe yüklenene kadar sayfa "yükleme" işlemini bitirmeyecektir. Çözümünüz aslında, resim yüklenene kadar, muhtemelen belirli paintveya layoutişlemleri erteleyene ve herhangi bir onloadolay bağımlılığını kesinlikle erteleyene kadar window.load () işlevinin tetiklenmeyeceği zaman uyumsuz bir olay değildir .
Tom Auger

2
@TomAuger: Peki bunu nasıl gerçekten eşzamansız hale getirebiliriz? Sadece load () ile kodu test ettim ve eşzamansız değil.
basZero

2
@gidzior IE8'de jquery kullanarak SRC özniteliğini ayarlayamadığınız için IE8'de çalışmaz. buraya bakın: stackoverflow.com/questions/12107487/…
Zengin

78

AJAX KULLANMAK GEREKİRSE ...

Yükleme işleyicilerinin doğru seçim olmadığı kullanımlarla karşılaştım. Benim durumumda javascript ile yazdırırken. Yani bunun için AJAX stilini kullanmak için aslında iki seçenek var:

Çözüm 1

Base64 görüntü verilerini ve bir REST görüntü hizmetini kullanın. Kendi web hizmetiniz varsa, Base64 kodlamasında resim sunan bir JSP / PHP REST betiği ekleyebilirsiniz. Şimdi bu nasıl faydalı? Görüntü kodlaması için yeni ve güzel bir sözdizimi ile karşılaştım:

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

Böylece Ajax kullanarak Image Base64 verilerini yükleyebilir ve ardından tamamlandığında görüntüye Base64 veri dizesini oluşturabilirsiniz! Çok eğlenceli :). Bu siteyi görüntü kodlaması için http://www.freeformatter.com/base64-encoder.html kullanmanızı tavsiye ederim .

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

Solution2:

Önbelleği kullanmak için tarayıcıyı kandırın. Bu, kaynak tarayıcı önbelleğinde olduğunda size güzel bir fadeIn () sağlar:

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

Ancak, her iki yöntemin dezavantajları vardır: Birincisi sadece modern tarayıcılarda çalışır. İkincisi performans hataları ve önbelleğin nasıl kullanılacağı varsayımına dayanır.

alkış, irade


1
Tarayıcı desteği mevcut durumu size (kabul edilebilir ise caniuse.com/#search=Blob ), kullanabilirsiniz Blobs yerine veri URI'lerini. Bu, base64 ile kodlanmış veri URI'lerini kullanmaktan daha az hileli hissettirir ve aynı zamanda bellekte daha az boşa harcar (base64 bellek tasarruflu bir format olmadığından), ancak ikincisi muhtemelen gerçek dünyada çoğu zaman önemli değildir.
Mark Amery

11

JQuery kullanarak "src" özniteliğini "data-src" olarak değiştirebilirsiniz. Görüntü yüklenmeyecek. Ancak konum etiketi ile birlikte saklanır . Hangisini seviyorum.

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

Basit bir jQuery parçası, data-src dosyasını src'ye kopyalar; bu, gerektiğinde görüntüyü yüklemeye başlar. Benim durumumda sayfanın yüklenmesi bittiğinde.

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

Eminim jQuery kodu kısaltılmış olabilir, ama bu şekilde anlaşılabilir.


4
İpucu: data-etiketleri kullanıyorsanız, bunlara erişmek $(element).data('src')yerine onlara erişmek biraz daha kolaydır$(element).attr('data-src')
Maxim Kumpan

Aslında bugün jQuery kullanmayacağım. Ama bu kişisel zevk meselesi ve inşa ettiğiniz web sitesinin ölçeğine bağlı. Ama zamanın en sıcak konusu "İlerici Görüntüler" dir, belki de bakılması gereken bir şeydir. smashingmagazine.com/2018/02/…
htho

8
$(<img />).attr('src','http://somedomain.com/image.jpg');

Ajax daha iyi olmalı çünkü onun bir galeri ve bir resim listesi üzerinden döngü, görüntü zaten önbellek varsa, sunucuya başka bir istek göndermeyeceğim. JQuery / ajax durumunda talep eder ve bir HTTP 304 (Değiştirilmedi) döndürür ve sonra zaten varsa önbellekten orijinal görüntüyü kullanır. Yukarıdaki yöntem, galerideki ilk görüntü döngüsünden sonra sunucuya boş bir isteği azaltır.


4

ASYNC yüklemesi için Ertelenmiş nesneler kullanabilirsiniz.

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);
});

Lütfen dikkat: önbellek sorunlarını önlemek için image.onload image.src'den önce olmalıdır.


3

Yalnızca görüntünün kaynağını ayarlamak istiyorsanız bunu kullanabilirsiniz.

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

3

Bu da işe yarıyor ..

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

2

AFAIK, burada .ajax () 'a gösterildiği gibi bir .load () işlevi yapmanız gerekir, ancak canlı tutmak için jQuery setTimeout kullanabilirsiniz (ish)

<script>
 $(document).ready(function() {
 $.ajaxSetup({
    cache: false
});
 $("#placeholder").load("PATH TO IMAGE");
   var refreshId = setInterval(function() {
      $("#placeholder").load("PATH TO IMAGE");
   }, 500);
});
</script>

2
üzgünüm
Q'unuzu

2

resminizi yüklemek için .load komutunu kullanın. bir hata alıp almadığınızı test etmek için (diyelim ki 404) aşağıdakileri yapabilirsiniz:

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

careful - .error () olayı, resim için src niteliği boş olduğunda tetiklenmez.


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">');
    }
});

Mükemmel çalışıyor, ana sayfayı yüklerken farklı görüntüler ayarlayabiliriz - Polaris'ten
MadhaviLatha Bathini

Soruyu cevaplamakla ilgisi olmayan çok fazla dağınıklık.
Maxim Kumpan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.