Rails Turbolinks 中的 Facebook 插件页面无法加载
Facebook plugin page in Rails Turbolinks doesn't load
在我的 Rails 应用程序中,我正在加载 Facebook 插件页面,但由于 turbolinks,它不会加载每个页面(只是有时)。我试过 this script on this page ,但现在它永远不会加载。我做了什么?
我用这个脚本创建了 facebook.coffee:
$ ->
loadFacebookSDK()
bindFacebookEvents() unless window.fbEventsBound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB?.XFBML.parse()
)
@fbEventsBound = true
saveFacebookRoot = ->
if $('#fb-root').length
@fbRoot = $('#fb-root').detach()
restoreFacebookRoot = ->
if @fbRoot?
if $('#fb-root').length
$('#fb-root').replaceWith @fbRoot
else
$('body').append @fbRoot
loadFacebookSDK = ->
window.fbAsyncInit = initializeFacebookSDK
$.getScript("//connect.facebook.net/cs_CZ/sdk.js#xfbml=1&version=v2.6")
initializeFacebookSDK = ->
FB.init
appId : 'YOUR_APP_ID'
status : true
cookie : true
xfbml : true
然后在我的 application.js 中我只需要它。
鉴于我有这段代码:
<div id="fb-root"></div>
<div class="fb-page" data-href="https://www.facebook.com/mypage/" data-tabs="timeline" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/mypage/"><a href="https://www.facebook.com/mypage/">MyPage</a></blockquote></div></div>
Facebook 插件页面未加载。你不知道为什么吗?我正在查看 appId,但在插件页面中没有包含它。
这对我有用...Facebook 的文档和您链接的页面上的脚本之间的某种组合
$ ->
loadFacebookSDK()
bindFacebookEvents() unless window.fbEventsBound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB.XFBML.parse()
)
@fbEventsBound = true
saveFacebookRoot = ->
if $('#fb-root').length
@fbRoot = $('#fb-root').detach()
restoreFacebookRoot = ->
if @fbRoot?
if $('#fb-root').length
$('#fb-root').replaceWith @fbRoot
else
$('body').append @fbRoot
loadFacebookSDK = ->
((d, s, id) ->
js = d.getElementsByTagName(s)[0]
fjs = d.getElementsByTagName(s)[0]
return if d.getElementById(id)
js = d.createElement(s)
js.id = id
js.src = "https://connect.facebook.net/es_LA/sdk.js#xfbml=1&version=v2.5"
fjs.parentNode.insertBefore(js, fjs)
)(document, 'script', 'facebook-jssdk')
initializeFacebookSDK = ->
FB.init
# appId : 'YOUR_APP_ID'
status : true
cookie : true
xfbml : true
区别在于loadFacebookSDK函数。请注意,正如我在问题中评论的那样, $.getScript() 删除了请求的 query/parameters 部分。
对于发现此问题的任何其他人,我找到了解决问题的要点: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));
在turbolink 5中,你只需要在容器中添加data-turbolinks-permanent
https://github.com/turbolinks/turbolinks#issuecomment-282997683
<div data-turbolinks-permanent id="fb-root"></div>
在我的 Rails 应用程序中,我正在加载 Facebook 插件页面,但由于 turbolinks,它不会加载每个页面(只是有时)。我试过 this script on this page ,但现在它永远不会加载。我做了什么?
我用这个脚本创建了 facebook.coffee:
$ ->
loadFacebookSDK()
bindFacebookEvents() unless window.fbEventsBound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB?.XFBML.parse()
)
@fbEventsBound = true
saveFacebookRoot = ->
if $('#fb-root').length
@fbRoot = $('#fb-root').detach()
restoreFacebookRoot = ->
if @fbRoot?
if $('#fb-root').length
$('#fb-root').replaceWith @fbRoot
else
$('body').append @fbRoot
loadFacebookSDK = ->
window.fbAsyncInit = initializeFacebookSDK
$.getScript("//connect.facebook.net/cs_CZ/sdk.js#xfbml=1&version=v2.6")
initializeFacebookSDK = ->
FB.init
appId : 'YOUR_APP_ID'
status : true
cookie : true
xfbml : true
然后在我的 application.js 中我只需要它。
鉴于我有这段代码:
<div id="fb-root"></div>
<div class="fb-page" data-href="https://www.facebook.com/mypage/" data-tabs="timeline" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/mypage/"><a href="https://www.facebook.com/mypage/">MyPage</a></blockquote></div></div>
Facebook 插件页面未加载。你不知道为什么吗?我正在查看 appId,但在插件页面中没有包含它。
这对我有用...Facebook 的文档和您链接的页面上的脚本之间的某种组合
$ ->
loadFacebookSDK()
bindFacebookEvents() unless window.fbEventsBound
bindFacebookEvents = ->
$(document)
.on('page:fetch', saveFacebookRoot)
.on('page:change', restoreFacebookRoot)
.on('page:load', ->
FB.XFBML.parse()
)
@fbEventsBound = true
saveFacebookRoot = ->
if $('#fb-root').length
@fbRoot = $('#fb-root').detach()
restoreFacebookRoot = ->
if @fbRoot?
if $('#fb-root').length
$('#fb-root').replaceWith @fbRoot
else
$('body').append @fbRoot
loadFacebookSDK = ->
((d, s, id) ->
js = d.getElementsByTagName(s)[0]
fjs = d.getElementsByTagName(s)[0]
return if d.getElementById(id)
js = d.createElement(s)
js.id = id
js.src = "https://connect.facebook.net/es_LA/sdk.js#xfbml=1&version=v2.5"
fjs.parentNode.insertBefore(js, fjs)
)(document, 'script', 'facebook-jssdk')
initializeFacebookSDK = ->
FB.init
# appId : 'YOUR_APP_ID'
status : true
cookie : true
xfbml : true
区别在于loadFacebookSDK函数。请注意,正如我在问题中评论的那样, $.getScript() 删除了请求的 query/parameters 部分。
对于发现此问题的任何其他人,我找到了解决问题的要点: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));
在turbolink 5中,你只需要在容器中添加data-turbolinks-permanent https://github.com/turbolinks/turbolinks#issuecomment-282997683
<div data-turbolinks-permanent id="fb-root"></div>