2010-10-07 10 views
9

Estoy desarrollando una aplicación web que requiere solicitudes Ajax de larga ejecución. Desafortunadamente, en Firefox, presionar Escape durante una solicitud tiene el inconveniente de matar la solicitud y la información que contenía. Esto es bastante molesto, ya que esto puede conducir a todo tipo de complicaciones desagradables si esto sucede en el momento equivocado. Por lo tanto, me gustaría desactivar esta característica.Presionar Escape en Firefox mata mis solicitudes de Ajax. Me gustaría evitar esto

Mi primer reflejo fue interceptar pulsaciones de teclas en los límites de <cuerpo>, para garantizar que no llegaran a la ventana. Para este propósito, instalé un controlador de eventos [keypress], solo para eventos cuyo [keyChar] es 27, y lo hice invocar [stopPropagation] y [avoidDefault]. Y por un tiempo, parecía que esto estaba funcionando.

Luego, me di cuenta de que no funcionaría cuando el usuario no hubiera hecho clic en ninguna parte de la ventana, ya que los controladores de eventos <cuerpo> nunca recibieron el evento. Intenté adjuntar mi controlador al documento < > o <ventana> en vano, así que finalmente terminé agregando un controlador de evento [load] y tuve que forzar el foco en <cuerpo>. Y por un tiempo, parecía que esto estaba funcionando.

Entonces, me di cuenta de que cuando el usuario estaba editando una entrada > <, por alguna razón, una vez más, el cuerpo < >, <documento> o <ventana> controlador de eventos nunca parecen recibir el evento. Por lo tanto, agregué otro controlador [keypress], interceptando con [preventDefault] en la entrada < > cuando [keyChar] es 27.

Por el momento, parece que está funcionando. Sin embargo, con el historial de este error en mi aplicación, soy un poco pesimista.

Entonces, me pregunto si hay un método mejor y más reproducible. Recuerda que el error parece aparecer solo en FF, por lo que estoy bastante dispuesto a adoptar un enfoque solo de FF aquí.

Gracias

+1

¿Cómo exactamente 'Esc' cancela solicitudes Ajax en primer lugar? Nunca había escuchado que esto sucediera antes. –

+0

@Matt, si tiene Firebug, notará que la conexión se elimina en el mismo momento en que golpea escape. –

+0

@Kirk - wow, sí veo eso. ¿Sucede sin Firebug, también? –

Respuesta

2

Estaría preocupado por otras complicaciones desagradables que va a pasar cuando los usuarios eligen un marcador o sale en medio de la solicitud. Es posible que desee ver por qué está utilizando solicitudes de larga ejecución y ver si eso es algo que puede cambiar ...

Si no es algo que puede cambiar (o incluso si puede) debe ver por qué sus solicitudes no son tolerantes a errores. ¿Hay alguna manera de poner la comunicación en las transacciones, y rodar la última si la conexión se interrumpe?

+1

BOSH y Comet son buenos ejemplos que requieren solicitudes ajax de larga ejecución. –

+0

No había oído hablar de ellos, pero mirando a BOSH, se supone que el protocolo es tolerante a fallas y se puede dividir en varias solicitudes: http://xmpp.org/extensions/xep-0124.html#reqs – Kendrick

+0

No , no hay forma estricta de que podamos evitar las solicitudes de larga ejecución. Necesitamos poder enviar los resultados del servidor al navegador de inmediato, y no podemos permitirnos ser compatibles únicamente con navegadores HTML5 y WebSockets. Pero no se preocupe por las otras complicaciones desagradables que menciona, las hemos manejado. – Yoric

1

Sé que esto es un tipo de un hilo viejo, pero hay un error activo registrado contra Mozilla con respecto a este problema (que también estoy enfrentando). Ver https://bugzilla.mozilla.org/show_bug.cgi?id=614304 para más información.

Una sugerencia de este error es interceptar y prevenir la prensa tecla ESC en el nivel de la ventana (como también se menciona por OP):

window.addEventListener('keydown', function(e) {(e.keyCode == 27 && e.preventDefault())}); 

Esto podría tener efectos secundarios no deseados sin embargo.

Cuestiones relacionadas