Skip to main content

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


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



Specifically, I have an AJAX powered page that degrades properly for non-javascript browsers + 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>


Source: Tips4allCCNA FINAL EXAM

Comments

  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/

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

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

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

    ReplyDelete
  5. Load it after the window loads, this is what works for me:

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

    ReplyDelete
  6. create like button

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

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?