3

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

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

这是否意味着在<p>加载 Google Analytics 之类的内容之前不会填充?

大多数网站通常不需要像谷歌分析这样的东西,我经常发现我正在等待它加载。(我不想使用 onload 因为它不可靠。)

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

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

4

5 回答 5

6

您是否尝试过从 ready 函数中加载 Google 分析?这是一个讨论动态脚本加载的链接。大概在您准备好的脚本的其他部分已经执行之后,您会在最后执行此操作。

于 2008-12-30T02:52:37.080 回答
5

谷歌实际上已经发布了他们所谓的异步跟踪

<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 后加载,因此您已经可以使用页面上的所有内容。

于 2010-02-12T06:51:16.173 回答
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 中存在一个错误,由于缺少协议(请参阅http://www.paulirish.com/2010/the-protocol-relative-url/),该错误将阻止 JS 加载,但您可以添加您正在使用的协议.
  • 较旧的浏览器无法理解“异步”属性,因此如果延迟(页面加载后)或仅在找到它时加载(因此不是异步),则会加载它。
于 2013-11-04T15:02:56.840 回答
-1

这只是一个猜测,但您是否考虑过 setTimeOut()?

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

setTimeOut() 具有转义调用堆栈的好功能,因此它可能会解决您的问题。

于 2008-12-30T03:01:12.100 回答
-2

我遇到过同样的问题。只需将这一行放在第一次加载 javascript 时,它就可以在 IE 上正常工作:

jQuery.noConflict();
于 2009-03-27T05:01:32.380 回答