2016-10-20 3 views
0

Ich bin völlig neu in JavaScript und JQuery, und ich habe folgendes Problem ich war durch das Lesen anderer SO Q & Wie zu lösen nicht in der Lage:JQuery: Warten auf Attribut verändertes Bild src geladen werden

Ich habe eine Funktion, die den Pfad zu einem Bild abruft (/API/currentImage) und das src Attribut eines img ändern möchte und sich dann nach 1 Sekunde wiederholt. So weit, so gut, der folgende Code funktioniert. Aber: Wenn das Bild groß ist, kann das GET für das Bild selbst ziemlich lange dauern (länger als 1 Sekunde). Also ich möchte setTimeout nicht ausführen, wenn die AJAX-Anfragen beendet sind, aber wenn das Bild endlich geladen ist ("Das Laden des Bildes nach $('img').attr("src", r1[0]) ist beendet").

loadImg = function() { 
    $.when(
    $.ajax({ 
     url: "/API/currentImage" 
    }), 
    $.ajax({ 
     url: "/API/currentId" 
    }) 
).done(function(r1, r2) { 
    $('#iid').text(r2[0]) 
    $('img').attr("src", r1[0]) 
    window.setTimeout(function() { 
     loadImg() 
    }, 1000) 
    }) 
} 

Wie kann ich das erreichen?

+1

http://stackoverflow.com/questions/3877027/jquery-callback-on-image-load-even-wenn-das-Bild-ist-cachiert – Blazemonger

+0

Mögliches Duplikat von [Überprüfen Sie, ob ein Bild geladen ist (keine Fehler) in JavaScript] (http://stackoverflow.com/questions/1977871/check-if-ein-Bild-is-loaded-no-errors-in-javascript) – Damian

Antwort

0

Ähnlich @ Fribu Antwort, ich implmented es nun die one Funktion verwenden, anstatt on der Verwendung:

$('img').one("load", function() { 
    window.setTimeout(function() { 
     loadImg() 
    }, 1000) 
}).attr("src", newSrc) 
0

Versuchen Sie folgendes:

$('img').attr("src", r1[0]).done(function(){ 
    window.setTimeout(function() { 
     loadImg() 
    }, 1000) 
}); 

ODER

$('img').load(function() { 
     window.setTimeout(function() { 
      loadImg() 
     }, 1000) 
    }); 
+0

Ich habe beides versucht (fand sie in einer anderen Antwort), aber sie funktionieren nicht. –

1
$('img').on("load",...) 

zum Trick sollte.

ZUSÄTZLICH:

<img /> 

    <div id="hi"></div> 
    <script src="https://code.jquery.com/jquery-3.1.1.js"></script> 
    <script> 

    $(document).ready(function() { 
     var i = 0; 
     var h = $("#hi"); 

     $("img")[0].onload = function() { 
     //alert("done"); 
     i++; 
     h.html(i); 
     } 


     $("img").attr("src", "http://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg?v=8c1c8cba242e") 
    }); 

    </script> 
+0

Dies feuert zu oft, und ich weiß nicht warum. Versucht es mit '$ ('img'). On (" load ", function() {alert (" done ")}) .attr (" src ", r1 [0])', wobei der Rest gleich bleibt, öffnet sich 1 MessageBox beim ersten Reload, 2 beim zweiten, 3 beim dritten .... ohhh, weil ich jedes Mal, wenn die Methode läuft, einen neuen Event-Handler anmelde ... Gib mir einen Moment: D –

+0

Okay, hab's geschafft mit diesem. +1. Ich werde jetzt sehen, ob dies auch ein Problem mit zwischengespeicherten Bildern wie in den zugehörigen Antworten hat. –

+0

@MarkusWeninger Ich habe ein Beispiel hinzugefügt, irgendwie wird es mehrmals mit on ("load") aufgerufen, aber mit nativen Onload-Ereignis funktioniert es gut. –