2015-05-15 31 views
8

Stavo seguendo Facebook guidlines generali per includere pulsante Condividi (Social Plugin) https://developers.facebook.com/docs/plugins/share-buttonFacebook pulsante di condivisione non si carica con Rails turbolinks

_social.html.erb

<div id="fb-root"><div class="fb-share-button" data-href="http://www.example.com" data-layout="button_count"></div></div> 

fb_share.js

var fb_share; 
fb_share = function(d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3&appId=xxxxxxxxxxxxxxx"; 
    fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk'); 

$(document).ready(fb_share); 
$(document).on('page:load', fb_share) 

application.js

//= require jquery 
//= require jquery.turbolinks 
//= require jquery_ujs 
//= require turbolinks 
//= require_tree . 

Il pulsante esegue il rendering sulla prima pagina, funziona anche correttamente. Ma non viene visualizzato durante la navigazione alla pagina successiva e viceversa.

Se includo il file fb_share.js nel file application.js (prima dei turbolinks) non viene visualizzato.

risposta

3

L'SDK JS di Facebook passa attraverso il documento HTML una volta dopo l'inizializzazione, per cercare elementi da sostituire con i plug-in sociali di FB.

E cercando di incorporare nuovamente il JS SDK, come si sta cercando chiamando fb_share, è inutile - perché quel codice è scritto specificamente per non incorporare di nuovo, se è stato già incorporato.

Il corretto modo per ottenere l'SDK di analizzare nuovamente il documento per il contenuto aggiunto solo in seguito, è quello di chiamare FB.XFBML.parse.

4

Per Turbolinks 5, questa è l'unica cosa che ha funzionato per me: https://gist.github.com/6temes/52648dc6b3adbbf05da3942794b97a00

// FacebookSDK 
// https://developers.facebook.com/docs/plugins/page-plugin/ 
(function(d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); 
    js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8"; 
    fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk')); // Replace 'facebook-jssdk' with your page id. 

// Compatibility with Turbolinks 5 
(function($) { 
    var fbRoot; 

    function saveFacebookRoot() { 
    if ($('#fb-root').length) { 
     fbRoot = $('#fb-root').detach(); 
    } 
    }; 

    function restoreFacebookRoot() { 
    if (fbRoot != null) { 
     if ($('#fb-root').length) { 
     $('#fb-root').replaceWith(fbRoot); 
     } else { 
     $('body').append(fbRoot); 
     } 
    } 

    if (typeof FB !== "undefined" && FB !== null) { // Instance of FacebookSDK 
     FB.XFBML.parse(); 
    } 
    }; 

    document.addEventListener('turbolinks:request-start', saveFacebookRoot) 
    document.addEventListener('turbolinks:load', restoreFacebookRoot) 
}(jQuery)); 
+1

Ciò ha risolto il problema. +1 –

1

Per TurboLinks 5 questo ha funzionato per me!

È necessario aggiungere data-turbolinks-permanent all'elemento fb-root!

<div id="fb-root" data-turbolinks-permanent></div> 
<script> 
(function(d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/de_DE/sdk.js#xfbml=1&version=v2.9"; 
    fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk')); 

document.addEventListener("turbolinks:load", function() { 
    if(window.FB) { 
    FB.XFBML.parse(); 
    } 
}); 
</script> 
Problemi correlati