facebook javascript sdk fb_xd_fragment?

23

我正在使用Facebook JavaScript SDK在我的页面中嵌入“赞”按钮。

什么是fb_xd_fragment? 我发现它会附加到我的网址末尾,例如 http://www.example.com/controller/?fb_xd_fragment,这导致页面出现一些不良的递归重新加载问题。


1
我遇到了相同的问题,服务器会收到两个请求 - 一个是标准URI,另一个是URI?fb_xd_fragment。然而,这似乎只发生在IE中 - 更具体地说是IE7。你有没有找到更多相关信息?FB上只有这些:http://forum.developers.facebook.com/viewtopic.php?pid=232516和一个已经开启的bug:http://bugs.developers.facebook.com/show_bug.cgi?id=9777。 - Miro Solanka
1
是的,非常针对IE7,我使用了Iframe版本,希望有人能修复那个bug。 - James Lin
9个回答

23
经过多周的尝试,看起来需要一个自定义通道URL,正如这里提到的那样: http://developers.facebook.com/docs/reference/javascript/FB.init 我所做的就是创建包含此单行内容的< strong > channel.html 文件:
<script src="http://connect.facebook.net/en_US/all.js"></script>

然后我添加了 channelUrl: 行,最终结果如下:

<div id="fb-root"></div> <script>  
 window.fbAsyncInit = function() {
     FB.init({
       appId  : 'MY APP ID',
       status : true, // check login status
       cookie : true, // enable cookies to allow the server to access the session
       xfbml  : true,  // parse XFBML
      channelUrl  : 'http://www.example.com/channel.html' // custom channel
     });   }; 

   (function() {
     var e = document.createElement('script');
     e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
     e.async = true;
     document.getElementById('fb-root').appendChild(e);
 }());</script>

如果 xfbml : true 是您的最后一行,请确保在其后添加逗号。我不熟悉JavaScript,所以不知道我是否充分利用了它,但我知道它可以防止 fb_xd_fragment 问题,并允许在IE中使用FB评论。就我所知,这是在线上唯一可用的解决方案。欢迎进一步调整。


你在 channelURL 中输入的最终 URL 是什么?我们在这里尝试了一下,在我们的服务器上使用自定义 HTML 页面,它试图创建一个“Facebook 页面”,真的很奇怪。 - Allov
我不得不像Ferran一样添加xmlns:fb="facebook.com/2008/fbml",否则它会不断轮询。这是最后一个修复它的关键部分 :) - Designer023

3
通过使用嵌入式iframe实现类似的按钮解决问题。

1

我在脚本中使用的方法来定义channelUrl到我的网站页面,但我仍然得到多个返回到该页面的请求。

通过观察WireShark捕获的流量,我发现Facebook在某些内部调用中使用了channelUrl,并且传递了fb_xd_fragment参数-我改为使用该URL作为channelUrl,并将其重定向到离开我的网站。

我在我的网站上使用多个Like按钮,使用fbml而不是框架,在IE7上,我不再收到来自Facebook的带有fb_xd_fragment参数的请求。

不确定这是否是最佳实践,但它似乎可以工作。

我将此值设置为channelUrl:

'http://static.ak.fbcdn.net/connect/xd_proxy.php'

希望这能有所帮助。

1

1

你好,我能直接放置 channelUrl: http://connect.facebook.net/en_US/all.js 吗?还需要其他的HTML文件吗? - Leon

1

0
渠道hack对我不起作用。 因此,我在PHP文件中添加了一些代码,在所有其他内容之上进行301重定向,以便将URL重定向到没有fb_xd_fragment附加的位置:
$url = "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

if (isset($_GET['fb_xd_fragment'])) {
$url = str_replace("?fb_xd_fragment=","",$url);
header( "HTTP/1.1 301 Moved Permanently" ); 
header("Location: {$url}");
exit();
}

0

经过几天的研究和尝试互联网上的所有解决方案,最终我想出了这个组合:

更改您页面的头部:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://opengraphprotocol.org/schema/"  xmlns:fb="http://www.facebook.com/2008/fbml" lang="en-US">

这里是代码,将它放在你想要的地方,就像“喜欢”按钮一样:

<div class="yourclass" style="z-index: 10;">
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js" ></script>
<script>FB.init({appId: '1234yourappidhere', status: true, cookie: true, xfbml: true});</script>
<fb:like href="http..yourencodedurlswillputhere" layout="button_count" width="150" action="recommend" colorscheme="light"></fb:like></div>
<script> document.getElementsByTagName('html')[0].style.display='block';</script>

感谢支持:http://www.xaluan.com


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接