Javascript JQuery:检测何时加载元素和所有子元素

Javascript JQuery:检测何时加载元素和所有子元素,javascript,jquery,dom,Javascript,Jquery,Dom,我希望在一个特定元素及其所有子元素都在DOM中时执行代码。我知道如何轮询所需元素的存在性,或者更好地使用MutationObserver,但所需元素本身相当大,我不能确定它的所有子元素是否完全基于现有元素加载 我可以等待ready,在加载所有DOM时调用它,但是加载页面通常需要相当长的时间。为了提高速度,我想知道,而不必等待$(document).ready() 我确实在函数中找到了,我喜欢这样一个事实,即它将被调用用于甚至还不存在的元素: $(document).on('SomeEvent',

我希望在一个特定元素及其所有子元素都在DOM中时执行代码。我知道如何轮询所需元素的存在性,或者更好地使用
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
    之前运行了很长一段时间,所以我想我会尽量利用这一点。