javascript - 使用 img.src 将 img.onload 链接到 Image() 对象

标签 javascript jquery html css image

我有一个函数能够通过 foreach(item) 迭代读取“图像链接”数组。在每次迭代中,我都试图:在 Image() 中加载图像对象,并在 onload 事件中获取属性( naturalWidthnaturalHeight )并将其作为 <DIV> 的背景粘贴到 DOM 中.

但是img.onload是异步的,在 onload 事件粘贴之前,所有迭代都将通过。

如何在每次迭代中创建连续的 img.onload 链和 img.src 的更改?

function singleGrid() {
  galdiv1.className = galClassList;

  function imgFill() {
    arr.forEach(function(item) {
      img = new Image();
      img.onload = function() {
        var nHeight = this.naturalHeight;
        var nWidth = this.naturalWidth;
        var res = nWidth / nHeight;
        console.log("image source: " + arr[i] + ", naturalWidth: " + nWidth + "px, naturalHeight: " + nHeight + "px");
        blockres = width * res;
        var div = divCreate(blockres);
        galdiv1.append(div);
      };
      img.src = item;##
      Heading##
    }, this);
  }
  imgFill();
}

最佳答案

var imageURLS = [];
var imageTags = [];

// Runs once when all images are loaded
function onAllImagesLoaded() {

}

// Individual image loaded Successfully
function onImageLoad() {
    this.hasLoaded = true;

    for (var i = 0; i < imageTags.length; ++i) {
        if (!imageTags[i].hasLoaded) {
            return; // Exit the function if any image hasn't loaded yet
        }
    }

    onAllImagesLoaded();
}

// Individual image failed to load
function onImageError() {
    console.warn("Error: image " + this.id + " could not be retrieved");
    this.hasLoaded = true;

    for (var i = 0; i < imageTags.length; ++i) {
        if (!imageTags[i].hasLoaded) {
            return;
        }
    }

    onAllImagesLoaded();
}

function loadImages() {
    var newImageTag = null;

    for (var i = 0; i < imageURLS.length; ++i) {
        newImageTag = new Image();
        newImageTag.id = i; // Give each Image a unique identifier (Helps to find ones that don't load properly if you have any problems)
        newImageTag.hasLoaded = false; // Add new 'hasLoaded' flag
        newImageTag.onload = onImageLoad; // Set event handlers, It's better to use an existing function instead of an inlined one
        newImageTag.onerror = onImageError; // This is because an inlined function will create a closure when called
        newImageTag.src = imageURLS[i]; // This starts the async loading
        imageTags.push(newImageTag);
    }
}

关于javascript - 使用 img.src 将 img.onload 链接到 Image() 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47389600/

相关文章:

JavaScript 在输入焦点时运行函数

javascript - 如何将innerHTML与JavaScript if/else语句和Bootstrap 4下拉菜单一起使用

javascript - JQuery Coin slider 不显示图像

javascript - 将内容插入 html - maxmind geoip2

javascript - 你能在使用 html5 的同时公开地将 javascript 与 html 混合吗?

javascript - $routeChangeError 未在 $q.reject 上调用

javascript - 获取最右边的输入:checked of every tr using a single jQuery(Sizzle) selector

javascript - 如何以完美的网格样式将不同大小的 DIV float 到左侧?

javascript - Jquery - 选择复选框时按钮未启用

javascript - 网络离线应用程序可以访问本地文件吗?