【问题标题】:Execute jQuery after Other JS file Dynamically loads content其他 JS 文件后执行 jQuery 动态加载内容
【发布时间】:2015-12-02 04:22:18
【问题描述】:

我正在修改一些内容,这些内容通过另一个脚本(我们称之为脚本#1)动态加载到我的网站上。脚本 #1 加载一些标记和内容,我一直在使用 setTimeout() 函数调用我的脚本(脚本 #2),延迟几秒钟,以等待确保脚本 #1 已执行并且内容存在于 DOM 中。

我的问题是脚本#1 有不同的加载时间,具体取决于服务器负载,并且根据这些因素可能会变慢或变快,而现在,使用 setTimeout() 确保安全,我通常只剩下一秒钟或者两个我的脚本仍在等待被触发并且脚本 #1 已经加载了内容。

如何在 Script#1 成功加载其动态内容后立即执行我的脚本?

我发现this post 似乎确实解决了同样的问题,但是由于某种原因,使用@Matt Ball 在那里布置的 setInterval 函数根本不起作用。我正在使用下面的代码,其中“div.enrollment”旨在在动态加载和执行的 DOM 中找到..

jQuery(window).load(function ($)
  {
      var i = setInterval(function ()
      {
          if ($('div.enrollment').length)
          {
              clearInterval(i);
              // safe to execute your code here
              console.log("It's Loaded");
          }
      }, 100);
  });

任何有关这方面指导的帮助将不胜感激!感谢您的宝贵时间。

【问题讨论】:

    标签: javascript jquery dynamic


    【解决方案1】:

    看来healcode.js 做了很多事情。 <healcode-widget> 标签中添加了大量标记。

    我会尝试在内部添加另一个带有 id 的标签并测试它是否存在:

    <healcode-widget ....><div id="healCodeLoading"></div></healcode-widget>
    

    在一个区间内测试healCodeLoading&lt;healcode-widget&gt;中是否存在:(假设是jQuery)

    var healCodeLoadingInterval = setInterval(function(){ 
        var healCodeLoading = jQuery('healcode-widget #healCodeLoading');
    
        if (healCodeLoading.length == 0) {
            clearInterval(healCodeLoadingInterval);
    
            // Everything should be loaded now, so you can do something here
        }
    }, 100);
    

    healcode.js 应该在初始化期间替换 &lt;healcode-widget&gt;&lt;/healcode-widget&gt; 中的所有内容。因此,如果您的&lt;div&gt;-元素不再在其中,则该小部件已加载并初始化。

    希望对您有所帮助。

    【讨论】:

    • 这是一个很好的策略。我很遗憾看到它没有像我们希望的那样工作。如果你愿意的话,我认为你应该能够看到这个dev site 来检查标记。似乎 healcode.js 没有清除 div#healCodeLoading,而只是将其替换并放在 之外。所以在这种情况下测试它的存在是不成功的。
    • 好的。但是你可以修改代码。我更新了我的答案。主要区别在于,我现在检查#healCodeLoading INSIDE of &lt;healcode-widget&gt; 的存在。如果它不在内部,我们可能可以假设小部件已加载。我使用 jQuery 来更轻松地访问 DOM。
    • 感谢您的努力。这似乎也不起作用。显然脚本加载了一部分,(显示加载图像,此时#healCodeLoading div 启动,然后需要几秒钟来加载实际标记。我看到另一个站点在做类似的事情,他们正在使用if(jQuery('.hc_loading_image').length )为了查看是否正在显示加载图像。我可以看到它的进一步使用.. 我想我需要有 2 个 setInterval 函数,一个用于观察并查看加载图像何时显示,一个用于查看它何时显示(标记已加载)。
    • 但是你的方法奏效了! @GuidoK 只是改变了一点。我知道输出会加载一组
      这是主要标记,因此我将变量 healCodeLoading 修改为 jQuery('healcode-widget .enrollment') 并将 if 语句修改为 if (healCodeLoading.length !== 0) 以确定该注册 div 何时存在并且有内容,它就像一个魅力。谢谢!
    【解决方案2】:

    如果你只是想加载一些标记和内容然后运行一些脚本,你可以使用 jQuery。您应该在脚本#1 中使用类似以下的内容来运行脚本#2 中的函数

    $.get( "ajax/test.html", function( data ) {
        // Now you can do something with your data and run other script.
        console.log("It's Loaded");
    });
    

    函数在ajax/test.html被加载后被调用。

    希望有帮助

    【讨论】:

    • 感谢您的回复。我遇到的这个问题是我无法控制 Script#1。或者至少我相信。我粘贴以下代码&lt;script src="https://widgets.healcode.com/javascripts/healcode.js" type="text/javascript"&gt;&lt;/script&gt; &lt;healcode-widget data-type="enrollments" data-widget-partner="mb" data-widget-id="301787442aa" data-widget-version="0.1"&gt;&lt;/healcode-widget&gt; 并执行,调用标记。一旦发生这种情况,我需要执行我的脚本(Script#2)。 @Guido
    • 我查看了该代码,但healcode.js 中发生了很多事情。我可能会尝试查看 -Tag 内部发生了什么。请参阅我的其他答案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 2016-03-13
    • 2011-06-14
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多