Pregunta

Cuando tengo un error de marcado en mi página XHTML, Mozilla Firefox muestra la " Pantalla amarilla de la muerte " ;, mostrando solo un gran mensaje de error rojo sobre un fondo amarillo.

Si bien estos errores son raros, son extremadamente amigables para el usuario.

¿Hay alguna forma de detectarlos usando Javascript y, por lo tanto, enviar un mensaje de vuelta al servidor?

Lo que he descubierto hasta ahora:  - Las secuencias de comandos colocadas antes del error de análisis aún se ejecutan. (Por supuesto.)  - Los tiempos de espera y los intervalos establecidos en estos scripts se seguirán ejecutando después del error de análisis.  - En Firefox, el DOM es un <parsererror> con un <sourcetext> dentro. Puedo detectar esto si consulto document.firstChild.tagName.

Preguntas restantes:  - ¿Qué eventos hay disponibles que pueda escuchar para detectar que esto suceda? (El sondeo apesta)  - ¿Cómo puedo detectar esto en otros navegadores?

¿Fue útil?

Solución

Es posible detectar errores de análisis en el cliente, pero realmente está resolviendo el problema incorrecto.

Sé que esto no es lo que pediste, pero a menos que estés haciendo algo verdaderamente específico de XHTML como incrustar algún otro lenguaje de marcado, debes servir tu página como texto / html en lugar de application / xhtml + xml. Incluso si es XHTML. Al servirlo como texto / html evitará el problema con el que se encuentra y permitirá que su página funcione también en IE. Tenga en cuenta que es el tipo MIME y no la declaración de doctype lo que determina qué analizador se utiliza; el uso de un doctype de transición no lo hará.

Dicho esto, si está realmente seguro de que desea analizar su página como XHTML, es mejor manejar este tipo de error en el servidor. Genere su página creando un DOM y luego envíe el resultado de la serialización. Si esa no es una opción, comience generando la página como lo hace ahora, pero aún no la transmita al cliente. Tome el XHTML que ha generado y analícelo del lado del servidor con un analizador XHTML de validación (o al menos, un analizador XML genérico). Si obtiene errores, muestre la página de error que desee. De lo contrario, serialice el DOM analizado y envíelo al cliente.

En resumen, las reglas básicas para usar application / xhtml + xml son:

  1. No lo hagas
  2. (Para usuarios avanzados) No, a menos que haya demostrado que está haciendo algo que no funcionará si la página se sirve como texto / html. Esto se aplica a una pequeña fracción del porcentaje de documentos XHTMl.
  3. Si debe servir su página como application / xhtml + xml, generarla con algún método que garantice la validez.
  4. A menos que realmente sepa lo que está haciendo, nunca use application / xhtml + xml para una página que incluya la entrada del usuario.

Recuerde que XHTML es solo una reformulación de HTML 4 más la capacidad de incrustar otros idiomas. Si no usa la incrustación, lo que tiene es HTML 4 con una sintaxis diferente pero casi completamente compatible. La abrumadora mayoría de los documentos XHTML disponibles se sirven como texto / html y, por lo tanto, los navegadores los tratan como HTML 4.

Otros consejos

Esto no responde a su pregunta, sino que, ¿por qué no validar su XHTML en su servidor, después / cuando lo genera y antes de enviarlo al navegador?

Mi primera pregunta sería: Dado que Internet Explorer no le permite especificar fácilmente application / xhtml + xml como el tipo mime, ni lo admite tan bien, ¿por qué necesita detectar errores de análisis XHTML?

En cuanto a la detección de errores, eche un vistazo a http://www.quirksmode.org

Recomiendo validar el documento en el lado del servidor. Pero si realmente desea hacerlo en el lado del cliente, no hay nada de malo en realizar encuestas correctamente (lo que significa que la encuesta está garantizada para finalizar).

Los siguientes deberían funcionar al menos en Firefox y Opera:

(function() {
    if(document.documentElement &&
        document.documentElement.getAttribute('xmlns') !==
        'http://www.w3.org/1999/xhtml') {
        alert('parsing errors');
    }
    else if(document.body && document.body.lastChild) {
        alert('no parsing errors');
    }
    else setTimeout(arguments.callee, 100);
})();

Sé que probablemente no sea la respuesta más útil, pero ¿ha considerado cambiar a un doctype de transición?

Por supuesto, ponga sus archivos en un analizador para detectar errores, pero hágalo sin conexión: ¡el riesgo de mostrar a los usuarios que el YSOD no vale la pena!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top