Javascript JQuery:检测何时加载元素和所有子元素
我希望在一个特定元素及其所有子元素都在DOM中时执行代码。我知道如何轮询所需元素的存在性,或者更好地使用Javascript JQuery:检测何时加载元素和所有子元素,javascript,jquery,dom,Javascript,Jquery,Dom,我希望在一个特定元素及其所有子元素都在DOM中时执行代码。我知道如何轮询所需元素的存在性,或者更好地使用MutationObserver,但所需元素本身相当大,我不能确定它的所有子元素是否完全基于现有元素加载 我可以等待ready,在加载所有DOM时调用它,但是加载页面通常需要相当长的时间。为了提高速度,我想知道,而不必等待$(document).ready() 我确实在函数中找到了,我喜欢这样一个事实,即它将被调用用于甚至还不存在的元素: $(document).on('SomeEvent',
MutationObserver
,但所需元素本身相当大,我不能确定它的所有子元素是否完全基于现有元素加载
我可以等待ready
,在加载所有DOM时调用它,但是加载页面通常需要相当长的时间。为了提高速度,我想知道,而不必等待$(document).ready()
我确实在函数中找到了,我喜欢这样一个事实,即它将被调用用于甚至还不存在的元素:
$(document).on('SomeEvent','desiredElem',handler)代码>
…但是,我不知道有哪个事件是由于html元素完全位于DOM中而触发的
我的脚本正在被注入浏览器,我从日志中知道它在$(document).ready()或DOMContentLoaded
之前运行了很长时间。基本上我想利用这一点。不幸的是,我无法将
标记添加到HTML中
另一方面,现有对象的事件会很有趣。这将使我不必使用MutationObserver
您需要设置一个计时器,并不断观察DOM检查元素是否存在
function checkIfLoaded( callBack, elementSelector )
setTimeout( function(){
$( elementSelector ).size() == 0 )
{
//continue checking
checkIfLoaded( callBack, elementSelector )
}
else
{
callBack();
}
}, 1000 );
)
checkIfLoaded( function(){ alert( "div loaded now" ) }, "#divId" );
既然您已经说过,您试图识别的是当页面的源HTML中存在的元素及其所有子元素被加载时,那么您可以做以下几件事:
您可以在最后一个子元素之后测试是否存在任何已知元素。由于HTML元素是按顺序连续加载的,因此如果最后一个子元素之后的元素存在,那么它之前的所有元素都必须已经在DOM中,因为页面HTML仅按其在页面HTML源中出现的顺序插入
如果在页面中的相关HTML之后放置
标记,则当该脚本标记运行时,该
标记之前的所有HTML都将位于DOM中
>p>您可以使用轮询或使用一个突变观察器,但这不会对您有帮助,因为当DOM解析器正插入一堆HTML到页面中时,没有脚本运行。因此,脚本或突变事件只会在插入整个页面DOM后运行,或者当页面暂停以加载其他内联资源(如
标记)时运行
您可以返回到DOMContentLoaded
事件,该事件将告诉您何时加载整个DOM
要获得更具体的帮助,我们需要更多地了解您的具体情况,包括您试图关注的HTML示例,以及您的限制条件(您可以在页面源代码中修改哪些内容,以及您可以在页面中插入或运行脚本的位置)。如果是这样,一个特定父元素内的所有元素,例如,一个div内的所有文本框(比如id div1)都被加载,您可以使用jQuery通过获取div1内的输入计数来检查它,如var cnt=$('div1')。find(input)代码>如果它返回所需的元素计数,您可以触发所需的事件。您可以在$(window.load=function(){//statements})中尝试您的语句;这是页面完全加载后的事件。您认为“所需元素本身相当大”是什么意思?什么使它大?元素是否存在。它永远不会是现在的一半。这个元素是HTML页面的一部分还是动态添加到页面中?如果它是动态插入到页面中的,您可以共享插入它的代码吗?如果您尝试逐段加载,请使用$(选择器)。加载('anotherPage.php#someId',function(){/*load more*/})
“将使我不必使用MutationObserver
”MutationObserver
而不返回预期结果?可以在问题中包括示例html
?尝试在加载的html
结束时添加//do stuff
元素?这种“轮询”方法将是一种低效的方法。当OP解释了更多关于实际元素是什么以及如何添加到页面中时,我们可以提供一些想法,看看是否有比这更有效的方法。@AlexanderO'Mara,谢谢。今天学到了这个新东西:)。但它似乎不适用于较旧的浏览器。我的脚本正在被GreaseMonkey注入。根据日志记录,我的脚本在DOMContentLoaded
之前运行了很长一段时间,所以我想我会尽量利用这一点。