2011-01-10 19 views
8

Estoy mostrando con éxito un diálogo de invitar amigo (código que se muestra a continuación). Cuando el usuario hace clic en omitir, el cuadro de diálogo/iframe muestra una nueva página. Sin embargo, desde este punto no puedo encontrar la manera de cerrar el iframe/diálogo. FB.ui no devuelve ningún objeto, no parece haber un método JavaScript SDK y el desplazamiento y la manipulación con el DOM serán frágiles ante cualquier cambio de código FB.¿Cómo cerrar un diálogo de Facebook SDK abierto con FB.ui()?

¿Alguna idea?

function popupInviteForm(actionUrl) { 
    var fbmlString = '<fb:fbml>' + 
       ' <fb:request-form type="POST" content="Play against me in game?" action="' + actionUrl + '" method="post" >' + 
       '  <fb:multi-friend-selector target="_self" exclude_ids="" max="20" cols="4" rows="3" showborder="false" actiontext="Invite friends!" />' + 
       ' </fb:request-form>' + 
       '</fb:fbml>'; 

    FB.ui({ 
     method: 'fbml.dialog', 
     fbml: fbmlString, 
     display: 'dialog', 
     size: {width:640,height:480}, width:640, height:480 
    }); 

    $(".FB_UI_Dialog").css('width', $(window).width()*0.8); 
} 

(Nota:.. He publicado la misma pregunta sobre la facebook forum sin respuesta Voy a actualizar tanto, debe haber una respuesta a uno y otro)

El código Javascript es una adaptación de un desbordamiento de pila answer.

Respuesta

5

Tengo el mismo problema. Segundo día buscando una solución. Y acaba de encontrar una manera: para el cierre de diálogo FB activa que debe realizar en el código seguido ventana padre, donde FB JS está disponible y donde FB.ui fue llamado:

FB.Dialog.remove(FB.Dialog._active); 

Por lo tanto, si desea que sus invitar cierra automóviles de diálogo y no se vuelve a dirigir a cualquier otra página, utilice estos pasos:

1) SET objetivo de attr y que "_self":

target = "_ self"

2) crear un poco de devolución de llamada URL/página en su sitio, por ejemplo https://mysite/close_dialog.html

3) Establecer attr acción de URL como la recién creada:

action = "http: // mysite/close_dialog. html"

4) En el puesto close_dialog.html seguido JS:

<script type="text/javascript"> 
     if (document.location.protocol == 'https:') { 
      document.location = 'http://mysite/close_dialog.html'; 
     } else { 
      top.window.FB.Dialog.remove(top.window.FB.Dialog._active); 
     }; 
    </script> 

ACTUALIZACIÓN:

5) Hay una cuestión más en esta forma: FB iframe cargado por https, pero si la 'acción' de peticiones y forma ATTR usos 'http' - usuario obtendrá advertencia del navegador. Pero si la 'acción' en forma de solicitud tiene 'https' - iframe js no puede acceder al padre cargado por 'http'. lo tanto, es la razón por la que debe utilizar la acción por 'https'

espero que esto ayude

Si usted tiene una mejor solución o se puede mejorar de esta manera - por favor, vamos todos saben esto, Gracias por cualquier comentario

+2

Recibí el mensaje "El método FB.Dialog.remove no es oficialmente compatible con Facebook y el acceso a él pronto será eliminado". en la consola cuando utilicé FB.Dialog.remove. Por lo tanto, no se recomienda su uso. – FR6

3

Eso no funciona (al menos no para mí).

Lo que hice fue simplemente llamar a la ventana javascript.close(); función en lugar de top.window.FB.Dialog.remove (top.window.FB.Dialog._active); y funciona.

<script type="text/javascript"> 
    if (document.location.protocol == 'https:') { 
     document.location = 'http://mysite/close_dialog.html'; 
    } else { 
     //alert('some message'); 
     window.close(); 
    }; 
</script> 
0

me encontré con la respuesta de Igor Reshetnikov hizo el trabajo, pero sólo si me aseguré de declarar las dos páginas - El que abre el cuadro de diálogo y close_dialog.html - como parte del mismo dominio utilizando document.domain. por lo que en la parte superior de las etiquetas script en ambas páginas you'ld tuvo que añadir esta línea

document.domain = 'mysite.com'; 

, obviamente, la sustitución de mysite.com con lo que su dominio es

0

El FB.ui proporciona una opción para una función de devolución de llamada que se ejecutará después de que se complete el FB.ui.

FB.ui(
    { 
    method: '..........', 
    .................. 
    }, 
    function(response) { 
    //write your code here 
    } 
); 

¿Esto ayudará a resolver su problema?

+0

él no necesita una devolución de llamada, él quiere cerrar el diálogo programáticamente – luschn

0

Esto cierra todos los diálogos, pero no puede funcionar con versiones futuras, debido al acceso de la variable interna _loadedNodes

if (FB && FB.UIServer && FB.UIServer._loadedNodes) { 
    var nodes = FB.UIServer._loadedNodes; 
    if (nodes) { 
    for (var item in nodes) { 
     if (nodes[item].type && nodes[item].node && nodes[item].node.close && 
nodes[item].type === "popup") { 
     nodes[item].node.close(); 
     } 
    } 
    } 
} 
0

Fwiw, la privacidad de complementos de mi navegador estaba impidiendo FB se cierre el cuadro de diálogo. Acabo de desconectar el plugin de privacidad y el diálogo se cerró tal como se esperaba.

Cuestiones relacionadas