from ejemplos attribute javascript jquery cross-browser onbeforeunload

ejemplos - javascript download file from server



Enviar AJAX al servidor antes de descargar (2)

Ajax es asincrónico.

Cuando actualiza (o cierra) su navegador, beforeunload se beforeunload una beforeunload . Y significa que tan pronto como antes de que la beforeunload finalice, la página se actualizará (o cerrará).

Cuando haces una solicitud de AJAX, (dado que es asíncrono) el intérprete de JavaScript no espera que se ejecute el evento de success de beforeunload y se mueve hacia abajo terminando la ejecución de beforeunload .

se supone que el success de ajax se llamará después de algunos segundos, pero no lo verá a medida que la página se haya actualizado / cerrado.

Nota al margen:

.success() método .success() está en desuso y se reemplaza por el método .done()

Referencia

Así que, supuestamente, comenzando en Firefox> 4 , enlazar el objeto jQuery de la ventana a beforeunload ya no funciona.

Lo que me gustaría hacer es enviar una publicación de AJAX para eliminar los datos de Memcache de mi servidor.

Cuando actualizo la única pestaña abierta, puedo ver que el evento beforeunload se llama tanto en firefox como en cromo con el siguiente código, como lo demuestra el mensaje console.log, "firefox / NON-firefox delete". El problema es que nunca veo el mensaje console.log "Memcache Delete" que indica que mi servidor nunca vio la solicitud $.ajax .

Me doy cuenta de que es malo hacer sniffing de navegador y que no hay diferencia entre lo que se incluye en las declaraciones if y else. Simplemente estoy mostrando el código de lo que he intentado sin éxito en Firefox.

¿Alguien tiene alguna idea?

$(window).bind(''beforeunload'', function(){ if(/Firefox[///s](/d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { console.log(''firefox delete''); memcacheDelete(); return null; } else { console.log(''NON-firefox delete''); memcacheDelete(); return null; } }); function memcacheDelete() { $.ajax({ url: "/memcache/delete", type: "post", data:{}, success:function(){ console.log(''memcache deleted''); }//success }); //ajax }


Solo para completar, esto es lo que hice, gracias a @Jashwant por la guía: noté que este otro SO Q & A sugería la misma solución . La CLAVE es la async:true(false) en la llamada $.ajax a continuación:

$(window).bind(''beforeunload'', function(){ if(/Firefox[///s](/d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { console.log(''firefox delete''); var data={async:false}; memcacheDelete(data); return null; } else { console.log(''NON-firefox delete''); var data={async:true}; memcacheDelete(data); return null; } }); function memcacheDelete(data) { $.ajax({ url: "/memcache/delete", type: "post", data:{}, async:data.async, success:function(){ console.log(''memcache deleted''); }//success }); //ajax }