2013-05-21 111 views
2

我意識到這是一個常見的問題,由新手javascript程序員問我。 Console.log(img)和console.log(「onload」之前)執行正確,但我從來沒有看到圖像加載消息。爲什麼圖像onload不起作用

AssetManager.loadImages = function(urls) { 
    var images = []; 
    var urlCount = urls.length; 
    for (var i=0; i<urlCount; i++) { 
     var img = new Image(); 
     images.push(img); 
    } 
    var urlsLoaded = 0; 
    for (var i=0; i<urlCount; i++) { 
     (function(img) { 
     console.log(img); 
     console.log("before onload"); 
     img.onload = function(e) { 
      console.log("Image Loaded!"); 
      urlsLoaded++; 
      if (urlsLoaded >= urlCount) { 
       AssetManager.callback(images); 
      } 
     } 
     })(images[i]);    
     images[i].src = urls[i]; 
    } 
} 
+2

這可能是一個很明顯的問題,但你確定圖像存在嗎?嘗試添加'img.onerror = function(){console.log(「Image failed!」);};' –

+0

哪個瀏覽器發生這種情況? – Spudley

+3

我的猜測是,這是因爲圖像已經加載並正在從瀏覽器緩存中獲取。我想我以前見過這個。 – Spudley

回答

1

嘗試var img = document.createElement("img");

AssetManager.loadImages = function(urls) { 
    var images = new Array(); 
    var urlCount = urls.length; 
    var urlsLoaded = 0; 
    var leImg; 
    for (var i=0; i<urlCount; i++) { 
     leImg = document.createElement("img"); 
     leImg.onload = function(e){ 
      urlsLoaded++; 
      if (urlsLoaded >= urlCount) { 
       // AssetManager.callback(images); --> this is balls, still 
      } 
     } 
     leImg.src = urls[i]; 
     _images.push(leImg); 
    } 

} 

(未測試,醉)

+4

「醉」的豎起大拇指 –

0

我不知道確切的問題是你的代碼是什麼,但這裏的一些代碼我寫了一段時間回來處理相同的問題(小提琴:http://jsfiddle.net/LJRSL/)那裏有一些額外的東西,可能不需要:)

$.preloadImg = function (url, callback, to_len) { //to_length = image fetch timeout in ms 
    var img = new Image(), 
     $img = $(img), 
     st = new Date().getTime(), 
     to; 

    if (callback && $.isFunction(callback)) { 

     to = window.setTimeout(function() { 
      callback.call(this, url, true); 
     }, to_len || 5000); 

    } 


    $img 
     .on('load', function() { 
      to = window.clearTimeout(to); 

      if ($.isFunction(callback)) 
       callback.call(this, url, false); 
     }) 
     .attr('src', url) 
     ; 
    /*this is probably unnecessary*/ 
    if (img.complete) { 
     $img.off('load'); 
     if ($.isFunction(callback)) { 
      to = window.clearTimeout(to); 

      callback.call(this, url); 
     } 
    } 
}; 

$.preloadImg('https://www.google.com/images/srpr/logo4w.png', function(img) { $('#test').attr('src', img); alert('done'); }); 

和好措施裝載多個:

$.preloadImgs = function (urls, callback, to_len) { 
    var i = 0, c = 0; 
    for (; i < urls.length; i++) { 
     c++; 
     $.preloadImg(urls[i], function (url, timedout) { 
      if (--c === 0 && i >= urls.length - 1) 
       callback.call(this, urls); 
     }, to_len); 
    } 
}; 

你可以嘗試通過addEventListener結合您的活動,而不是onload =

+3

原始問題jQuery在哪裏? – epascarello

+1

不在哪裏。很高興你花時間做出貢獻;) –

+0

這可能是一個明顯的問題,但你確定圖像存在?嘗試添加img.onerror = function(){console。日誌(「Image failed!」);}; – user2267395

0

「img.onload」功能時,在嵌套函數調用不起作用確切

您需要在「$()。ready(function(){}」或「window.onload = function(){}」中顯式調用「img.onload」函數「

e.g

$().ready (function(){ 

var img = new Image(); 
img.src = 'image.png'; 
img.onload = function() 
{ 
    console.log("loaded"); 
} 
} 
3

對於任何人誰犯同樣的錯誤是我 - 確保onload事件是所有小寫,而不是駱駝情況:的onLoad。

這好:

img.onload = function() { }; 

這不好:

img.onLoad = function() { }; 
相關問題