JavaScript 预加载是如何工作的?

2023-11-23

我不想知道预加载图像的方法,我在网上找到了很多,但我想知道它是如何工作的。 javascript 如何预加载图像? 我的意思是,我尝试了这里的一个片段,即使它有效,它似乎也没有预加载图像。

当我检查 firebug 时,我可以看到图像加载了两次,一次是在预加载时,另一次是在显示时!

为了改进这段代码,我想知道它是如何工作的。

这就是我所做的:

 function preload(arrayOfImages) {
        $(arrayOfImages).each(function(){
            $('<img/>')[0].src = this;
            //(new Image()).src = this;
            alert(this +'  &&   ' + i++);

        });
    }

然后我做了类似的事情:

preloader = function() {
    preload(myImages);
}

$(document).ready(preloader);

这是我显示/添加图像的方式:

$("li.works").click(function() {
             $("#viewer").children().empty();
             $('#viewer').children().append('<img src=\'images/ref/'+this.firstChild.id+'.jpg\' alt="'+this.firstChild.id+'" \/>')
             $("#viewer").children().fadeIn();

您的基本 Javascript 预加载器执行以下操作:

var image = new Image();
image.src = '/path/to/the/image.jpg';

它的工作方式很简单,通过创建一个新的 Image 对象并设置它的 src,浏览器将去抓取图像。我们不添加this特定的图像发送给浏览器,但是当需要通过我们设置的任何方法在页面中显示图像时,浏览器已经将其保存在缓存中,并且不会再次获取它。不过,如果不查看代码,我无法真正告诉您为什么您拥有的任何东西都不能以这种方式工作。

讨论的一个有趣的问题在这个问题中当您有一组图像并尝试使用相同的 Image 对象预加载它们时,会发生什么:

var images = ['image1.jpg','image2.jpg'];
var image = new Image();
for(var x = 0; x < images.length; x++) {
    image.src = images[x];
}

这只会预加载最后一个图像,因为在循环再次更改对象源之前,其余图像将没有时间预加载。查看这方面的示例。单击按钮后,您应该能够立即看到第二个图像,但第一个图像必须加载,因为当您尝试查看它时它没有机会预加载。

因此,一次执行多项操作的正确方法是:

var images = ['image1.jpg','image2.jpg'];
for(var x = 0; x < images.length; x++) {
    var image = new Image();
    image.src = images[x];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 预加载是如何工作的? 的相关文章

  • React Native 将样式设置为 State

    我想用backgroundColor of style1作为一种状态 并在函数中改变它change 我怎样才能访问style1 我的观点是调用该函数change从另一个函数 使按钮将其颜色更改为黄色 然后在一段时间后再次将其颜色更改为蓝色
  • Javascript Firefox - 如果 @import 存在于样式表中,则无法查询 cssRules - bug 或预期行为?

    如果 import 存在于 css 样式表中 我无法查询 cssRules 是否符合网络标准 或者知道 Firefox 的限制 注意 我正在从同一域导入 css 文件 var style rules document styleSheets
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 在 HTML SELECT 标记中禁用键盘

    我想禁用 HTML SELECT 标记的键盘 以便用户只能使用鼠标来选择选项 我试过了event cancelBubble true on the onkeydown onkeyup and onkeypress没有运气的事件 有任何想法吗
  • 这个特定的 ReactJs 代码是如何执行的初学者问题?

    我是初学者 正在阅读大量代码 现在我想知道下面的代码我明白这段代码在做什么 我需要澄清的是代码流程 当我运行它时 我看到图像正在加载 React 是从上到下执行代码吗 占位符图像异步获得正确的图像 但会App如果需要时间 组件会开始渲染但没
  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • IE 9 的子元素不透明,我无法使用 captify 阻止它

    好的 我正在使用一段名为 Captify 的 javascript 它为您的图像添加了一个带有文本的小弹出窗口 适用于所有接受 IE9 的浏览器 IE9 会淡化弹出 div 中的所有内容 我已阅读其子元素问题 但无法修复它 由于在网上任何地
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 如何滚动到 jQuery Mobile 中的页面元素?

    我有一个很长的 jQuery 移动页面 并且想在页面加载后滚动到该页面中间的元素 到目前为止 我已经尝试了一些事情 最成功的是 jQuery document bind mobileinit function var target if t
  • HTML5 拖放 - 没有透明度?

    当我将一个元素拖放到页面上时 该元素会变成 幻影 基本上它获得了一些透明度值 有什么办法可以做到吗opacity 1 看来是做不到了 拖动的元素被放入具有自己的不透明度 低于 1 的容器中 这意味着虽然您可以降低拖动元素的不透明度 但您无法
  • 获取键盘事件中的鼠标位置

    我试图在用户按住 Shift 键时出现选择轮 滚轮应以鼠标位置为中心 然而当我测试这个时 pageX and clientX两者在事件对象上都未定义 是否可以通过键盘事件获取鼠标坐标 不 只需跟踪mousemove事件并持续保存当前位置 以
  • Typeahead.js 干扰 Bootstrap 输入组

    如何防止 Typeahead js 拆分我的 Twitter Bootstrap 3 输入组 每当我将 Typeahead javascript 指向属于输入组一部分的文本区域时 连接的文本区域和提交按钮就会停止连接 这只是 Typeahe
  • 如何在流程图中间隔刻度线?

    我下面有一个流程图 您将看到标签被压缩 我想使刻度之间的宽度确保显示所有标签 标记如下 div div class graph info a href span span a a href class active span span a
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • 将 javascript 变量发送到服务器端 ASP .NET

    我需要在回发时将 JavaScript 数据传递到服务器端 Exvar jsVariableToPass new Object jsVariableToPass key1 value1 jsVariableToPass key2 value
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi
  • 如何在odoo中重写js函数

    我想加载 shop checkout url 函数是 odoo define change info order website sale change info order function require use strict oe w
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css

随机推荐

  • 在 python 中,我可以将 print 函数的输出重定向到 stderr 吗?

    有很多print功能 python 2 7 在我的程序中 有什么方法可以添加几行然后所有输出都可以重定向到stderr 我想要的是 python 代码 而不是 linux 管道 例如我的程序是这样的 print hello world 我想
  • Python:在单词边界上分割unicode字符串

    我需要获取一个字符串 并将其缩短为 140 个字符 目前我正在做 if len tweet gt 140 tweet re sub r s tweet normalize space footer utils shorten urls po
  • MOVDQA 和 MOVNTDQA 以及 WB/WC 标记区域的 VMOVDQA 和 VMOVNTDQ 有什么区别?

    通过使用标记为 WB 回写 和 WC 写组合 的内存的指令之间的主要区别是什么 MOVDQA and MOVNTDQA 以及之间有什么不同VMOVDQA and VMOVNTDQ 是不是 内存已标记为 WC 指令 NT 与平常没有什么不同
  • 如何使用 git init 将本地 git hook 替换为更新版本?

    我和这位用户有完全相同的问题 git init 模板 替换修改后的钩子 我的全局 git hooks 中有一个新的模板文件 但是 原来的模板文件已经加载了 所以git init不会覆盖 我在这里读到了同样的内容 这似乎是正确的 git 行为
  • 使用moment.js,如何向用户显示当前的日期格式?

    给定一个文本字段 我想要一个合适的占位符 典型的占位符类似于 mm dd yyyy 但是 我想通过 moment js 使用区域设置感知日期 这意味着我将指定 l 作为 moment js 日期格式 如何确定在这种情况下 moment js
  • 如何使用 pandas 更改数据框中文本的字体大小

    我研究了 pandas 的样式文档 但无法准确地得到我的问题的特定和准确的答案 我正在使用数据帧读取 Excel 文件并在程序中处理该数据帧 最后 我使用 xlwings 库在另一个现有的 Excel 文件中写入处理后的数据帧 我在用 im
  • 如何使编辑器句柄可选择以显示属性检查器窗口

    这是来自的后续问题如何使贝塞尔曲线的各个锚点连续或不连续 请参阅它以获取已接受答案中的相关代码 请注意 我这样做是为了保持这个问题的简洁 因为相关代码相当冗长 我正在努力实现以下目标 使贝塞尔曲线手柄 控制点可选择 以便在选择时单个手柄的属
  • 根据谓词将列表拆分为列表列表

    我知道这个问题 但它与序列有关 这不是我的问题 给定此输入 例如 let testlist text1 text2 text3 text4 text5 text6 text7 let pred s string s StartsWith 我
  • 如何在 Swift 中将类分配给启动屏幕?

    我正在尝试更改从我的闪屏类调用 Web 服务的类 但它会触发错误消息 错误是 启动画面不允许自定义类 您的启动故事板在您的应用程序开始执行之前显示 因此 正如错误所示 它无法执行代码 您可以复制启动故事板中的场景作为主故事板的初始视图控制器
  • 在php中解析法国日期

    我有字符串 伦迪 2013 年 7 月 8 日 09 09 如何解析这个类型的字符串 I try date 08 Juillet 2013 09 09 date new DateTime date 但它抛出异常 The intl扩展可以用于
  • 您能否限制可以在 MATLAB GUI 编辑框中输入哪些字符?

    我想在 MATLAB GUI 中创建一个编辑框 仅允许在其中输入数字或字母 这可能吗 不存在这样的功能 至少没有记录在案 您可以分配一个回调来检查输入 但这将会发生after用户输入了非法字符 虽然我不知道具体该怎么做 但我猜你可以使用 J
  • ActionListener 如何工作?

    我知道如何使用动作侦听器并实现它们 但我想知道是否有人可以告诉我他们如何侦听事件 有某种轮询机制吗 操作侦听器使用以下方法注册事件观察者模式主事件循环会通知他们所注册的任何事件 所以不 这不是一个轮询 拉 机制 而是相反的 一个 推 回调
  • 拖动 WPF 用户控件

    我创建了一个可移动的UserControl
  • MySQL:在多列中查找相同的字符串

    我正在尝试制作一个类似搜索页面的功能 我想进行查询以在 ColumnA 和 ColumnB 以及 ColumnC 和 ColumnD 中查找 query 并选择在任何这些列中具有单词 短语 query 的行 这似乎有效 SELECT FRO
  • 从客户端的对象数组中获取最新日期的优雅方法是什么?

    我在项目中使用AngularJS 我从服务器获取对象数组 每个对象都包含几个属性 其中之一是日期属性 这是我从服务器获取的数组 json 格式 Address 25 AlertType 1 Area North MeasureDate 20
  • UIScrollView 按偏移量滚动

    我有这样的情况 适合所有屏幕的一个滚动视图 scrollView内部有N个 单元格 每个单元格包含一个标签 每个单元格的高度为 80px 固定绿色遮罩 UIView 我以编程方式创建带有标签的单元格 UIView 并正确设置scrollVi
  • MySQL命令解释忽略LIMIT?

    我使用MySQL服务器版本5 5 14 现在我正在尝试使用Explain命令进行这个简单的SQL查询 EXPLAIN SELECT id name thumb FROM twitter profiles LIMIT 10 它向我显示了这个结
  • Ninject.MVC3 Bootstrapper 的 Kernel 属性被标记为“已过时”。我怎样才能访问内核?

    我将 Ninject MVC3 包从 2 2 1 0 更新到 2 2 2 0 之前我可以通过 BootStrapper Kernel 属性访问 Kernel 对象 但在新版本中 Kernel 属性被标记为过时 我收到警告说 公共只读属性内核
  • 比较 pandas 列中的浮点数

    我有以下数据框 actual credit min required credit 0 0 3 0 4 1 0 5 0 2 2 0 4 0 4 3 0 2 0 3 我需要添加一列 指示actual credit gt min require
  • JavaScript 预加载是如何工作的?

    我不想知道预加载图像的方法 我在网上找到了很多 但我想知道它是如何工作的 javascript 如何预加载图像 我的意思是 我尝试了这里的一个片段 即使它有效 它似乎也没有预加载图像 当我检查 firebug 时 我可以看到图像加载了两次