Вопрос

Я создал функцию JS, которая работает нормально, когда она включает действие «onclick» стандартного тега ссылки HTML следующим образом:

<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');">

По сути, JS-функция fb_CheckPermission() использует 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

Пользовательский опыт, которого я пытаюсь достичь, заключается в том, что когда пользователь отправляет форму, я проверяю, предоставил ли он определенное разрешение, и, если нет, запрашиваю разрешение перед отправкой формы.Если пользователь уже предоставил разрешение, форму следует просто отправить.Для тех пользователей, которым предложено отправить форму, она должна быть отправлена ​​после того, как они решат предоставить разрешение или отклонить запрос, который, как я считаю, функция JS fb_checkPermission() обрабатывает правильно прямо сейчас.В чем я не уверен, так это в том, что есть какая-то проблема с JavaScript, связанная с тем, как это работает при отправке формы.

Как я уже упоминал, эта функция JS отлично работает как действие по щелчку, но не работает как действие при отправке, поэтому я почти уверен, что это как-то связано с тем, как JavaScript обрабатывает действия при отправке.

Я застрял, поэтому очень ценю вашу помощь в выяснении того, как изменить функцию JS, чтобы обеспечить желаемый пользовательский опыт.Заранее спасибо за вашу помощь!

Это было полезно?

Решение

Причина, по которой ваш «нажатие на привязку» работает, заключается в том, что он не меняет вашу страницу (местоположение) до завершения всех асинхронных вызовов Facebook.

Когда вы прикрепляете ту же функцию к обработчику отправки, функция возвращается до фактического выполнения элементов Facebook, и она не возвращает «false», что приводит к тому, что форма продолжает отправку раньше, чем вы этого хотите.

Что вам нужно сделать, это вернуть «false» в конце вашей функции onSubmit, чтобы предотвратить отправку и дать время Facebook для завершения, а затем вручную отправить форму в те места, где вы хотите, чтобы она была отправлена, вызвав:

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

(Обработчик не будет вызываться, если отправка инициируется сценарием.)

К сожалению, у меня нет под рукой Facebook SDK, поэтому я не могу написать код, который, я уверен, работает на 100%, но это что-то вроде этого:

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

    return false;
}

Другие советы

Попробуйте поместить вызов JavaScript на вход, который вы используете, чтобы инициировать отправку.

Я думаю, что ваш браузер имеет тенденцию использовать форму валидации по умолчанию (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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top