javascript – 函数中的jQuery变量范围

前端之家收集整理的这篇文章主要介绍了javascript – 函数中的jQuery变量范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个jQuery的问题.

我想获得img的真实宽度/高度.
现在我用这个函数得到它:

var imageSize = function(image) {
    var realImageSize = { };

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

        alert(realImageSize['height']); // Valid height
    });

    alert(realImageSize['height']); // Undefined

    return realImageSize;
}

所以我在内存中复制图像,然后在.load方法获取并设置图像的实际大小.

现在,问题是var realImageSize变量由于某种原因在此范围内不可用.谁能告诉我为什么?

解决方法

这不是范围问题,它很好,但是同步问题:你在执行加载回调之前读取值.

您作为加载参数提供的回调不会立即执行,而是仅在加载图像后执行.

通常的解决方案是不返回值但提供回调:

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

fetchImageSize(myImage,function(realImageSize){
    alert(realImageSize['height']); // NOT Undefined
});

请注意,在设置onload回调后应始终设置src.某些浏览器(如果您在缓存中有图像)如果在设置源后设置它,则可能不会调用onload回调.

猜你在找的jQuery相关文章