Domanda

Quando ho un errore di markup nella mia pagina XHTML, Mozilla Firefox mostra il " Yellow Screen of Death " ;, mostrando solo un grande messaggio di errore rosso su uno sfondo giallo.

Sebbene questi errori siano rari, sono estremamente ostili all'utente

Esiste un modo per rilevarli utilizzando Javascript e quindi inviare un messaggio al server?

Quello che ho scoperto finora:  - Gli script inseriti prima dell'errore di analisi sono ancora in esecuzione. (Ovviamente.)  - I timeout e gli intervalli impostati in questi script verranno comunque eseguiti dopo l'errore di analisi.  - In Firefox, il DOM è un <parsererror> con un <sourcetext> al suo interno. Posso rilevarlo se eseguo una query su document.firstChild.tagName.

Domande rimanenti:  - Quali eventi sono disponibili per essere ascoltato per rilevare ciò che sta accadendo? (Il polling fa schifo.)  - Come posso rilevarlo in altri browser?

È stato utile?

Soluzione

Potrebbe essere possibile rilevare errori di analisi sul client, ma risolve davvero il problema sbagliato.

So che non è quello che hai chiesto, ma a meno che tu non stia facendo qualcosa di veramente specifico per XHTML come incorporare qualche altro linguaggio di markup, dovresti servire la tua pagina come text / html anziché application / xhtml + xml. Anche se è XHTML. Servendolo come text / html eviterai il problema in cui ti imbatti e consentirai alla tua pagina di funzionare anche in IE. Si noti che è il tipo MIME e non la dichiarazione doctype che determina quale parser viene utilizzato: l'utilizzo di un doctype di transizione non lo farà.

Detto questo, se sei davvero sicuro di voler analizzare la tua pagina come XHTML, è meglio gestire questo tipo di errore sul server. Genera la tua pagina creando un DOM e quindi invia il risultato della serializzazione. Se questa non è un'opzione, inizia generando la pagina come fai ora ma non trasmetterla ancora al client. Prendi l'XHTML che hai generato e analizzalo sul lato server con un parser XHTML di convalida (o almeno un parser XML generico). Se ricevi errori, visualizza la pagina di errore che desideri. In caso contrario, serializzare il DOM analizzato e inviarlo al client.

In breve, le regole di base per l'utilizzo di application / xhtml + xml sono:

  1. Non.
  2. (Per utenti esperti) No, a meno che tu non abbia dimostrato che stai facendo qualcosa che non funzionerà se la pagina viene pubblicata come testo / HTML. Questo vale per una piccolissima frazione di percentuale dei documenti XHTMl.
  3. Se devi servire la tua pagina come application / xhtml + xml, generala con un metodo che garantisca la validità.
  4. A meno che tu non veramente sappia cosa stai facendo, non mai usa application / xhtml + xml per una pagina che include l'input dell'utente.

Ricorda che XHTML è solo una riformulazione di HTML 4 oltre alla possibilità di incorporare altre lingue. Se non usi l'incorporamento, quello che hai è HTML 4 con una sintassi diversa ma quasi completamente compatibile. La stragrande maggioranza dei documenti XHTML disponibili è servita come text / html e quindi trattata come HTML 4 dai browser.

Altri suggerimenti

Questo non risponde alla tua domanda ma, invece, perché non convalidare il tuo XHTML sul tuo server, dopo / quando lo generi e prima di inviarlo al browser?

La mia prima domanda sarebbe: dato che Internet Explorer non ti consente facilmente di specificare application / xhtml + xml come tipo mime, né di supportarlo così bene, perché devi rilevare errori di analisi XHTML?

Per quanto riguarda il rilevamento degli errori - dai un'occhiata a http://www.quirksmode.org

Consiglio di convalidare il documento sul lato server. Ma se vuoi davvero farlo sul lato client, non c'è nulla di sbagliato nel polling se eseguito correttamente (il che significa che il sondaggio è garantito per terminare).

Il seguente dovrebbe funzionare almeno in Firefox e 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);
})();

So che probabilmente non è la risposta più utile, ma hai preso in considerazione il passaggio a un tipo di transizione?

In ogni caso, metti i tuoi file attraverso un parser per rilevare errori, ma fallo offline - il rischio di mostrare agli utenti YSOD non ne vale la pena!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top