15

我一直在寻找很多 JavaScript 答案,但我还没有找到一个真正解决我的问题的答案。我要做的是加载图像,获取像素数据,执行分析,然后加载另一个图像以重复该过程。

我的问题是我无法预加载所有图像,因为该脚本必须能够处理大量图像,并且预加载可能会占用大量资源。因此,我每次都尝试通过循环加载新图像,但我遇到了图像加载和将其绘制到画布上下文的脚本之间的竞争条件。至少我很确定这是正在发生的事情,因为脚本可以很好地处理预缓存的图像(例如,如果我在之前加载页面后刷新)。

正如您将看到的,有几行代码被注释掉了,因为我对 JavaScript 非常陌生,而且它们没有按照我想象的方式工作,但是如果我以后需要这些功能,我不想忘记它们.

这是我认为引起问题的代码片段:

编辑:所以我在遵循建议后让我的功能正常工作

 function myFunction(imageURLarray) {
  var canvas = document.getElementById('imagecanvas');
  console.log("Canvas Grabbed");

  if (!canvas || !canvas.getContext) {
    return;
  }

  var context = canvas.getContext('2d');

  if (!context || !context.putImageData) {
    return;
  }

  window.loadedImageCount = 0;
  loadImages(context, canvas.width, canvas.height, imageURLarray, 0);
}

function loadImages(context, width, height, imageURLarray, currentIndex) {
  if (imageURLarray.length == 0 || imageURLarray.length == currentIndex) {
    return false;
  }
  if (typeof currentIndex == 'undefined') {
    currentIndex = 0;
  }

  var currentimage = new Image();
  currentimage.src = imageURLarray[currentIndex];

  var tempindex = currentIndex;
  currentimage.onload = function(e) {

    // Function code here

    window.loadedImageCount++;

    if (loadedImageCount == imageURLarray.length) {

      // Function that happens after all images are loaded here
    }
  }
  currentIndex++;
  loadImages(context, width, height, imageURLarray, currentIndex);
  return;
}
4

3 回答 3

14

也许这会有所帮助:

currentimage.onload = function(e){
    // code, run after image load
}

如果需要等待图像加载,以下代码将加载下一张图像(currentIndex 是您的“img”变量):

var loadImages = function(imageURLarray, currentIndex){
    if (imageURLarray.length == 0 || imageURLarray.length == currentIndex) return false;
    if (typeof currentIndex == 'undefined'){
       currentIndex = 0;
    }
    // your top code
    currentimage.onload = function(e){
        // code, run after image load
        loadImages(imageURLArray, currentIndex++);
    }
}

代替“for”循环,例如使用这个函数:

loadImages(imageURLarray);
于 2013-06-04T14:04:27.620 回答
0

也许试试这个:

http://jsfiddle.net/jnt9f/

在设置 img src 之前设置 onload 处理程序将确保即使图像被缓存也会触发 onload 事件

var $imgs = $(),i=0;
for (var img = 0; img < imageURLarray.length; img++) {
   $imgs = $imgs.add('<img/>');
}

var fctn = (function fctn(i){
    $imgs.eq(i).on('load',function(){
        //do some stuff
        //...
        fctn(++i);
    }).attr('src',imageURLarray[i]);    
})(0);
于 2013-06-04T14:14:22.320 回答
0

实际上......很多开发人员都指向这里来检测图像在 jQuery 事件之后何时完成加载......

https://github.com/desandro/imagesloaded

如果您可以确定事件何时触发您的图像加载(例如,在图像开始加载之前将 Id 或类添加到页面上),那么您应该能够将其与 github 上的此插件混合。

祝你好运!

于 2013-06-04T14:14:54.833 回答