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

Wildcards in a hosts file

I want to setup my local development machine so that any requests for *.local are redirected to localhost . The idea is that as I develop multiple sites, I can just add vhosts to Apache called site1.local , site2.local etc, and have them all resolve to localhost , while Apache serves a different site accordingly.