【问题标题】:Javascript: My fbAsyncInit() method never gets calledJavascript:我的 fbAsyncInit() 方法永远不会被调用
【发布时间】:2018-01-28 17:32:06
【问题描述】:

我正在从 Facebook 的开发者网站上的 this page 复制代码,并且 fbAsyncInit() 方法永远不会触发。我还阅读了this page,我已经以多种不同的方式调整了代码,但我无法触发该方法。你的意见?

另外,值得一提的是,当我尝试运行此代码和 Chrome(在 Mac 上)并运行 Firebug lite 时,我收到一条错误消息,提示“无法在此页面中加载 Firebug Lite”

这是代码...

<html>
<head>
</head>
<body>
<div id="fb-root"></div>
<script type="text/javascript">
  window.fbAsyncInit = function() {
    FB.init({
      appId      : '1234567890', // App ID
      channelUrl : '//localhost/test.html', // Channel File
      status     : true, // check login status
      cookie     : true, // enable cookies to allow the server to access the session
      xfbml      : true  // parse XFBML
    });

    alert("this statement never gets called either");
  };

  // Load the SDK Asynchronously
  (function(d){
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all.js";
     d.getElementsByTagName('head')[0].appendChild(js);
   }(document));
</script>
</script>
</body>
</html>

【问题讨论】:

  • 你的文件叫 test.html 吗?
  • 是的,有问题吗?
  • 有没有js错误?
  • 你在什么浏览器中测试它?尝试更改一些不存在的 src,然后检查浏览器中的错误日志。

标签: javascript facebook fbconnect fbjs


【解决方案1】:

我遇到了同样的问题。在异步加载之前,我似乎在其他地方加载了 JavaScript 库 //connect.facebook.net/en_US/all.js

这可能有点混淆了。

我删除了过早加载标签定义,现在我很好。

【讨论】:

  • 这是解决问题的办法!
  • 我刚刚摆脱了FB.init 周围的window.fbAsyncInit 回调,它对我有用。不知道为什么,但每次都有效。任何其他解决方案仅在部分时间有效。
【解决方案2】:

你应该改变:

 js.src = "//connect.facebook.net/en_US/all.js";

到:

 js.src = "http://connect.facebook.net/en_US/all.js";

【讨论】:

  • wtf??不知道我怎么会想出这一点
  • 不好,如果您从 HTTPS 加载,这会破坏您的应用程序。如果您必须强制使用任何协议,请确保使用 HTTPS。
  • 最好不要关闭协议,否则就像@maskedbacon说的那样,使用https
  • 这也为我修复了它。有趣的是,在添加协议并重新加载页面后,控制台(firefox)中出现了一堆看起来像 facebook 初始化消息。我刚刚创建了它所引用的 FB 应用程序。
  • 为我工作,只是将http 更改为https
【解决方案3】:

同步加载有问题吗?

    <script src="//connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({
    appId      : 'YOUR_APP_ID',
    channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File
    status     : true, // check login status
    cookie     : true, // enable cookies to allow the server to access the session
    xfbml      : true  // parse XFBML
  });
</script>

【讨论】:

  • 是的,当我调整代码看起来像您的同步代码时,警报方法仍然不会触发。是什么赋予了?只有当我删除 FB.init() 方法时才会触发警报方法
  • 我不知道...这家伙正在异步加载,它似乎对他有用:facebook.stackoverflow.com/questions/2855784/… 顶部的代码有效,如果你阅读了答案,他只是为了放入正确的appid
  • @BeachRunnerJoe 看起来他正在将下面的脚本附加到 fb-root div,而不是头部。
  • @MikeyG 这个脚本是来自 Facebook developers.facebook.com/docs/reference/javascript的示例
  • 谢谢,Mikey G,我玩弄了 AppID。我仍然不明白为什么没有调用警报语句。即使 init 方法因为 appID 不正确而失败,但似乎仍然应该调用 alert 方法,不是吗?
【解决方案4】:

这个答案可能为时已晚,在许多情况下无济于事,但是,我发现我的 Firefox 浏览器在经过一些体面的工作后显然有点疯狂并导致了那个确切的错误......只需重新启动该死的东西

【讨论】:

  • 好的,我刚刚找到了问题的确切来源,我使用 FF 进行开发,并且不时使用 Scratchpad (Tools->Web Developer->Scratchpad)....出于某种原因即使我只是在那里做一个简单的 alert() 也会导致这个问题......希望它对某人有所帮助
  • OK 忽略上面的“即使”,当从 Scratchpad 发出 alert() 时会导致问题
  • 哇!我现在非常讨厌铬!!!!!!!!!!!!!!!卧槽!!!!谢谢!!!!
【解决方案5】:

由于您的文件都称为 test.html 并且 channelUrl 应该是 test.html,因此您正在创建一个循环引用。对于正确的 channelUrl,它应该只包含一行

&lt;script src="//connect.facebook.net/en_US/all.js"&gt;&lt;/script&gt;

http://developers.facebook.com/docs/reference/javascript/

频道文件解决了跨域通信的一些问题 在某些浏览器中。 channel.html 文件的内容可以只是 一行:

&lt;script src="//connect.facebook.net/en_US/all.js"&gt;&lt;/script&gt;

频道文件的缓存时间很重要 可能的。提供此文件时,您必须发送有效的 Expires 标头 具有较长的有效期。这将确保通道文件是 由浏览器缓存,这对于流畅的用户体验很重要。 如果没有适当的缓存,跨域通信会变得非常 速度慢,用户体验会严重下降。一个简单的 在 PHP 中执行此操作的方法是:

 <?php  $cache_expire = 60*60*24*365;  header("Pragma: public");  header("Cache-Control: max-age=".$cache_expire);  header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$cache_expire) . ' GMT');  ?>  <script src="//connect.facebook.net/en_US/all.js"></script>

channelUrl 参数是可选的,但建议使用。提供一个 通道文件可以帮助解决三个特定的已知问题。第一的, 包含跨框架通信的代码的页面可能会导致社交 没有 channelUrl 的插件显示为空白。二、如果没有 提供了 channelUrl 并且页面包含自动播放音频或 视频,用户可能会听到两个音频流,因为页面有 在后台为跨域加载了第二次 沟通。第三,频道文件将防止包含额外的 命中您的服务器端日志。如果不指定 channelUrl,则 可以删除包含 fb_xd_bust 或 fb_xd_fragment 的页面浏览量 日志中的参数以确保正确计数。

channelUrl 必须是与页面匹配的完全限定 URL 其中包括 SDK。也就是说,通道文件域 如果您的网站使用 www 提供服务,并且如果您修改 document.domain 在您的页面上,您必须制作相同的 document.domain 更改 channel.html 文件。协议还必须 匹配。如果您的页面通过 https 提供,您的 channelUrl 也必须是 HTTPS。请记住将脚本 src 的匹配协议用作 出色地。上面的示例代码使用了与协议相关的 URL,它们应该 正确处理大多数 https 情况。

【讨论】:

  • 谢谢,DMCS,我删除了可选的 channelUrl 参数,这个方法仍然不会触发。你的想法?
  • 尝试删除两个结尾的 &lt;/script&gt; 标记之一作为额外标记,这可能会导致您的浏览器不喜欢它。
  • 是的,我解决了这个问题,但没有帮助
  • 您确定,您拥有的唯一 html 就是您发布的内容吗?您的浏览器是否关闭了 javascript?
【解决方案6】:

请更改您的应用 ID 然后开始工作

  <script>
  window.fbAsyncInit = function() {
    FB.init({
      appId            : 'your-app-id',
      autoLogAppEvents : true,
      xfbml            : true,
      version          : 'v2.11'
    });
  };

  (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 = "https://connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多