Диалог запроса приложения Facebook не запускается после загрузки Ajax (Rails Turbolinks)

Я не могу понять, как заставить javascript Facebook загружаться после события click, которое запускает запрос Ajax с Turbolinks.

У меня есть остальная часть моего Javascript для работы, но этого просто не происходит.

Я использовал всевозможные варианты этого кода: https://developers.facebook.com/docs/reference/dialogs/requests/

Я попытался реализовать все упомянутое здесь: https://github.com/rails/turbolinks/issues/ 25

Я попытался сделать то же самое, что заставило работать всю остальную часть JS, а именно вызвать вызов page:load с помощью Turbolinks.

Ничего не работает.


person spitfire109    schedule 19.04.2013    source источник
comment
Получаете ли вы какие-либо ошибки в консоли JavaScript при загрузке страницы и переходе по ссылке?   -  person Benjamin Manns    schedule 19.04.2013
comment
Это зависит от того, какое решение я выберу, но если я использую готовый метод, я получаю следующее: Uncaught [object Object] all.js:38 i all.js:38 m.isTruthy all.js:38 r all.js:74 q.showLoader all.js:91 ca.iframe all.js:95 или all.js:96 (анонимная функция) all.js:80 (анонимная функция) all.js:77 sendRequestViaMultiFriendSelector 1:21 onclick   -  person spitfire109    schedule 19.04.2013


Ответы (1)


Я также обнаружил, что мои диалоги Facebook перестали открываться после загрузки Ajax, но это не имело никакого отношения к Facebook. С Turbolinks вы должны привязать обработчики кликов к событию page:load (или, возможно, использовать делегирование события к элементу body), иначе они потеряются. См. Railscast на Turbolinks, а также "События смены страницы".

Пример:

projects.js.coffee.erb

ready = ->
  $('a').click (event) ->
    alert('do something facebooky')
    event.preventDefault()

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

В моем случае мне также пришлось изменить способ загрузки Facebook. См. эту проблему и соответствующее решение. Вот мой код из моего приложения на основе холста.

application.html.erb

<!-- I used no other facebook code -->
<div id="fb-root"></div>

facebook.js.coffee.erb

#
# Get Facebook working with Turbo Links
# see: http://reed.github.io/turbolinks-compatibility/facebook.html
#

fb_root = null
fb_events_bound = false

$ ->
  loadFacebookSDK()
  bindFacebookEvents() unless fb_events_bound

bindFacebookEvents = ->
  $(document)
    .on('page:fetch', saveFacebookRoot)
    .on('page:change', restoreFacebookRoot)
    .on('page:load', ->
      FB?.XFBML.parse()
    )
  fb_events_bound = true

saveFacebookRoot = ->
  fb_root = $('#fb-root').detach()

restoreFacebookRoot = ->
  if $('#fb-root').length > 0
    $('#fb-root').replaceWith fb_root
  else
    $('body').append fb_root

loadFacebookSDK = ->
  window.fbAsyncInit = initializeFacebookSDK
  $.getScript("//connect.facebook.net/en_US/all.js#xfbml=1")

initializeFacebookSDK = ->
  FB.init
    appId     : "<%= ENV['FACEBOOK_APP_ID'] %>"
    channelUrl: "//" + window.location.host + "/channel.html"
    status    : true
    cookie    : true
    xfbml     : true
    frictionlessRequests  : true

  # Listen to the auth.login which will be called when the user logs in
  # using the Login button
  FB.Event.subscribe 'auth.login', (response) ->
    # We want to reload the page now so Ruby can read the cookie that the
    # Javascript SDK sat. But we don't want to use
    # window.location.reload() because if this is in a canvas there was a
    # post made to this page and a reload will trigger a message to the
    # user asking if they want to send data again.
    window.location = window.location


  FB.Canvas.setAutoGrow()
person manafire    schedule 29.05.2013