How to add a Facebook "Like" button to an AJAX driven page

50,233

Solution 1

SIMPLE SOLUTION

Just parse trigger the parse function when load complete.

If you’re using jQuery, there’s a real easy and slick solution to this problem:

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

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

Solution 2

This is the solution I ended up going with:

<!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>

Solution 3

You're making this hard on yourself - just render a new iframe-based one.

<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>

Solution 4

This is how I handled this situation when I ran into it - seems to work well.

// 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
}
Share:
50,233
nokturnal
Author by

nokturnal

Updated on July 05, 2022

Comments

  • nokturnal
    nokturnal almost 2 years

    I have trawled the net and Stack Overflow and have not found an adequate answer to this question. Before I start the trial and error process of finding my own solution, I thought I would turn to the Stack Overflow braintrust and see if there was already a successful implementation.

    I have an AJAX powered page that degrades properly for non-javascript browsers and SEO. Each click in the AJAX version can be represented by a unique URL.

    What I want to do is to dynamically change the HREF of the button. I do understand that this tag is converted to standard HTML at runtime (namely into a nasty table / iframe layout).

    I was just wondering if anyone had any insight as to how to implement this FB like button onto AJAX powered pages?

    Cheers in advance :)

    EDIT:

    What do you think of this method I just hacked together? See any huge problems with it?

    <!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>
    
  • Johnny Oshika
    Johnny Oshika almost 13 years
    Thanks for this solution. For the most part, it works well, but it does seem to cause memory leak issues in Firefox (tested only in version 3.6 so far). Do this dozens of times and you'll see the memory footprint of Firefox skyrocket and it doesn't come back down. Chrome is pretty good. I also saw some memory leak with IE8, but not nearly as bad as Firefox.
  • Ric
    Ric almost 13 years
    You can improve your selectors by getting rid of the tag from them. For example a#ChangeToGoogle should be just #ChangeToGoogle as ID's a unique. There is no need to look up all the a tags first, the same with the divs.
  • nokturnal
    nokturnal over 12 years
    @JohnnyO: I have since moved off this issue, but will definitely look at the memory leaks soon.
  • Robusto
    Robusto about 12 years
    @JohnnyO: The memory footprint of FF 3.6 skyrockets no matter what you do.
  • Jonathan Vanasco
    Jonathan Vanasco over 11 years
    Adding an iFrame works, but the iframe button from Facebook is pretty buggy. The best options are to place the HTML5 , followed by the XFBML.
  • Bernoulli IT
    Bernoulli IT about 9 years
    Still working great. Initialize the share button (in my situation) after a partial page update with AJAx! Great!
  • BotanMan
    BotanMan over 8 years
    It's possible to specify the container for widgets initialization: FB.XFBML.parse(document.getElementById("containerId"));
  • devOp
    devOp about 5 years
    Great solution!