2012-11-02 29 views
0

我按照我在這裏找到的解決方案將圖像加載到內存中,這很好,但由於它在回調中,因此屬性寬度和高度在其外部是未定義的。從回調中訪問屬性

var originalWidth, originalHeight; 
$("<img/>") // Make in memory copy of image to avoid css issues 
    .attr("src", $(img).attr("src")) 
    .load(function() { 
     originalWidth = this.width; // Note: $(this).width() will not 
     originalHeight = this.height; // work for in memory images. 
    }); 
console.log(originalWidth); // undefined obviously since `this` is only accessible within `load`s callback. 

我想過也許把它的對象中,如:

var originalWidth, originalHeight; 
var imgDimensions = {}; 
$("<img/>") // Make in memory copy of image to avoid css issues 
    .attr("src", $(img).attr("src")) 
    .load(function() { 
     imgDimensions.originalWidth = this.width; // Note: $(this).width() will not 
     imgDimensions.originalHeight = this.height; // work for in memory images. 
    }); 
console.log(imgDimensions['originalWidth']); // undefined also 

如何從返回負載中的那些屬性()?

+1

這並不是說它們沒有被定義在它之外 - 它們還沒有被執行。 '.load'綁定了一個隨時可能發生的事件,所以這意味着下一行代碼('console.log')不會等待它完成。它說「當圖像被加載時,運行這些代碼行......」但是,它不會像你期望的那樣阻塞你的其他代碼。無論如何,你不應該依賴'load' - http://api.jquery.com/load-event/ - 向下滾動到「使用圖片時加載事件的注意事項」 – Ian

回答

1

由於您不知道也不能控制回調何時運行,因此您無法保證該值可用於您的通話記錄。

根據您對維度所做的操作,一種解決方案可能是將一個onload事件處理程序添加到您的img標記中,以便您可以在實際加載該項目後訪問這些值。

2

console.log在加載函數觸發前執行,因此originalWidth尚未更新。

+0

沒錯。我想知道如何返回該值...我是否需要將其父項封裝在一個閉包中? –

+0

您可以在加載功能中使用它。 – Musa

+0

一旦圖像加載完成,您只能知道尺寸,因此您需要在回調中使用它們,或者如下所示,使用onload事件處理程序。 –

0

如果您在回調中調用console.log(),你應該得到一個有用的結果:

var originalWidth, originalHeight; 
var imgDimensions = {}; 
$("<img/>") // Make in memory copy of image to avoid css issues 
    .attr("src", $(img).attr("src")) 
    .load(function() { 
     imgDimensions.originalWidth = this.width; // Note: $(this).width() will not 
     imgDimensions.originalHeight = this.height; // work for in memory images. 
     console.log(imgDimensions); 
    }); 

正如其他人所解釋的那樣,​​回調得到在未來的某個不確定的時間執行。在此之前嘗試使用imgDimensions變量沒有意義。