2010-03-07 52 views
2

我創建了一個JS的功能時,它包括其執行罰款的標準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來檢查以確保用戶已授予我們特定許可n,如果不是則告訴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 

我想要實現的用戶體驗是,當用戶提交我的形式LL檢查,看看他們是否已授予特定權限,如果提交表單之前不提示他們的權限。如果用戶已經授予了表單應該提交的權限。對於提示的形式後,他們應提交要麼選擇授予的權限,或者如果拒絕,我相信fb_checkPermission()JS函數正確處理現在請求誰的用戶。我不確定的是,如果在提交表單時出現某種JavaScript問題。

正如我所提到的,這個JS函數完美地作爲一個onclick動作,但作爲一個onsubmit動作失敗,所以我敢肯定,這與JavaScript如何處理提交動作有關。

我堅持,所以我真的很感謝你搞清楚如何改變JS功能產生我所期望的用戶體驗幫助。在此先感謝您的幫助!

回答

3

的原因,你的「點擊錨」工程是因爲它並沒有改變你的頁面(位置),而所有的Facebook異步調用完成。

當您將同樣的功能,以提交處理程序之前Facebook的東西在函數返回被實際執行,它也沒有返回「假」造成的形式提交與早於您希望它繼續。

你需要做的是迴歸「假」在你的onsubmit函數的末尾,以防止提交,並給時間給Facebook的東西來完成,然後在地方手動提交表格,您希望它通過調用提交:

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

(處理程序就不會被submittion從腳本觸發調用。)

不幸的是我沒有Facebook的SDK在手,所以我不能寫,我敢肯定工程100%的代碼,但它的東西沿着這些路線:

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

    return false; 
} 
+0

@Marko - 你說的話很有道理,但似乎沒有用。我更新了

標籤中的onsubmit操作,以包含'return false;'在調用JS函數後,然後更新我的JS函數,幾乎在任何地方都提交false,以查看是否可以停止表單提交。不幸的是,無論我做什麼表格似乎提交。有沒有辦法改變JS函數,以便在繼續之前等待每個異步調用?我認爲這可能有助於解決我的問題。不知道還有什麼要嘗試。 – 2010-03-07 20:35:35

+0

有一點需要注意:代碼中可能存在錯誤。這也會終止腳本並允許提交進行。 如果您使用的是Firefox/Firebug,請在「return false」之前加上「console.log('...')」來查看它是否實際運行以返回語句。 – 2010-03-08 00:26:57

+0

好心思都一樣。我基本上決定在每個新元素後面再次使用警報語句重新構建函數,以確定事件發生的順序以及發生問題的位置。我認爲我已經解決了這個問題,但是它似乎在我們的幾個表格上失敗了。你的建議無疑給了我正確的方向,所以非常感謝你的幫助! – 2010-03-08 00:36:17

0

嘗試把javascript調用您使用啓動提交的輸入。

+0

@Pattersonc - 我米不太清楚你的意思。你的意思是把它作爲表單提交按鈕的onclick動作嗎?如果用戶點擊某個表單域返回來提交表單,我相信這些表單不會觸發onclick操作 - 我是否更願意在onsubmit上執行此操作? – 2010-03-07 15:25:04

+0

@RusselC - 是的。在我的測試中,如果用戶從其中一個字段返回,JavaScript仍應該觸發。 – pattersonc 2010-03-07 15:36:57

+0

在閱讀Marco的回答之後,我同意你的問題不在於javascript是否被調用,而是你不能立即知道結果。 – pattersonc 2010-03-07 16:02:56

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>