【问题标题】:Facebook share button not loading with Rails turbolinksFacebook 分享按钮未使用 Rails turbolinks 加载
【发布时间】:2015-05-15 10:24:08
【问题描述】:

我遵循 Facebook 的一般准则,包括分享按钮(社交插件) https://developers.facebook.com/docs/plugins/share-button

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

应用程序.js

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

该按钮在第一页加载时呈现,也可以正常工作。但是在导航到下一页并返回时不会呈现。

如果我在 application.js 文件中包含 fb_share.js 文件(在 turbolinks 之前),它根本不会显示。

【问题讨论】:

    标签: javascript ruby-on-rails facebook


    【解决方案1】:

    对于 Turbolinks 5,这是唯一对我有用的东西: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
    【解决方案2】:

    Facebook JS SDK 仅在初始化时一次遍历 HTML 文档,以查找要替换为 FB 社交插件的元素。

    并且尝试再次嵌入 JS SDK,就像您尝试调用 fb_share 一样,是没有用的 - 因为该代码是专门编写的,如果它已经嵌入,再次嵌入它.

    让 SDK 再次解析文档以获取稍后添加的内容的正确方法是调用 FB.XFBML.parse

    【讨论】:

      【解决方案3】:

      对于 TurboLinks 5,这对我有用!

      需要在fb-root元素中添加data-turbolinks-permanent

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

      【讨论】:

      • 谢谢!用data-turbolinks-permanent 注释fb-root 元素以使元素永久化,XFBMLParseEventListener 对我有用。这是一些关于“跨页面加载的持久化元素”github.com/turbolinks/… 的文档
      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多