如何在AJAX驱动页面上添加Facebook“赞”按钮


67

我已经拖网和堆栈溢出,但找不到这个问题的适当答案。在开始尝试寻找自己的解决方案的尝试和错误过程之前,我认为我应该转向Stack Overflow机构,以查看是否已经成功实现。

我有一个AJAX驱动的页面,对于非JavaScript浏览器和SEO,该页面可以正常降级。AJAX版本中的每次点击都可以由唯一的URL表示。

我想做的是动态更改按钮的HREF。我确实知道该标记会在运行时转换为标准HTML(即转换为讨厌的表格/ iframe布局)。

我只是想知道是否有人对如何在AJAX驱动的页面上实现类似FB的按钮有任何见解?

提前加油:)

编辑:

您如何看待我刚刚一起尝试过的这种方法?看到有什么大问题吗?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="JS/jquery/jquery.js" type="text/javascript"></script>
    <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>

    <script language="javascript" type="text/javascript">
        $("document").ready
        (
            function ()
            {
                CreateNewLikeButton("http://www.yahoo.com")

                $("a#ChangeToGoogle").click
                (
                    function (e)
                    {
                        e.preventDefault();
                        CreateNewLikeButton("http://www.google.ca")
                    }
                );

            }
        );

        function CreateNewLikeButton(url)
        {
            var elem = $(document.createElement("fb:like"));
            elem.attr("href", url);
            $("div#Container").empty().append(elem);
            FB.XFBML.parse($("div#Container").get(0));
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <a id="ChangeToGoogle" href="#">Change To Google</a>
    <div id="Container">
        <fb:like href="http://www.NEVER_LINK_TO_THIS_12345.com"></fb:like>
    </div>
    </form>
</body>

</html>

您是说您正在使用XFBML版本的like按钮吗?为什么不只使用iframe?
彼得·贝利

必须解析它的DOM来动态更改按钮的HREF似乎很麻烦。我只是想看看是否有一种使用XFBML进行更改的方法。
nokturnal

您的解决方案对我有很大帮助,谢谢!
杰夫·戴维斯

仅供参考,这也适用于html5 facebook按钮(其中的div具有ID /类)
Jonathan Vanasco 2012年

Answers:


135

简单的解决方案

加载完成后,只需进行解析即可触发解析功能。

如果您使用的是jQuery,则有一个解决此问题的简便易行的解决方案:

$(document).ajaxComplete(function(){
    try{
        FB.XFBML.parse(); 
    }catch(ex){}
});

http://developers.facebook.com/docs/reference/plugins/like/


1
仍然很棒。在使用AJAx进行部分页面更新后,初始化共享按钮(以我的情况)!大!
Bernoulli IT

1
可以为小部件初始化指定容器:FB.XFBML.parse(document.getElementById(“ containerId”));
BotanMan

1
很好的解决方案!
devOp

23

这是我最终选择的解决方案:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="JS/jquery/jquery.js" type="text/javascript"></script>
    <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>

    <script language="javascript" type="text/javascript">
        $("document").ready
        (
            function ()
            {
                CreateNewLikeButton("http://www.yahoo.com")

                $("#ChangeToGoogle").click
                (
                    function (e)
                    {
                        e.preventDefault();
                        CreateNewLikeButton("http://www.google.ca")
                    }
                );

            }
        );

        function CreateNewLikeButton(url)
        {
            var elem = $(document.createElement("fb:like"));
            elem.attr("href", url);
            $("#Container").empty().append(elem);
            FB.XFBML.parse($("#Container").get(0));
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <a id="ChangeToGoogle" href="#">Change To Google</a>
    <div id="Container">
        <fb:like href="http://www.NEVER_LINK_TO_THIS_12345.com"></fb:like>
    </div>
    </form>
</body>

</html>

1
感谢您的解决方案。在大多数情况下,它运行良好,但似乎确实会导致Firefox中的内存泄漏问题(到目前为止仅在3.6版中进行了测试)。这样做数十次,您将看到Firefox的内存占用量飞速增长,并且没有下降。Chrome相当不错。我也看到了IE8的一些内存泄漏,但还不及Firefox差。
约翰尼·奥希卡

2
您可以通过摆脱选择器的标签来改进选择器。例如,由于ID是唯一的,因此#ChangeToGoogle应该只是#ChangeToGoogle。无需先查找所有a标签,与div相同。
Ric

@JohnnyO:我已经解决了这个问题,但是肯定会很快查看内存泄漏。
nokturnal 2011年

1
@JohnnyO:无论您做什么,FF 3.6火箭的内存占用量都是如此。
Robusto '02

2

您正在为此加倍努力-只需渲染一个基于iframe的新图片即可。

<html>
<head>
  <title>Test Page</title>

  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript">  

  $(function()
  {
    $( '#ChangeToGoogle' ).click( function( event )
    {
      event.preventDefault();

      $( '#Container' ).empty().append( $('<iframe />')
        .attr( 'src', 'http://www.facebook.com/plugins/like.php?href=www.google.com&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80' )
        .attr( 'scrolling', 'no' )
        .attr( 'frameborder', 'no' )
        .attr( 'style', 'border:none; overflow:hidden; width:450px; height:80px;' )
        .attr( 'allowTransparency', 'true' )        
      );            
    });
  });

  </script>
</head>

<body>
    <form id="form1" runat="server">
    <a id="ChangeToGoogle" href="#">Change To Google</a>
    <div id="Container">
      <iframe src="http://www.facebook.com/plugins/like.php?href=www.yahoo.com&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80"
        scrolling="no" frameborder="0"
        style="border:none; overflow:hidden; width:450px; height:80px;"
        allowTransparency="true">
      </iframe>
    </div>
    </form>
</body>


添加iFrame是可以的,但是Facebook上的iframe按钮存在很多问题。最好的选择是放置HTML5,然后放置XFBML。
乔纳森·瓦纳斯科

2

这是我遇到这种情况时的处理方式-似乎运作良好。

// Set Facebook Like Button with jQuery
setFBLikeButtons = function (container,url,send,layout,width,show_faces,font) {
  // Set Default Args
  if(!send) { send = "false"; }
  if(!layout) { layout = "button_count"; }
  if(!width) { width = "100"; }
  if(!show_faces) { show_faces = "false"; }
  if(!font) { font = "arial"; }

  $(container).empty(); // Remove current like button
  $(container).html('<fb:like href="'+url+'" send="'+send+'" 
       layout="'+layout+'" width="'+width+'" show_faces="'+show_faces+'" 
       font="'+font+'"></fb:like>');
  FB.XFBML.parse(); // This is the magical syrup
}

0

创建类似按钮

<head>
<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
<script>
window.onload = function(){
var divs = document.getElementsByTagName("span");
for(var i=0; i<divs.length i++){
if(divs[i].className == "likes"){
if(divs[i].title){ var Href = divs[i].title; }else{ var Href = window.location; }
var fb_like = document.createElement("fb:like");
fb_like.setAttribute("href", Href);
fb_like.setAttribute("layout", "box_count");
fb_like.setAttribute("show_faces", "false");
fb_like.setAttribute("width", "55");
document.getElementById("likes2").appendChild(fb_like);
}
}
}
</script>
</head>
<body>
<span class="likes" title="www.bzzs.me"></span>
</body>

0

在窗口加载后加载它,这对我有用:

$(window).load(function(){
     $.getScript('http://connect.facebook.net/en_US/all.js', function() {
          try{
                FB.XFBML.parse();
            } catch(ex) {}
      });
});

0

如果您使用的是jQuery Mobile框架,则pagecontainershow当jQuery Mobile在显示新页面时使用该事件时,可以运行与接受的答案相同的代码。

// initialize new pages
$(document).on("pagecontainershow", (e, ui) =>
{
    try
    {
        FB.XFBML.parse();
    } catch (ex) { }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.