2011-03-04 6 views
6

He escrito un cliente MUC basado en web utilizando strophe.js y jQuery y estoy tratando de enviar una presencia no disponible a la sala y desconectar al usuario en el evento de descarga jquery para la ventana. Si un usuario se desplaza o cierra la pestaña del navegador , se cerrará la sesión de MUC.Desconectar la conexión Strophe en la página Descargar

He probado el código que estoy ejecutando en este caso a través de un botón de cierre de sesión que tengo en la página, así que estoy bastante seguro de que la estrofa es correcta. Creo que Strophe tiene problemas para enviar la estrofa si la ventana del navegador se está cerrando. ¿Hay alguna solución aquí? También probé el evento onbeforeunload (sé que no es totalmente compatible con varios navegadores ), pero parece que tampoco funciona.

¡Cualquier consejo es muy apreciado!

Gracias, John

Respuesta

10

Asegúrese de que cambie a modo de sincronización, y llaman flush() antes de enviar su llamada disconnect(). Aquí hay un ejemplo:

var Client = { 
    connect: function(spec) { 
    this.connection = new Strophe.Connection(spec.url); 
    }, 

    disconnect: function() { 
    this.connection.options.sync = true; // Switch to using synchronous requests since this is typically called onUnload. 
    this.connection.flush(); 
    this.connection.disconnect(); 
    } 
} 

Luego puede vincular a onforeforeload/onunload. (JQuery ejemplo)

var client = new Client; 
client.connect(); 
$(window).unload(function() { 
    client.disconnect(); 
}); 
+2

necesitará un Strophe.js parcheado: https://github.com/metajack/strophejs/ issues/16 –

+0

Para la última estrofa, debe usar this.connection.options.sync = true; – CristiC

+2

connection.options.sync = true realmente hizo que mi aplicación híbrida se congelara mientras volvía a iniciar sesión. Seriamente. Hice un pequeño perfil de cromo. Mostró que cuando vuelves a iniciar sesión después de cerrar la sesión, toda la aplicación se congela. Sin embargo, cuando eliminé sync = true, todo estaba bien. ¿Qué hace exactamente esta sincronización? Supongo que establece un patrón de sincronización después del cual cada operación es sincrónica. El valor predeterminado es asincrónico, resolvió mi problema. Todavía no soy capaz de entenderlo –

2

No hay parches necesarios, ahora hay una solución integrada:

connection.flush(); 
connection._options.sync = true;  
connection.disconnect(); 
Cuestiones relacionadas