8

友人を招待するダイアログを正常に表示しています (以下にコードを示します)。ユーザーがスキップをクリックすると、iframe/ダイアログに新しいページが表示されます。ただし、この時点から、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 コードは、スタック オーバーフローの回答から改作されました。

4

6 に答える 6

5

私は同じ問題を抱えています。解決策を探す2日目。そして、1 つの方法を見つけました: アクティブな FB ダイアログを閉じるには、FB JS が利用可能で、FB.ui が呼び出された親ウィンドウで次のコードを実行する必要があります。

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

したがって、招待ダイアログを自動的に閉じ、他のページにリダイレクトしないようにするには、次の手順を使用します。

1) と のターゲット属性を「_self」として設定します。

target="_self"

2) サイトにコールバック URL/ページを作成します。たとえば、 https://mysite/close_dialog.html

3) 作成したばかりの 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) 他に 1 つの問題があります: FB iframe は https によってロードされますが、リクエスト フォームの「アクション」属性が「http」を使用する場合、ユーザーはブラウザの警告を受け取ります。ただし、リクエストフォームの「アクション」に「https」がある場合、iframe js は「http」によってロードされた親にアクセスできません。したがって、「https」によるアクションを使用する必要があるのはそのためです

お役に立てれば

より良い解決策がある場合、またはこの方法で改善できる場合は、これをすべて知らせてください。コメントをありがとう

于 2011-01-21T06:18:52.127 に答える
3

それはうまくいきません(少なくとも私にとってはそうではありません)。

私がしたことは、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>
于 2011-05-20T16:01:05.877 に答える
1

FB.ui は、FB.ui の完了後に実行されるコールバック関数のオプションを提供します。

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

これはあなたの問題を解決するのに役立ちますか?

于 2012-04-11T04:22:38.563 に答える
0

FWIW、ブラウザのプライバシー プラグインが原因で、FB がダイアログを閉じられませんでした。プライバシー プラグインをオフにすると、ダイアログが予期したとおりに閉じました。

于 2015-11-25T23:18:02.307 に答える
0

Igor Reshetnikov の答えが機能することがわかりましたが、両方のページ (ダイアログを開くページと close_dialog.html を開くページ) を document.domain を使用して同じドメインの一部として宣言した場合に限ります。そのため、両方のページのスクリプト タグの先頭に、この行を追加する必要がありました

document.domain = 'mysite.com';

明らかに mysite.com をあなたのドメインに置き換えます

于 2011-06-05T17:11:01.473 に答える
0

これにより、すべてのダイアログが閉じますが、内部変数へのアクセスが原因で、将来のリリースでは機能しない可能性があります_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();
      }
    }
  }
}
于 2012-04-11T14:49:24.380 に答える