如何让 Javascript 等待所有图像加载后再继续?

2023-12-21

我对 Javascript 相当陌生,目前正在尝试以各种尺寸和位置显示图像。这意味着我必须先加载图像,然后才能访问宽度和高度等值。 现在,这就是我面临问题的地方。

我尝试依次加载图像,确保只有在完成一张图像后才会加载另一张图像。

const a = new Image();
const b = new Image();

const images = [
    a,
    b
];
const imageLinks = [
    'a.png',
    'b.png'
];

let loaded = 0;
for (let i = 0; i < images.length; i++) {
    images[i].onload = function() {
        console.log(images[i].width);
        console.log(images[i].height);
        loaded++;
    }
    images[i].src = imageLinks[i];
}

console.log(images[0].width);
console.log(images[0].height);

显然,这不会产生正确的结果。 for循环之后的Logs仍然是0,并且在for循环内的Logs之前打印。这意味着,程序不会等待图像完成。

接下来,我尝试了这个:

let loaded = 0;
while (loaded < images.length) {
    images[loaded].onload = function() {
        console.log(images[loaded].width);
        console.log(images[loaded].height);
        loaded++;
    }
    images[loaded].src = imageLinks[loaded];
}

console.log(images[0].width);
console.log(images[0].height);

这样做的效果更糟。该页面甚至没有首先加载,它似乎永远卡在 while 循环中。这是有道理的,因为我认为每次images[loaded].src设置后,加载过程将重新开始,因此永远不会取得任何进展。

我发现的任何解决方案都包括 HTML 代码,其中图像是通过 document.querySelector() 从 HTML 加载的,但我无法使用它,或者对于我来说太复杂了,甚至无法像一个刚刚起步的人那样思考。我不需要完美的解决方案,现在我只需要可行的东西。事情不可能那么复杂,对吧?我只想加载一些图像。我真的被困在这里了。


这是另一个基于承诺的答案:

const images = [...document.querySelectorAll("div img")];

const proms=images.map(im=>new Promise(res=>
 im.onload=()=>res([im.width,im.height])
))

// list all image widths and heights _after_ the images have loaded:
Promise.all(proms).then(data=>{
  console.log("The images have loaded at last!\nHere are their dimensions (width,height):");
  console.log(data);
})

// Everything is set up here.
// Except: the images don't have their `src` attributes yet! 
// These are added now and the action will unfold:

images.forEach((im,i)=>im.src=`https://picsum.photos/id/${i+234}/200/100`);
<div><img><img></div>

上面的极简形式可能如下所示:

const images = [...document.querySelectorAll("div img")];

// list all image widths and heights _after_ the images have loaded:
Promise.all(images.map(im=>new Promise(resolve=>im.onload=resolve))).then(()=>{
  console.log("The images have loaded at last!\nHere are their dimensions (width,height):");
  console.log(images.map(im=>([im.width,im.height])));
})

// Now, trigger the action:
images.forEach((im,i)=>im.src=`https://picsum.photos/id/${i+234}/200/100`);
<div><img><img></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Javascript 等待所有图像加载后再继续? 的相关文章

  • javascript:全局变量泄漏

    每当我向 Firefox 提交插件时 我都会收到一封电子邮件 告诉我我的一些变量正在泄漏到全局范围内 一旦他们告诉我我解决了问题 但在那之前有什么方法 程序 来检查变量是否泄漏到全局范围内 Thanks Both JSLint http w
  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • 在 JavaScript 函数中加载图像

    我有获取图像像素颜色的功能 function getImage imgsrc var img img src imgsrc var imageMap new Object img load function var canvas
  • 如何在 mongodb 聚合管道中使用 Javascript 对象?

    我有一个 JS 对象norm我想在 mongo 聚合管道中使用它 如下所示 var norm 1 1 2 1 16 3 1 413 4 1 622 5 1 6 6 1 753 7 3 001 8 2 818 9 3 291 10 2 824
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • 如何将“X-Content-Type-Options: nosniff”添加到我的网络服务器的所有响应标头中

    我正在运行一个 apache 网络服务器 我想将 X Content Type Options nosniff 添加到来自我的网络服务器的所有响应标头 我怎样才能做到这一点 是否可以通过更改 apache 配置文件来实现此目的 确保 mod
  • 调用类实例方法 onclick javascript

    我有一个 javascript 文件 其中包含包含方法函数的类 我想知道如何从 onClick 事件调用类实例方法 function MyClass this instanceData Display Me this DisplayData
  • jQuery UI Datepicker 奇怪的行为

    我在使用 jqueryUI 使用简单的日期选择器时遇到了一个奇怪的问题 我只想显示两个月的日历 包括上个月和当前月份 我使用了这段代码 function picker datepicker numberOfMonths 2 showCurr
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • “require(...)”是常见的 JavaScript 模式还是库函数?

    我通常发现这是 node js 脚本 模块以及 phantomJS casperJS 等中的第一行 我很好奇 这是否是服务器端 javascript SSJS 的常见模式 类似于 include在 C C 中或import在 Java 中
  • 为什么函数声明在不同浏览器中的处理方式不同?

    虽然我在谷歌中找不到对此的引用 但我熟悉这样一个事实 在 javascript 中 全局函数声明在执行任何代码之前都会被解释 换句话说 这工作得很好 f function f 但是 我注意到 chrome 和 firefox 对全局函数声明
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 修改 Twitter 帖子上可编辑 Div 的内容

    我正在编写一个 chrome 扩展 它可以帮助用户在 Twitter 上输入内容 当在 twitter 上写推文时 twitter 会打开一个可编辑的 div 容器 当用户输入内容时 twitter 大概正在使用某些网络框架 会生成子 di
  • 非法使用break语句; javascript

    当这个变量达到一定数量时 我希望循环停止 但我不断收到错误 未捕获的语法错误 非法的中断语句 function loop if isPlaying jet1 draw drawAllEnemies requestAnimFrame loop
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • jQuery 中什么函数相当于 .SelectMany()?

    让我解释一下 我们知道 jQuery 中的映射函数充当 Select 如 LINQ 中 tr map function return this children first returns 20 tds 现在的问题是我们如何在 jQuery
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 如何获取符号名称(文字)?

    以下情况 var myVehicle brand Tesla var isMoving Symbol var currentStatus Symbol myVehicle isMoving true myVehicle currentSta

随机推荐

  • 如何通过编辑从嵌入中删除字段?

    假设我创建了一个嵌入并将其发送到一个频道 这是嵌入的 const embed new Discord RichEmbed setColor color setTitle message author tag wants to play se
  • MySQL“设置 unique_checks”、“设置foreign_key_checks”与“更改表禁用键”

    我们遇到一个问题 mysqldump 脚本花费了 90 的时间来填充它处理的一小部分表 消除 FK 和索引可以消除速度问题 但不是可接受的解决方案 转储脚本does have 40014 SET OLD UNIQUE CHECKS UNIQ
  • WH_MOUSE 的 SetWindowsHookEx

    我手中有一些代码可以全局打印鼠标的坐标 使用 WH MOUSE LL 我的目标是使用 WH MOUSE 而不是 WH MOUSE LL 因为 根据我的阅读 它更快 我在论坛上读到 当使用 WH MOUSE 时 需要在 DLL 中声明它才能实
  • Script Src 标签内有脚本吗? <脚本>(JavaScript 等)

    为什么这不起作用 但这呢 这在许多从源代码中提取的 HTML 标签中都很常见 微观优化 https stackoverflow com questions 3470990 is micro optimization w
  • 如何在Android中正确编写和使用View子类?

    我正在尝试实施找到的解决方案之一here https stackoverflow com questions 4065134 is there a listener for when the webview displays its con
  • Objective-C 中驼峰命名法转下划线并返回

    我正在寻找一种简单 有效的方法来将 CamelCase 中的字符串转换为下划线表示法 即 MyClassName gt my class name 然后在 Objective C 中再次转换回来 我当前的解决方案涉及很多rangeOfStr
  • PHPStorm 上预期的、意外的文件结束

    我正在使用 PHPStorm 并出现一些有趣的错误 警告 不确定我是否跳过了配置某些内容 例如 这是一个查询 query INSERT INTO tblperson query personName personLname personNu
  • ffmpeg 过滤时出错:无法分配内存

    我的工作站似乎有足够的内存 和所有东西 当我尝试按如下方式运行 ffmpeg 时 usr local bin ffmpeg loglevel debug i A066C002 170619NU CANON mov filter comple
  • 有没有办法可以使用 Cypress 从节点提取数据?

    我正在尝试找到一种方法可以将这些信息提取到我的测试中或在某个地方打印出来 在当前的格式中 它仅表示您有 3 个辅助功能问题 它的描述性不是很强 所以我想以某种方式提取下面的图像 正如您在节点中看到的那样 它为我提供了要修复的确切元素 那么如
  • Bootstrap 水平形式“control-label”不使用响应式样式

    我正在使用 Bootstrap 2 的 form horizo ntal 类 但我的标签似乎没有利用响应式样式 它看起来是这样的 当我检查它时 它的标签上特别有 width 160px 这是常规的 Bootstrap 设置 但响应式样式只有
  • 如何从外部 React 组件获取 Auth0 令牌?

    我正在使用 axios 向我的 API 发出请求 目前 我使用 axios 拦截器为发送的每个请求设置令牌 因此我不必重复从组件内获取令牌 有什么办法可以做到这一点吗 我的第一次尝试看起来像这样 axios ts import useAut
  • 通过 Chef 部署时出现 git 错误

    我正在尝试通过 Chef 代码部署 Rails 应用程序 食谱包含代码 deploy revision testapp do repo REPO URL ssh wrapper home ubuntu ssh chef ssh deploy
  • 我们可以在 Matlab 中拥有混合型矩阵吗?如何实现?

    我正在尝试编写一个以矩阵 特别是矩阵 作为输出的函数 其行显示双精度型变量和二进制 状态 没有真正的原因 只是出于好奇 我想知道是否有办法让行具有不同的类型 非常感谢 MATLAB 提供了两种存储混合数据类型的可行选项 单元阵列 你可以看一
  • Rails 4 删除了测试生成器(尤其是 test_unit)

    我如何删除 test unit 生成器以使它们从rails generate list 我已经尝试过一些方法不适合我 config generators do g g test framework nil end 创建应用程序 T opti
  • 使用折叠表达式检查可变参数模板参数是否唯一

    给定一个可变参数模板参数包 我想使用以下方法检查赋予它的所有类型是否都是唯一的inline constexpr bool and 折叠表达式 http en cppreference com w cpp language fold 我尝试过
  • 如何使用正则表达式匹配重音字符?

    我正在运行 Ruby on Rails 3 0 10 和 Ruby 1 9 2 我使用以下正则表达式来匹配名称 NAME REGEX w s u validates name presence gt true format gt with
  • C++11 的编译器标志

    我正在尝试编写 CMakeFiles txt 以前从未这样做过 但我不确定 C 11 使用什么编译器标志 我使用 GCC 4 8 2 标志是 std c 0x 但我不知道如何处理其他编译器 我不认为他们都使用该标志 我相信 MinGW TD
  • ActiveRecord Association 选择包含记录的计数

    Example class User has many tickets end 我想创建包含用户计数票证逻辑的关联 并在包含中使用它 用户 has one Ticket count Users includes tickets count
  • 选择 UITableViewCell AccessoryView,与选择行分开

    我有一个UITableview我正在显示一些任务 并且每一行都有一个复选框来标记任务是否完成 我希望在用户点击复选框时切换复选标记 并在用户点击该行时切换到详细视图 后者很简单 只需使用 void tableView UITableView
  • 如何让 Javascript 等待所有图像加载后再继续?

    我对 Javascript 相当陌生 目前正在尝试以各种尺寸和位置显示图像 这意味着我必须先加载图像 然后才能访问宽度和高度等值 现在 这就是我面临问题的地方 我尝试依次加载图像 确保只有在完成一张图像后才会加载另一张图像 const a