jQuery document ready()函数可能需要很长时间才能执行

时间:2008-12-30 02:16:37

标签: jquery google-analytics onload

我的问题是,有时候一段JavaScript(通常是谷歌分析)可能需要很长时间才能加载,尽管HTML已经准备好“遍历和操纵”并不重要。如果我要使用以下代码:

$(document).ready(function () {
    $("p").text("The DOM is now loaded and can be manipulated.");
});

这是否意味着在加载Google Analytics之后才会填充<p>

在大多数网站上通常不需要像Google Analytics这样的东西,我经常发现我正在等待它加载。 (我不想使用onload,因为of it's unreliability。)

有没有更好的方式或方式说“不要等待[...]”?

注意:我通常无法将代码放在<script>标记之前的</body>标记中,因为该网站位于模板中。我通常只能编辑页面的“内容”。

5 个答案:

答案 0 :(得分:6)

您是否尝试过就绪功能中加载Google分析?这是一个讨论动态脚本加载的link。据推测,在准备好的脚本的其他部分已经执行之后,你最终会这样做。

答案 1 :(得分:5)

Google实际上发布了他们所谓的Asynchronous Tracking

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
  })();

</script>

这解决了这个问题,因为它只会在解析DOM后加载,因此你已经可以使用页面上的所有内容了。

答案 2 :(得分:1)

在大多数现代浏览器中,您现在可以写:

<script>var _gaq = _gaq || [["_setAccount","UA-XXXXX-X"],["_trackPageview"]]; </script>
<script src="//www.google-analytics.com/ga.js" async></script>

该脚本将在大多数浏览器上加载异步,并自动处理不同的方案..

您可能希望使用更长时间的旧浏览器更安全 - 版本:

<script>var _gaq = _gaq || [["_setAccount","UA-XXXXX-X"],["_trackPageview"]]; </script>
<script type="text/javascript" src="//www.google-analytics.com/ga.js" async="true" defer="true"></script>

一些注意事项:

  • IE6中存在一个错误,由于缺少协议而会阻止JS加载(请参阅http://www.paulirish.com/2010/the-protocol-relative-url/),但您可以添加正在使用的协议。
  • 旧浏览器无法理解&#34; async&#34;如果要么延迟(在页面加载后),或者只是在找到它时加载它(因此不是异步),所以会加载属性。

答案 3 :(得分:-1)

这只是猜测,但你考虑过setTimeOut()吗?

$(document).ready(function()
{
   setTimeOut(function()
   {
      // Your code comes here
   }, 0); // We don't really need any delay
});

setTimeOut()具有转义调用堆栈的优点,因此它可以解决您的问题。

答案 4 :(得分:-2)

我有同样的问题。只需将此行放在第一次javascript加载,然后在IE上运行正常:

jQuery.noConflict();