8

私たちのブログには、ユーザーが記事を自分のタイムラインに投稿できるリンクがあります。ポップアップが開き、ユーザーが facebook に投稿すると、ポップアップはそこにとどまり、「www.oursite.com」にリダイレクトされます。ユーザーが投稿を終了するか、キャンセル ボタンをクリックしたときに、ポップアップを閉じるにはどうすればよいでしょうか。this so questionによると、それはできませんが、ハフィントンの投稿はそれを理解しましたが、彼らのコードを見ると、私たちはそれを理解できません。例として、ここにある facebook の共有ボタンはポップアップを開き、記事を投稿するかキャンセルすると閉じます。

ここに私たちが持っているものがあります:

FB.init({appId: "90210", status: true, cookie: true});

      function postToFeed() {

        // calling the API ...
        var obj = {
          method: 'feed',
          redirect_uri: 'http://www.oursite.com/',
          link: 'http://www.oursite.com/',
          picture: 'http://www.oursite.com/png.png',
          name: 'Some title',
          caption: '',
          description: ''
        };

        function callback(response){
           window.close(); // doesn't do anything
          //document.getElementById('msg').innerHTML = "Post ID: " + response['post_id'];
        }

        FB.ui(obj, callback);
      }

window.close(); を追加してみました。コールバック (および self.close();) で、redirect_uri を空白のままにしようとしました (そして、redirect_uri を完全に除外しようとしましたが、必須です)。

4

8 に答える 8

15

http://oursite.com/#close_windowにリダイレクトします。次に、サイトのホームページに次のような内容を含めます。

if (window.location.hash == '#close_window') window.close();.

于 2013-03-02T23:40:40.400 に答える
8

この問題に丸一日を費やした後、共有したい非常に優れた解決策があります。FB.ui() で SDK を使用する代わりに、https://www.facebook.com/dialog/feedへの独自のポップアップを手動で開くことで完全に回避できることを発見しました。このようにすると、redirect_uri は期待どおりに機能します。ユーザーがボタンをクリックしてダイアログをポップアップさせる必要がある限り、ポップアップ ブロッカーはトリガーされません。

このコードに妥協はないと思いますし、どちらかと言えば、実際の SDK よりもはるかに使いやすいです。

私の Javascript コード (FacebookFeedDialog.js として保存できます) は次のようになります。

/* by Steven Yang, Feb 2015, originally for www.mathscore.com.  This code is free for anybody to use as long as you include this comment.  */
function FacebookFeedDialog(appID, linkTarget, redirectTarget) {
  this.mParams = {
    app_id: appID,
    link: linkTarget,
    redirect_uri: redirectTarget,
    display: "popup"
  }
};

/* Common params include:
   name - the title that appears in bold font
   description - the text that appears below the title
   picture - complete URL path to the image on the left of the dialog
   caption - replaces the link text
*/
FacebookFeedDialog.prototype.addParam = function(key, value) {
  this.mParams[key] = value;
};

FacebookFeedDialog.prototype.open = function() {

  var url = 'https://www.facebook.com/dialog/feed?' + encodeCGIArgs(this.mParams);
  popup(url, 'feedDialog', 700, 400);
};

/* Takes a param object like this:
   { arg1: "value1", arg2: "value2" }
   and converts into CGI args like this:
   arg1=value1&arg2=value2

   The values and args will be properly URI encoded
*/
function encodeCGIArgs(paramObject) {

  var result = '';

  for (var key in paramObject) {
    if (result)
      result += '&';
    result += encodeURIComponent(key) + '=' + encodeURIComponent(paramObject[key]);
  }

  return result;
}

function popup(mylink,windowname,width,height) {
  if (!window.focus) return;
  var href;
  if (typeof(mylink) == 'string')
    href=mylink;
  else
    href=mylink.href;
  if (!windowname)
    windowname='mywindow';
  if (!width)
    width=600;
  if (!height)
    height=350;
  window.open(href, windowname, 'resizable=yes,width='+width+',height='+height+',scrollbars=yes');
}

上記の Javascript コードを使用する HTML ファイルの例を次に示します。

<HTML>
<BODY>
<SCRIPT type="text/javascript" src="FacebookFeedDialog.js"></SCRIPT>
<SCRIPT>
var dialog = new FacebookFeedDialog(yourAppIDGoesHere,yourDestinationURLGoesHere,yourCloseWindowURLGoesHere);
dialog.addParam('name','This is my title');
dialog.addParam('description','This is the description');
dialog.addParam('picture',yourImageURLGoesHere);
dialog.addParam('caption','This is the caption');
</SCRIPT>

<A href="javascript:dialog.open()">Open facebook dialog</A>
</BODY>
</HTML>

closeWindow html ファイルは次のようになります。

<SCRIPT>
window.close();
</SCRIPT>
于 2015-02-11T19:20:32.273 に答える
4

2017 年 10 月現在、削除は機能してredirect_uriいるようです。

デフォルトはhttps://www.facebook.com/dialog/return/close#_=_です

そのソースはただ <script type="text/javascript"> window.close() </script>

于 2017-10-09T13:14:26.927 に答える
3

更新: このスクリプトをリダイレクト ページに追加します。

if (document.referrer == "https://www.facebook.com/" && (window.location.href.indexOf('post_id=') != -1 || window.location.hash == '#_=_')) {
    window.close();
}
于 2016-02-03T07:59:02.010 に答える
1

これは元の質問に対する直接的な回答ではありませんが、ここに到着した他の人を助けるかもしれません.

これを行うには、共有が正常に完了したときに元のページでアクションを実行できる、より堅牢な方法があります。

元のページで:

var shareWindow;

function openShareWindow() {
  // See https://developers.facebook.com/docs/sharing/reference/share-dialog
  shareWindow = window.open('https://www.facebook.com/dialog/share?app_id=...&display=popup&redirect_uri=...');
}

function shareCompleted() {
  if (shareWindow) {
    shareWindow.close();
    shareWindow = null;

    // The share was successful, so do something interesting here...
  }
}

あなたがあなたとして設定したページredirect_uriで、私は通常、次のようなものにマップしますhttp://myserver.com/share/close:

window.opener.shareCompleted();

これで、共有ウィンドウが閉じて、必要に応じて元のページでアクションを実行できることが保証されます.

注:shareCompletedこの作業では、ルート ウィンドウの名前空間で使用できる必要があります。すべての JavaScript を適切にラップする場合は、次のことを確認してください。

window.shareCompleted = shareCompleted;
于 2016-01-04T22:26:04.157 に答える