Как закрыть диалог SDK facebook, открытый с помощью FB.ui ()? - PullRequest
8 голосов
/ 10 января 2011

Я успешно отображаю диалоговое окно приглашения друга (код показан ниже).Когда пользователь нажимает кнопку пропуска, в окне / окне отображается новая страница.Однако с этого момента я не могу найти способ закрыть iframe / диалог.FB.ui не возвращает никаких объектов, кажется, что нет метода Javascript SDK, и обход и манипулирование с DOM будут хрупкими при любых изменениях кода FB.

Есть идеи?

function popupInviteForm(actionUrl) {
    var fbmlString = '<fb:fbml>' +
              '   <fb:request-form type="POST" content="Play against me in game?" action="' + actionUrl + '" method="post" >' +
              '       <fb:multi-friend-selector target="_self" exclude_ids="" max="20" cols="4" rows="3" showborder="false" actiontext="Invite friends!" />' +
              '   </fb:request-form>' +
              '</fb:fbml>';

    FB.ui({
        method: 'fbml.dialog',
        fbml: fbmlString,
        display: 'dialog',
        size: {width:640,height:480}, width:640, height:480
    });

    $(".FB_UI_Dialog").css('width', $(window).width()*0.8);
}

(Примечание: я разместил один и тот же вопрос на форуме Facebook без ответа. Я обновлю оба, если будет ответ на любой из них.)

Javascriptкод был адаптирован из переполнения стека ответ .

Ответы [ 6 ]

5 голосов
/ 21 января 2011

У меня такая же проблема.Второй день в поисках решения.И нашел только один способ: для закрытия активного диалога FB вы должны выполнить следующий код в родительском окне, где доступен FB JS и где был вызван FB.ui:

FB.Dialog.remove(FB.Dialog._active);

Итак, если вы хотите, чтобы диалог приглашения автоматическизакрывает и не перенаправляет на любую другую страницу, выполните следующие действия:

1) Установите целевое значение атрибута и как "_self":

target = "_ self"

2) создать URL-адрес / страницу обратного вызова на вашем сайте, например https://mysite/close_dialog.html

3) Установить атрибут attr для только что созданного URL:

action= "http://mysite/close_dialog.html"

4) В вашем файле close_dialog.html следует JS:

    <script type="text/javascript">
        if (document.location.protocol == 'https:') {
            document.location = 'http://mysite/close_dialog.html';
        } else {
            top.window.FB.Dialog.remove(top.window.FB.Dialog._active);
        };
    </script>

ОБНОВЛЕНИЕ:

5) Есть одинвыдайте еще так: FB iframe загружен по https, но если форма запроса 'action' attr использует 'http' - пользователь получит предупреждение браузера. Но если форма запроса 'action' имеет 'https' - iframe js не может получить доступ кродитель загружен по 'http'. Таким образом, это причина, почему вы должны использовать действие по 'https'

Надеюсь, это поможет

Если у вас есть лучшерешение или вы можете улучшить это - пожалуйста, дайте всем знать об этом, спасибо за любые комментарии

3 голосов
/ 20 мая 2011

Это не работает (по крайней мере, не для меня).

Я просто вызвал окно javascript window.close ();функция вместо top.window.FB.Dialog.remove (top.window.FB.Dialog._active);и это работает.

<script type="text/javascript">
    if (document.location.protocol == 'https:') {
        document.location = 'http://mysite/close_dialog.html';
    } else {
        //alert('some message');
        window.close();
    };
</script>
0 голосов
/ 26 ноября 2015

FWIW, плагин конфиденциальности моего браузера не позволял FB закрывать диалог.Я просто отключил плагин конфиденциальности, и диалог закрылся, как и ожидалось.

0 голосов
/ 11 апреля 2012

Закрывает все диалоговые окна, но может не работать с будущими выпусками из-за доступа к внутренней переменной _loadedNodes

if (FB && FB.UIServer && FB.UIServer._loadedNodes) {
  var nodes = FB.UIServer._loadedNodes;
  if (nodes) {
    for (var item in nodes) {
      if (nodes[item].type && nodes[item].node && nodes[item].node.close &&
 nodes[item].type === "popup") {
        nodes[item].node.close();
      }
    }
  }
}
0 голосов
/ 11 апреля 2012

FB.ui предоставляет опцию для функции обратного вызова, которая будет выполнена после завершения FB.ui.

FB.ui(
  {
    method: '..........',
    ..................
  },
  function(response) {
    //write your code here
  }
);

Поможет ли это решить вашу проблему?

0 голосов
/ 05 июня 2011

Я обнаружил, что ответ Игоря Решетникова сработал, но только если я убедился в том, что объявил обе страницы - ту, которая открывает диалог и close_dialog.html - как часть одного домена с использованием document.domain.поэтому в верхней части тегов сценария на обеих страницах вам нужно было добавить эту строку

document.domain = 'mysite.com';

, очевидно, заменив mysite.com тем, что когда-либо было вашим доменом

...