在表单提交上调用JS函数

时间:2010-03-07 15:06:41

标签: javascript facebook html-form onsubmit

我创建了一个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功能以产生我想要的用户体验。在此先感谢您的帮助!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

尝试将javascript调用放在您用于启动提交的输入上。

答案 2 :(得分: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>