我想创建/处理一个事件,让我知道特定资源何时加载到网页中。 (类似于onload或DOMContentLoaded,但我需要知道每个资源何时完成,而不是整个页面) 示例 - >资产= image1,image2,image3,...
当完成加载image1触发就绪事件时,
准备好事件触发后开始加载image2
继续......继续......
在最后一张图片之后,再次触发就绪事件。
最终结果与DOMContentLoaded或" windows.onload"相同,但正如我所说,我不能在资产负载中间放置一些逻辑。
有人知道如何处理这类事情吗?
答案 0 :(得分:1)
我不确定这是否适合您,但您是否尝试过setTimeOut功能?
您可以设置加载图像的特定时间(通过ajax,您可以调用资源并等到request.done),然后调用下一个。
我还在这里发现了与您的请求类似的内容: How to wait for another JS to load to proceed operation?
很抱歉,如果这对您没有帮助。
答案 1 :(得分:1)
我不确定,为什么(或者如果)你想加载'按特定顺序的图像。请注意,浏览器很少打开单个连接。通常会收集所有资源(在下载html本身之后),浏览器将并行加载其中的许多资源。简而言之 - 如果你为了性能或速度而这样做,你会减慢这个过程!
延迟加载图像的一种更常见的方法是使用视口/滚动位置来决定应该加载哪些图像"接下来",有一些jquery插件,例如lazyload
无论如何 - 如果 您不关心订单 ,并且您只想在准备就绪时进行特定于元素的回调,您可以执行以下操作:
$("img").one("load", function() {
var $this = this;
// 'this' is your specific element
// do whatever you like to do onready
}).each(function() {
// handle cached elements
if(this.complete) $(this).load();
});
如果 您确实关心订单 ,并且您真的想在第一张图片准备就绪后加载下一张图片,则需要采用不同的方法。
首先:您的HTML不包含图像源,但包含数据属性的图像:
<img data-src="the/path/to/your/image" data-assets-order="1" />
第二:在JS中,您收集所有这些图像而没有真正的来源,您订购了集合,最后一个接一个地触发加载。
var toLoad = [];
// scanning for all images with a data-src attribute
// and collect them in a specified order.
$('img[data-src]').each(function() {
// either you define a custom order by a data-attribute (data-assets-order)
// or you use the DOM position as the index. Mixing both might be risky.
var index = $(this).attr('data-assets-order') ?
$(this).attr('data-assets-order') : toLoad.length;
// already existing? put the element to the end
if (toLoad[index]) { index = toLoad.length; }
toLoad[index] = this;
});
// this method handles the loading itself and triggers
// the next element of the collection to be loaded.
function loadAsset(index) {
if (toLoad[index]) {
var asset = $(toLoad[index]);
// bind onload to the element
asset.on("load", function() {
// in case it is ready, call the next asset
if (index < toLoad.length) {
loadAsset(index + 1);
}
});
// set the source attribut to trigger the load event
asset.attr('src', asset.attr('data-src'));
}
}
// we have assets? start loading process
if (toLoad.length) { loadAsset(index); }