1

当我的 XHTML 页面中出现标记错误时,Mozilla Firefox 会显示“黄屏死机”,仅在黄色背景上显示一条大的红色错误消息。

虽然这些错误很少见,但它们对用户非常不友好。

有没有办法可以使用 Javascript 检测到这些,从而将消息发送回服务器?

到目前为止我发现了什么: - 在解析错误之前放置的脚本仍然运行。(当然。) - 在这些脚本中设置的超时和间隔在解析错误后仍将执行。- 在 Firefox 中,DOM 是一个里面<parsererror>有一个。<sourcetext>如果我查询,我可以检测到这一点document.firstChild.tagName

剩下的问题: - 我可以监听哪些事件来检测这种情况的发生?(轮询很烂。) - 我如何在其他浏览器中检测到这一点?

4

5 回答 5

2

在客户端捕获解析错误可能是可能的,但它确实解决了错误的问题。

我知道这不是您所要求的,但除非您正在做一些真正特定于 XHTML 的事情,例如嵌入一些其他标记语言,否则您应该将您的页面作为 text/html 而不是 application/xhtml+xml。即使它是 XHTML。通过将其作为 text/html 提供,您将避免遇到的问题,并允许您的页面也可以在 IE 中工作。请注意,确定使用哪个解析器的是 MIME 类型而不是 doctype 声明——使用过渡 doctype 不会这样做。

也就是说,如果您真的确定您希望您的页面被解析为 XHTML,那么最好在服务器上处理这种错误。通过构建 DOM 生成页面,然后发送序列化结果。如果这不是一个选项,那么首先像现在一样生成页面,但不要将其传输给客户端。获取您生成的 XHTML,并使用验证 XHTML 解析器(或至少是通用 XML 解析器)在服务器端解析它。如果您遇到错误,请显示您想要的任何错误页面。否则,序列化解析的 DOM 并将其发送给客户端。

综上所述,使用application/xhtml+xml的基本规则是:

  1. 不。
  2. (对于高级用户)不要,除非您已经证明如果页面以 text/html 形式提供,您正在做的事情将无法正常工作。这适用于 XHTMl 文档的一小部分。
  3. 如果您必须将您的页面作为 application/xhtml+xml 提供,请使用某种保证有效性的方法生成它。
  4. 除非您真的知道自己在做什么,否则永远不要将 application/xhtml+xml 用于包含用户输入的页面。

请记住,XHTML 只是 HTML 4 的重新表述加上嵌入其他语言的能力。如果您不使用嵌入,那么您所拥有的是具有不同但几乎完全兼容的语法的 HTML 4。绝大多数 XHTML 文档以 text/html 形式提供,因此被浏览器视为 HTML 4。

于 2009-01-16T05:36:00.950 回答
1

这并不能回答您的问题,而是为什么不在您的服务器上验证您的 XHTML,在您生成它之后/当您将它发送到浏览器之前?

于 2009-01-16T05:07:10.697 回答
1

我的第一个问题是:既然 Internet Explorer 不允许您将 application/xhtml+xml 指定为 mime 类型,也不能很好地支持它,为什么需要检测 XHTML 解析错误?

至于检测错误 - 看看http://www.quirksmode.org

于 2009-01-16T05:40:42.923 回答
1

我建议在服务器端验证文档。但是,如果您真的想在客户端执行此操作,则如果正确完成轮询,则没有任何问题(这意味着轮询保证会终止)。

以下应该至少在 Firefox 和 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);
})();
于 2009-01-16T09:40:15.543 回答
0

我知道这可能不是最有帮助的答案,但是您是否考虑过切换到过渡文档类型?

无论如何,将您的文件通过解析器来检测错误,但要离线进行 - 向用户展示 YSOD 的风险是不值得的!

于 2009-01-16T05:04:55.210 回答