2

次のように、標準の HTML リンクタグの「onclick」アクションに含まれている場合に正常に実行される JS 関数を作成しました。

<a href="#" onclick="return fb_CheckPermission('publish_stream');">test</a>

ただし、この関数を実際に使用したいのはフォームの「onsubmit」アクションですが、次のように含めると、関数が実行されていないようです:

<form action="page.pl" id="disable-submit" name="status-form" method="POST" onsubmit="return fb_CheckPermission('publish_stream');">

'fb_CheckPermission()' JS 関数が基本的に行うことは、Facebook Connect を使用して、ユーザーが特定の許可を与えていることを確認し、そうでない場合は、Facebook Connect にユーザーに許可を与えるように促すことです。JS 関数のコードは次のとおりです。

1. function fb_checkPermission(permission) {
2.  FB.ensureInit(function() {
3.      FB.Facebook.apiClient.users_hasAppPermission(permission, function (hasPermissions) {
4.          if(!hasPermissions){
5.              FB.Connect.showPermissionDialog(permission,function (status){
6.                  if(!status) {
7.                      if(permission == 'offline_access') {
8.                          // save session
9.                      }                       
10.                 }
11.             });
12.         }
13.     });
14. });
15.}

このコードが行うことは次のとおりです。

Line 2: Make sure Facebook Connect JS library is loaded
Line 3: Checks to see if the current Facebook Connect user has granted a specific permission
Line 5: If the permission hasn't been granted then prompt the user with the permission dialog
Line 7: In the case of the 'offline_access' permission save the session key once granted

私が達成しようとしているユーザー エクスペリエンスは、ユーザーがフォームを送信するときに、特定の権限を付与しているかどうかを確認し、そうでない場合はフォームを送信する前に権限を求めるプロンプトを表示することです。ユーザーがすでに許可を与えている場合、フォームは送信するだけです。プロンプトが表示されたユーザーの場合、許可を付与することを選択した後、または fb_checkPermission() JS 関数が現在正しく処理していると私が信じている要求を拒否した場合は、フォームを送信する必要があります。よくわからないのは、これがフォーム送信でどのように機能するかについて、何らかの JavaScript の問題があるかどうかです。

前述したように、この JS 関数は onclick アクションとしては完全に機能しますが、onsubmit アクションとしては失敗するため、これは JavaScript が onsubmit アクションを処理する方法と関係があると確信しています。

私は立ち往生しているので、JS 関数を変更して希望するユーザー エクスペリエンスを実現する方法を理解するのに本当に感謝しています。よろしくお願いします。

4

3 に答える 3

3

「アンカーのクリック」が機能する理由は、すべての Facebook 非同期呼び出しが終了している間、ページ (場所) が変更されないためです。

同じ関数を送信ハンドラーにアタッチすると、Facebook が実際に実行される前に関数が返され、「false」を返さずにフォームが送信を希望するよりも早く続行します。

あなたがする必要があるのは、あなたの onSubmit 関数の最後に "false" を返して、送信を防ぎ、Facebook のものを完了する時間を与えてから、送信したい場所にフォームを手動で送信することです:

document.getElementById('disable-submit').submit();

(送信がスクリプトからトリガーされた場合、ハンドラーは呼び出されません。)

残念ながら、私は Facebook SDK を手元に持っていないので、100% 動作すると確信しているコードを書くことはできませんが、それは次のようなものです:

function onSubmit () {
    doStuffAsynchronously(function () {
        if (everythingIsOK) {
            // proceed with submission
            document.getElementById('formId').submit();
        }
    });

    return false;
}
于 2010-03-07T15:37:16.517 に答える
0

送信を開始するために使用している入力にjavascript呼び出しをかけてみてください。

于 2010-03-07T15:18:19.220 に答える
0

基本的に、あなたのブラウザーは、あなたが思っていることをする代わりに、デフォルトの検証フォーム (page.pl / method POST) を使用する傾向があると思います。

<form action="page.pl" id="disable-submit" name="status-form"
      method="POST" onsubmit="returnFbChPermissionAndPreventDefaultAction();">
    <script type="text/javascript">
        var returnFbChPermissionAndPreventDefaultAction = function(){ 
           //prevent default
           if (event.preventDefault) { 
               event.preventDefault(); 
           } 

           //specific for IE
           valueOfreturn = fb_CheckPermission('publish_stream');
           event.returnValue = valueOfreturn;
           return event.returnValue ; 
        }
    </script>
于 2010-03-07T15:23:55.747 に答える