在 iframe 加载后删除加载器动画
Removing loader animation after iframes have loaded
我正在维护一个 Web 应用程序,它的所有内容都在 iframe 中。快速分解其结构:(每个'-'代表一个新层)
Main page
-iframe container
--iframe q1
--iframe q2
--iframe q3
--iframe q4
--iframe q5
基本上,一个主 iFrame 中有 4 个 iFrame。我有一个加载器动画,我需要在所有 iframe 完成加载后从屏幕上删除它。每个 iframe 都有根据页面上的选择更新的数据。我需要的是每次更新后加载动画覆盖整个屏幕。处理这个问题的最佳方法是什么?我知道你可以使用
$('#iframe').on('load',function() {
//code here...
}
确定 iframe 何时完成加载。有没有一种简单的方法可以同时收听所有这些内容,然后在完成后关闭加载动画?感谢您的帮助。
以下是每个 iframe 的创建方式:
var p1HTML = '<div id='p1ContainerBody' class='panelContainerBody'><iframe id='P1ChartFrame' src='' frameborder='0' scrolling='no' style='height: 100%; width: 100%'></iframe></div>'
然后:
if (ConfigData["GlobalOptions"].Quadrants[x].QuadrantId == "1") {
$("#q1Container").html(p1HTML);
}
创建一个 Promise
for each iframe
and add a load
listener as you discussed in your second code block. Resolve the Promise in the load event listener after the iframe
loads. Create a Promise.all()
处理程序以在所有 iframes
加载后删除动画。
Promise.all(Array.prototype.map.call(document.querySelectorAll("iframe"), function (iframe) {
return new Promise(function (resolve, reject) {
iframe.addEventListener("load", function () {
resolve();
});
});
})).then(function () {
// Do loading removal
});
如果您希望留在 jQuery 框架内,jQuery 有自己的 Promise API。
您需要做的主要事情是保留 iframes
的句柄,以便您可以在更改它们指向的 url 之前将显式加载处理程序附加到它们。如果不这样做,在位置被缓存或其他情况下,您可能会错过加载事件。
考虑这个替代代码:
var urlArr, iframeProms;
// Array of urls that we need to make iframes for
urlArr = [
"http://www.google.com",
"http://www.yahoo.com"
];
// Map the urls to an array of objects containing iframe elements and associated promises
iframeProms = $.map(urlArr, function (url) {
var d, iframe;
// Make a deferred that we will resolve on iframe load
d = $.Deferred();
// Make an iframe
iframe = $("iframe");
// Add a load listener BEFORE YOU ADD THE URL
iframe.on("load", function () {
// Resolve the deferred
d.resolve();
});
// Now provide the url so we don't miss timing for load event
iframe.src = url;
// Return a handle to the iframe and the deferred's promise
return {
i: iframe,
p: d.promise
};
});
// Map down to the promises and what for them to resolve
$.when($.map(iframeProms, function (i) {
return i.p;
})).then(function () {
// Do loading removal
});
我正在维护一个 Web 应用程序,它的所有内容都在 iframe 中。快速分解其结构:(每个'-'代表一个新层)
Main page
-iframe container
--iframe q1
--iframe q2
--iframe q3
--iframe q4
--iframe q5
基本上,一个主 iFrame 中有 4 个 iFrame。我有一个加载器动画,我需要在所有 iframe 完成加载后从屏幕上删除它。每个 iframe 都有根据页面上的选择更新的数据。我需要的是每次更新后加载动画覆盖整个屏幕。处理这个问题的最佳方法是什么?我知道你可以使用
$('#iframe').on('load',function() {
//code here...
}
确定 iframe 何时完成加载。有没有一种简单的方法可以同时收听所有这些内容,然后在完成后关闭加载动画?感谢您的帮助。
以下是每个 iframe 的创建方式:
var p1HTML = '<div id='p1ContainerBody' class='panelContainerBody'><iframe id='P1ChartFrame' src='' frameborder='0' scrolling='no' style='height: 100%; width: 100%'></iframe></div>'
然后:
if (ConfigData["GlobalOptions"].Quadrants[x].QuadrantId == "1") {
$("#q1Container").html(p1HTML);
}
创建一个 Promise
for each iframe
and add a load
listener as you discussed in your second code block. Resolve the Promise in the load event listener after the iframe
loads. Create a Promise.all()
处理程序以在所有 iframes
加载后删除动画。
Promise.all(Array.prototype.map.call(document.querySelectorAll("iframe"), function (iframe) {
return new Promise(function (resolve, reject) {
iframe.addEventListener("load", function () {
resolve();
});
});
})).then(function () {
// Do loading removal
});
如果您希望留在 jQuery 框架内,
jQuery 有自己的 Promise API。
您需要做的主要事情是保留 iframes
的句柄,以便您可以在更改它们指向的 url 之前将显式加载处理程序附加到它们。如果不这样做,在位置被缓存或其他情况下,您可能会错过加载事件。
考虑这个替代代码:
var urlArr, iframeProms;
// Array of urls that we need to make iframes for
urlArr = [
"http://www.google.com",
"http://www.yahoo.com"
];
// Map the urls to an array of objects containing iframe elements and associated promises
iframeProms = $.map(urlArr, function (url) {
var d, iframe;
// Make a deferred that we will resolve on iframe load
d = $.Deferred();
// Make an iframe
iframe = $("iframe");
// Add a load listener BEFORE YOU ADD THE URL
iframe.on("load", function () {
// Resolve the deferred
d.resolve();
});
// Now provide the url so we don't miss timing for load event
iframe.src = url;
// Return a handle to the iframe and the deferred's promise
return {
i: iframe,
p: d.promise
};
});
// Map down to the promises and what for them to resolve
$.when($.map(iframeProms, function (i) {
return i.p;
})).then(function () {
// Do loading removal
});