检查元素是否加载
Check if element is loaded
我有一个站点和该站点中的一个 iFrame,以及许多其他内容(图像等)。
现在我正在使用 jQuery 的 $(document).ready(function() { ... });
来执行代码。在该代码中,我试图操纵 iFrame 中的内容。但是,我必须确保已加载 iFrame 才能执行代码。
iFrame 通常在执行代码的同时加载,因此有时会失败,有时不会。
如果我使用$('#iframe').load(function(){ });
,事件并不总是执行,因为在那一刻我附加了那个加载监听器,iFrame可能已经完成加载,加载事件不会再次执行.如果我离开它,元素有时还不存在(代码执行得太早)。
所以我想要实现的是这样的:
if iFrame is already loaded
-- execute code
else
-- $('#iframe').load(function() { /*execute code*/ });
有没有更好的方法在不使用脏超时的情况下实现这一点?或者,如果使用这种方法,是否有检查元素是否已加载的函数?
确保在设置 iFrame 的 src
之前执行 $('#iframe').load(function(){ });
。
为此,请从 javascript 设置 src
,而不是 HTML。
此外,加载顺序在这里很重要。如果您的 jQuery 的整体包装器是 jQuery(window).load(function() {...})
,则行为将与 jQuery(function() {...})
.
给出的行为不同
对于相同的域 iframe(这里似乎是您的情况):
您可以检查 iframe 是否有一些内容,然后使用以下逻辑触发加载事件:
$('#iframe').one('load', function(){
console.log("Sure load event is called!")
}).each(function(){
if(this.contentDocument.body.children.length) {
$(this).trigger('load');
}
})
也用于处理跨域 iframe:
我猜你最好的选择,如果你不需要支持 IE8 可能是捕获 load
事件并在你在 DOM 中设置 iframe
之前设置它,通过调用例如在 head
部分:
document.addEventListener(
'load',
function(event){
var elm = event.target;
if( elm.id === 'iframe'){ // or any other filtering condition
console.log("Sure iframe is loaded!")
}
},
true // Capture event
);
DOM 总是在页面完全加载之前准备就绪,在 .ready() 处理程序期间执行的代码中附加加载事件侦听器通常是不安全的。例如,可以使用 $.getScript() 等方法在页面加载很久之后动态加载脚本。虽然 .ready() 添加的处理程序将始终在动态加载的脚本中执行,但 window 的加载事件已经发生并且那些侦听器永远不会 运行.
jQuery 提供了几种附加函数的方法,当 DOM 准备就绪时,该函数将 运行。以下所有语法都是等效的:
- $(处理程序)
- $(文档).ready(处理程序)
- $("document").ready(处理程序)
- $( "img" ).ready(处理程序)
- $().ready(处理程序)
我有一个站点和该站点中的一个 iFrame,以及许多其他内容(图像等)。
现在我正在使用 jQuery 的 $(document).ready(function() { ... });
来执行代码。在该代码中,我试图操纵 iFrame 中的内容。但是,我必须确保已加载 iFrame 才能执行代码。
iFrame 通常在执行代码的同时加载,因此有时会失败,有时不会。
如果我使用$('#iframe').load(function(){ });
,事件并不总是执行,因为在那一刻我附加了那个加载监听器,iFrame可能已经完成加载,加载事件不会再次执行.如果我离开它,元素有时还不存在(代码执行得太早)。
所以我想要实现的是这样的:
if iFrame is already loaded
-- execute code
else
-- $('#iframe').load(function() { /*execute code*/ });
有没有更好的方法在不使用脏超时的情况下实现这一点?或者,如果使用这种方法,是否有检查元素是否已加载的函数?
确保在设置 iFrame 的 src
之前执行 $('#iframe').load(function(){ });
。
为此,请从 javascript 设置 src
,而不是 HTML。
此外,加载顺序在这里很重要。如果您的 jQuery 的整体包装器是 jQuery(window).load(function() {...})
,则行为将与 jQuery(function() {...})
.
对于相同的域 iframe(这里似乎是您的情况):
您可以检查 iframe 是否有一些内容,然后使用以下逻辑触发加载事件:
$('#iframe').one('load', function(){
console.log("Sure load event is called!")
}).each(function(){
if(this.contentDocument.body.children.length) {
$(this).trigger('load');
}
})
也用于处理跨域 iframe:
我猜你最好的选择,如果你不需要支持 IE8 可能是捕获 load
事件并在你在 DOM 中设置 iframe
之前设置它,通过调用例如在 head
部分:
document.addEventListener(
'load',
function(event){
var elm = event.target;
if( elm.id === 'iframe'){ // or any other filtering condition
console.log("Sure iframe is loaded!")
}
},
true // Capture event
);
DOM 总是在页面完全加载之前准备就绪,在 .ready() 处理程序期间执行的代码中附加加载事件侦听器通常是不安全的。例如,可以使用 $.getScript() 等方法在页面加载很久之后动态加载脚本。虽然 .ready() 添加的处理程序将始终在动态加载的脚本中执行,但 window 的加载事件已经发生并且那些侦听器永远不会 运行.
jQuery 提供了几种附加函数的方法,当 DOM 准备就绪时,该函数将 运行。以下所有语法都是等效的:
- $(处理程序)
- $(文档).ready(处理程序)
- $("document").ready(处理程序)
- $( "img" ).ready(处理程序)
- $().ready(处理程序)