3

据说javascript代码必须放在</body>标签之前。但在生成 Facebook Like 按钮后,我收到以下消息:

在您的页面上包含一次 JavaScript SDK,最好是在开始<body>标记之后。

这是我必须添加的代码:

<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=675640525783719";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
4

5 回答 5

3

你把它放在哪里并不重要,只要它在标签之前。</body>将其添加到页面顶部(<body>确保 SDK 已下载并且可用于页面,以防页面下方的任何 javascript 尝试FB直接访问该对象。

<div id="fb-root"></div>需要在标签放置的任何位置上方<script>...</script>,以便 SDK 可以找到该 div 以向其添加资源。

于 2013-07-10T12:50:54.953 回答
1

照他们说的做,把它放在开始<body>标签之后:

<html>
<body>
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=675640525783719";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

//rest of your code

</body>
</html>
于 2013-07-10T12:49:27.873 回答
1

我有点晚了,但我正在对这个话题进行一些搜索。

这一点脚本实际上是在异步下载另一个脚本(实际用于他们的 API 的脚本)并将其注入到页面中。

默认情况下,Web 浏览器(至少是旧浏览器)会在下载外部脚本时停止渲染并等待。这就是为什么经常建议将脚本放在正文末尾的原因。但是,通过异步加载脚本,它们不会阻止渲染。

现代浏览器支持async脚本标签:

<script src="http://example.com/script.js" async>

浏览器支持asynchttp ://caniuse.com/#search=async

我认为这是目前异步加载脚本的更好方法,但 Facebook 想要尽可能好的支持(IE9 及更低版本)。如果浏览器不支持async,那么该属性将被忽略,并且脚本应该可以正常加载,尽管是同步的。

我不确定的一部分,这就是我自己寻找答案的原因是:<head>如果你已经在异步加载脚本,为什么不把它放进去?为什么特别是开头的身体?我不知道。

于 2015-06-19T19:22:04.600 回答
0

在我的研究中,它应该在 body 标记之后,因为它尝试异步加载 iFrame 然后脚本。这是为了性能,因此它不会阻止您渲染的任何其他内容。

参考: https ://www.facebook.com/notes/facebook-engineering/under-the-hood-the-javascript-sdk-truly-asynchronous-loading/10151176218703920/

于 2017-01-10T21:14:49.957 回答
0

我有点晚了,但我正在对这个话题进行一些搜索。

这一点脚本实际上是在异步下载另一个脚本(实际用于他们的 API 的脚本)并将其注入到页面中。

默认情况下,Web 浏览器(至少是旧浏览器)会在下载外部脚本时停止渲染并等待。这就是为什么经常建议将脚本放在正文末尾的原因。但是,通过异步加载脚本,它们不会阻止渲染。

现代浏览器支持异步脚本标签:

于 2018-07-08T15:14:34.187 回答