Pregunta

He creado una función JS que ejecuta bien cuando se incluyó una acción 'onclick' de la etiqueta de enlace HTML estándar de la siguiente manera:

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

Sin embargo, donde realmente quiero utilizar esta función está en la acción 'onsubmit' de una forma pero cuando lo incluyo como sigue a la función ya no parece estar ejecutando:

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

Lo que el 'fb_CheckPermission ()' función JS hace básicamente es el uso Facebook Connect para comprobar para asegurarse de que el usuario nos ha concedido una autorización específica y, si no se dice Facebook Connect para pedir al usuario para conceder el permiso. Aquí está el código de la función 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.}

Lo que este código hace es la siguiente:

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

La experiencia de usuario que estoy tratando de lograr es que cuando un usuario envía el formulario Voy a comprobar para ver si se han concedido un permiso específico y si no se les pronta para el permiso antes de enviar el formulario. Si el usuario ya ha concedido el permiso del formulario sólo debe someterse. Para aquellos usuarios que se les solicita el formulario debe presentar después de que ya sea optando por conceder el permiso o si el negar la solicitud que creo que la función JS fb_checkPermission () está manejando correctamente en este momento. Lo que no estoy seguro es si hay algún tipo de problema con JavaScript cómo funciona esta forma de presentación.

Como ya he mencionado, esta función JS funciona perfectamente como una acción onclick pero no como una acción onsubmit así que estoy bastante seguro de que esto tiene algo que ver con cómo trata de JavaScript onSubmit acciones.

Estoy atascado así que realmente aprecio su ayuda en encontrar la manera de cambiar la función JS para producir mi experiencia de usuario deseado. Gracias de antemano por su ayuda!

¿Fue útil?

Solución

La razón de su "haga clic en el ancla" que funciona es porque no cambia su página (ubicación), mientras que todas las llamadas asíncronas de Facebook en Finalizar.

Cuando se adjunta la misma función que el manejador de presentar la función devuelve antes de que Facebook cosas se ejecuta realmente, y lo hace sin volver "falsa", haciendo que la forma de proceder con la presentación antes de lo que desea.

Lo que hay que hacer es volver "falsa" al final de su función onSubmit para evitar el envío y dar tiempo a Facebook cosas hasta el final y luego enviar manualmente formulario en lugares a los que desea que se presentó llamando a:

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

(El controlador no será anunciado si submittion se desencadena a partir de la secuencia de comandos.)

Por desgracia no tengo Facebook SDK a mano así que no puedo escribir el código que estoy seguro de que funciona al 100%, pero es algo a lo largo de estas líneas:

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

    return false;
}

Otros consejos

Trate de poner la llamada javascript en la entrada que está utilizando para iniciar el enviar.

Creo que, básicamente, que el navegador tiende a utilizar la validación de formularios por defecto (page.pl / método POST) en lugar de hacer lo que usted cree Prueba esto

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top