2

我有一个检测图像大小的函数,我希望它返回一个包含宽度和高度的对象。在下面的代码中,函数中的sz.width 和 sz.height保存了值,但是在它们返回值之后它是未定义的。我错过了什么?

     function getImgSize(imgSrc) {
        var newImg = new Image();

        newImg.onload = function() {
          var height = newImg.height;
          var width = newImg.width;

          function s() {}
          sz = new s();
          sz.width = width;
          sz.height = height;
          $('#infunc').text("in function, w = "+sz.width+", h = "+sz.height);
          return sz;
        }
        newImg.src = imgSrc; // this must be done AFTER setting onload
      }

var sz = getImgSize("http://lorempixel.com/output/fashion-q-c-1920-1920-4.jpg");
$('#outfunc').text("outside function, w = "+sz.width+", h = "+sz.height);

jsfiddle:http: //jsfiddle.net/forgetcolor/LbxA3/

4

2 回答 2

3

该函数getImgSize设置图像加载,然后终止。稍后,当图像加载时,匿名 onload 函数被调用并正确计算大小,然后将其返回给一个不关心的 DOM 引擎......

你可能想知道如何你想做的事。简短的回答:你不能。这是您可以获得的最接近的:

  function getImgSize(imgSrc, callback) {
    var newImg = new Image();

    newImg.onload = function() {
      ... // blah-blah blah
      callback(sz);
    }
    newImg.src = imgSrc;
  }
  getImgSize("http://lorempixel.com/output/fashion-q-c-1920-1920-4.jpg",
            function(sz) {
              $('#outfunc').text("in callback, w = "+sz.width+
                                 ", h = "+sz.height);
            });

其实我是来写的:

// 这必须在设置 onload 之后完成

这就是我敢打赌你的问题所在。// 这必须在设置 onload 之后完成

于 2012-05-22T01:51:09.693 回答
2

这是不可能的。您正在尝试获取异步调用的返回值。

考虑:

var i = 0;
setTimeout(function() { i = 1; }, 1000); //1 second later
alert(i);

这将发出警报0,因为该值仅在一秒钟内更改,而不是立即更改。

不相信我?

你试图做的是同样的事情。您不能使用尚未发生的值。为了完成你想要做的事情,你需要使用回调。

于 2012-05-22T01:51:01.110 回答