Javascript 如何延迟加载外部JS文件(Google Analytics)?

Javascript 如何延迟加载外部JS文件(Google Analytics)?,javascript,html,blocking,Javascript,Html,Blocking,我正在使用以下代码加载我的Google Analytics(外部javascript),其方式是而不是阻止渲染 然而,同时使用YSlow和Safari Web Inspector,网络流量清楚地表明ga.js脚本仍在阻止渲染 /* http://lyncd.com/2009/03/better-google-analytics-javascript/ Inserts GA using DOM insertion of <script> tag and "script onload"

我正在使用以下代码加载我的Google Analytics(外部javascript),其方式是而不是阻止渲染

然而,同时使用YSlow和Safari Web Inspector,网络流量清楚地表明ga.js脚本仍在阻止渲染

/*
http://lyncd.com/2009/03/better-google-analytics-javascript/
Inserts GA using DOM insertion of <script> tag and "script onload" method to
initialize the pageTracker object. Prevents GA insertion from blocking I/O!

As suggested in Steve Souder's talk. See:
http://google-code-updates.blogspot.com/2009/03/steve-souders-lifes-too-short-write.html
*/

/* acct is GA account number, i.e. "UA-5555555-1" */
function gaSSDSLoad (acct) {
  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."),
      pageTracker,
      s;
  s = document.createElement('script');
  s.src = gaJsHost + 'google-analytics.com/ga.js';
  s.type = 'text/javascript';
  s.onloadDone = false;
  function init () {
    pageTracker = _gat._getTracker(acct);
    pageTracker._trackPageview();
  }
  s.onload = function () {
    s.onloadDone = true;
    init();
  };
  s.onreadystatechange = function() {
    if (('loaded' === s.readyState || 'complete' === s.readyState) && !s.onloadDone) {
      s.onloadDone = true;
      init();
    }
  };
  document.getElementsByTagName('head')[0].appendChild(s);
}

/* and run it */
gaSSDSLoad("UA-5555555-1");
/*
http://lyncd.com/2009/03/better-google-analytics-javascript/
使用DOM插入标记和“脚本onload”方法将GA插入到
初始化pageTracker对象。防止GA插入阻塞I/O!
正如史蒂夫·苏德在演讲中所说的那样。见:
http://google-code-updates.blogspot.com/2009/03/steve-souders-lifes-too-short-write.html
*/
/*账户为GA账号,即“UA-555-1”*/
功能气体负载(acct){
var gaJsHost=((“https:==document.location.protocol)?”https://ssl." : "http://www."),
寻呼机,
s
s=document.createElement('script');
s、 src=gaJsHost+'google analytics.com/ga.js';
s、 类型='text/javascript';
s、 onloadDone=false;
函数init(){
页面跟踪器=_gat._getTracker(acct);
页面跟踪器。_trackPageview();
}
s、 onload=函数(){
s、 onloadDone=true;
init();
};
s、 onreadystatechange=函数(){
如果(('loaded'==s.readyState | |'complete'==s.readyState)&&&!s.onloadDone){
s、 onloadDone=true;
init();
}
};
document.getElementsByTagName('head')[0]。appendChild;
}
/*然后运行它*/
气体负荷(“UA-555-1”);
有没有关于如何使用JavaScript延迟加载ga.js文件的想法,因为上面的代码似乎并没有按照它的意图执行,直到整个页面都呈现出来,这样我才阻止呈现

/* and run it */
gaSSDSLoad("UA-5555555-1");

在页面完成渲染之前不要“运行它”。也就是说:装载或其他更远的地方。不要在内联脚本块本身中包含上述行,否则您将一无所获。

您可以向窗口、文档或正文的onload事件添加一个侦听器,并在此时执行gassdload函数。

如果使用jQuery,您可以在其中包含run it部分(与body onload()事件相同):

如果这还不够好,请稍后运行它(例如…):


不过这应该不是必需的…

您从Google Analytics获得的代码已经是非阻塞的了。 应该是这样的:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-5555555-1']);
  _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';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

var _gaq=_gaq | |[];
_gaq.push([''设置帐户','UA-555-1']);
_gaq.push([''u trackPageview']);
(功能(){
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';
var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ga,s);
})();
谷歌建议在结束标记之前加入它。 一般来说,如果您想异步加载其他Java脚本,我建议您使用以下加载程序:


gaSSDSLoad(“UA-555-1”)是我的HTML的最后一行。我不明白,我应该做什么不同的事情?在页面完成渲染之前,我如何不“运行它”?将“gassdload(“UA-555-1”);”在你的body onload中,而不是内联脚本中。我该怎么做?它是否类似于:window.onload=function(){gaSSDSLoad(“UA-3631080-1”);}@mp:使用“加载”事件:window.addEventListener(“加载”,function(){/*并运行它*/gassload(“UA-55555-1”);},false);我该怎么做?它是否类似于:window.onload=function(){gaSSDSLoad(“UA-3631080-1”);}?如果它像我描述的那样使用window.onload-这仍然会阻止渲染,正如yslow所看到的那样,“$(window.load(function(){”使用标准JavaScript(无框架)的等价物是什么?@mp\ux:查看我的评论关于bobince的答案。我不熟悉这里讨论的方法,但是很久以前,在jQuery等之前。你只是把它放在你的body标签中:顺便说一下,bobince的答案下面讨论的方法看起来更好,最好避免内联脚本。
$(window).load(function() {
    setTimeout("run_it()", 1000);
});

function run_it() {
    /* and run it */
    gaSSDSLoad("UA-5555555-1");
}
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-5555555-1']);
  _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';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>