2012-01-27 54 views
4

我正在構建一個Javascript的燈箱,我試圖在圖像加載後調整大小。我使用下面的代碼,它工作正常 - 它輸出一次加載正確的寬度。當緩存時,圖像寬度跟蹤零,隨着onload

我的問題:

當我刷新,它會立即從緩存加載圖像,似乎繞過負載。我得到一個寬度爲零的瞬間。爲什麼會發生?

我的代碼:

var oImage = new Image(); 

oImage.src = 'http://mydomain.com/image.png'; 

container.html(oImage); 

oImage.onload = function(){ 

    alert(this.width); 
} 

** 更新* *

@Alex:這是我和你的插件嘗試過的代碼,我想我可能做錯事。因爲你的插件看起來相當不錯,所以我很樂意讓它工作。

container.waitForImages(function() { 

    var cWidth = $(this).width(); 

    alert("width: "+cWidth); // returns 0 - works first time but not cached 

}); 

// Adding the image to the container for preload 

container.html('<img src="mygraphic.png" />'); 
+1

您可以查看[my plugin](https:// github。)的代碼。com/alexanderdickson/waitForImages)看看我如何處理這個。 – alex 2012-01-27 05:15:47

+0

@alex,感謝您分享您的插件!如果您也可以將解決方案總結爲答案,那將是非常好的。如果不是,希望別人能夠儘快,因爲這對我來說也是一個巨大的問題。 – dkamins 2012-01-27 05:18:28

+0

您是否嘗試過在將其插入到HTML中之前設置onload處理程序? – 2012-01-27 05:18:57

回答

3

您可能要切換.html().onload()電話。

如果圖像是從緩存中加載,比我想象的.html()呼叫完成前的腳本有機會到函數處理程序附加到圖像的onload事件。因此,有效地繞過負載事件本身(因爲圖像有已經加載)。

如果它仍在下載圖像(即未緩存),則在圖像完全渲染完成之前,將有足夠多的時間調用.onload附加。

當您處理它時,您可能想要這樣做jQuery方式,只是爲了使事件更加類似於DOM2而不是DOM0。

var image = $('<img/>', { 
    src : 'http://mydomain.com/image.png' 
}).load(function() { 
    alert(this.width); 
}) 
// maybe clear container before if you want 
.appendTo(container); 

如果我們將不得不設置srconload後,我們不妨做這個:

var image = $('<img/>') 
    .load(function() { 
     alert(this.width); 
    }) 
    .attr('src','http://mydomain.com/image.png') 
    .appendTo(container) 
    ; 

希望的作品乾淨。

+0

感謝您的建議。我一直在嘗試你的例子,但只要我實際追加元素到頁面,寬度是無法追蹤的。敲開append給我的數字,但我只是無法將其添加到頁面:/ – JCraine 2012-01-27 06:47:32

+0

我發現我可以通過將append命令放入實際負載中來使其工作。這會在稍後造成問題嗎?還有可能跟蹤除「圖像」之外的其他內容,例如,它將Flash加載到該圖像中? – JCraine 2012-01-27 07:14:56

+0

Arg,在IE7中不起作用。我討厭這 – JCraine 2012-01-27 08:39:46

4

你需要做一些事情......

  • 檢查img元素的complete屬性前設置onload
  • 在設置src屬性之前,附加load事件。

另外,我發現創建一個新的Image和分配src存在以確定是否圖像已加載或不是最好的方式。

+0

我檢查出你的JS插件,它似乎工作,但在圖像加載到容器後 - 我嘗試跟蹤容器的寬度,它仍然返回零,即使容器已經拉伸以適應新的尺寸。 – JCraine 2012-01-27 09:21:54

+0

嗨,亞歷克斯,我已經使用您的插件更新了我的初始職位代碼。如果你有時間,歡呼就檢查一下。 – JCraine 2012-01-27 09:44:13

+0

@JCraine如果您可以設置問題的http://jsfiddle.net,我很樂意提供幫助。 – alex 2012-01-27 10:22:44

相關問題