2

我创建了一个 JS 函数,当它包含标准 HTML 链接标记的“onclick”操作时执行良好,如下所示:

<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 / 方法 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 回答