Question

J'ai créé une fonction JS qui exécute bien quand il est inclus une action « onclick » de la balise de lien HTML standard comme suit:

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

Mais où je veux vraiment utiliser cette fonction est sur l'action « onsubmit » d'une forme, mais quand je l'inclure comme suit la fonction ne semble plus être l'exécution:

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

Qu'est-ce que la fonction JS 'fb_CheckPermission () fait essentiellement est utiliser Facebook Connect pour vérifier pour vous assurer que l'utilisateur nous a accordé une autorisation spécifique et si elle ne dit Facebook Connect pour inviter l'utilisateur à accorder l'autorisation. Voici le code de la fonction 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.}

Qu'est-ce que ce code ne se présente comme suit:

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

L'expérience utilisateur que je suis en train de réaliser est que lorsqu'un utilisateur soumet le formulaire, je vais vérifier pour voir si elles ont accordé une autorisation spécifique et sinon Incitez la permission avant de soumettre le formulaire. Si l'utilisateur a déjà accordé l'autorisation du formulaire doit simplement soumettre. Pour les utilisateurs qui sont invités le formulaire doit présenter après choisir d'accorder l'autorisation ou si le refuser la demande que je crois que la fonction JS fb_checkPermission () est le bon moment. Ce que je ne suis pas sûr est de savoir s'il y a une sorte de problème avec JavaScript comment cela fonctionne sur la soumission du formulaire.

Comme je l'ai mentionné, cette JS fonction fonctionne parfaitement comme une action onclick mais échoue comme une action onsubmit donc je suis sûr que cela a quelque chose à voir avec la façon dont JavaScript traite actions onsubmit.

Je suis coincé si j'apprécie votre aide pour trouver comment changer la fonction JS pour produire mon expérience d'utilisateur souhaité. Merci d'avance pour votre aide!

Était-ce utile?

La solution

La raison pour laquelle votre « cliquez sur l'ancre » fonctionne est parce qu'il ne change pas votre page (emplacement) alors que tous les appels asynchrones Facebook TERMINER.

Lorsque vous attachez la même fonction au gestionnaire soumettre la fonction retourne avant des choses Facebook exécuté en réalité, et il le fait sans retour « false » provoque la forme de procéder à la soumission plus tôt que vous le souhaitez.

Ce que vous devez faire est de retour « false » à la fin de votre fonction onSubmit pour empêcher la soumission et donner le temps à Facebook choses à terminer, puis soumettre manuellement formulaire à des endroits que vous voulez qu'il soit présenté en appelant:

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

(Le gestionnaire ne sera pas appelé si submittion est déclenchée à partir du script.)

Malheureusement, je n'ai pas SDK Facebook à portée de main, je ne peux pas écrire le code que je suis sûr que fonctionne à 100%, mais il y a quelque chose le long de ces lignes:

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

    return false;
}

Autres conseils

Essayez de mettre l'appel javascript sur l'entrée que vous utilisez pour lancer le soumettre.

Je pense fondamentalement que votre navigateur a tendance à utiliser le formulaire de validation par défaut (page.pl / méthode POST) au lieu de faire ce que vous pensez qu'elle Essayez ceci

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top