带返回的image.onload函数

Por*_*oru 11 javascript image javascript-events

我有一个JS函数,其中一个值被计算,这个值应该返回,但我每次都得到,undefined但如果我console.log()在这个函数中的结果,它的工作原理.你能帮忙吗?

function detect(URL) {
    var image = new Image();
    image.src = URL;
    image.onload = function() {
        var result = [{ x: 45, y: 56 }]; // An example result
        return result; // Doesn't work
    }
}

alert(detect('image.png'));
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 24

返回值,但不返回detect函数.

如果对load事件处理程序使用命名函数而不是匿名函数,则更清楚地发生了什么:

function handleLoad() {
  var result = [{ x: 45, y: 56 }];
  return result;
}

function detect(URL) {
  var image = new Image();
  image.src = URL;
  image.onload = handleLoad;
}
Run Code Online (Sandbox Code Playgroud)

该值从handleLoad函数返回到调用事件处理程序的代码,但该detect函数在此之前已经退出.函数中根本没有任何return声明detect,所以你不能指望结果是什么undefined.

处理这种异步方案的一种常用方法是使用回调函数:

function detect(URL, callback) {
  var image = new Image();
  image.src = URL;
  image.onload = function() {
    var result = [{ x: 45, y: 56 }];
    callback(result);
  };
}
Run Code Online (Sandbox Code Playgroud)

detect可以使用回调调用该函数,该函数将在值可用时调用:

detect('image.png', function(result){
  alert(result);
});
Run Code Online (Sandbox Code Playgroud)


Nic*_*tti 5

这是因为函数检测不返回任何东西,因为加载事件发生在函数完成之后。而且您忘记将图像附加到某些内容中,因此它永远不会加载。

你可以这样做:

function detect(URL) {
    var image = new Image();
    image.src = URL;
    image.onload = function() {
        var result = 'result'; // An example result
        alert(result); // Doesn't work
    }
    document.body.appendChild(image)
}

detect('http://www.roseindia.net/javascript/appendChild-1.gif');
Run Code Online (Sandbox Code Playgroud)

在这里小提琴http://jsfiddle.net/LVRuQ/


Por*_*oru 5

我自己得到:

我不知道我可以在加载时为其分配一个变量(对我来说已经分配了)。

function detect(URL) {
    var image = new Image();
    image.src = URL;
    var x = image.onload = function() {
        var result = [{ x: 45, y: 56 }]; // An example result
        return result;
    }();
    return x;
}

alert(detect('x'));
Run Code Online (Sandbox Code Playgroud)

  • 这没有多大意义。您执行该函数,然后将结果设置为 `image.onload`。所以`image.onload` 将是一个数组,而它应该是一个函数。然后,您还将该数组设置为 `x` 并返回它。你确实从 `detect(...)` 中取回了数组,但是 `onload` 的整个概念都丢失了。 (6认同)
  • 正如上面的评论,这个 onload 函数没有按应有的方式工作。您只需手动执行该函数,这意味着您不需要“image.onload”。`image.onload` 值是一个函数,因此当 dom image 从其源加载图像时它将自动执行。 (2认同)