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

虽然这些错误很少见,但它们 极其 用户不友好。

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

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

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

有帮助吗?

解决方案

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

我知道这不是您所要求的,但除非您正在做一些真正特定于 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。

其他提示

这不回答你的问题,但是,相反,为什么不验证服务器上的XHTML,/后当你生成它,你将它发送到浏览器之前?

我的第一个问题是:由于Internet Explorer不会轻易让你真正指定的应用程序/ xhtml + xml的MIME类型,也不支持那么好,为什么你需要检测XHTML解析错误

作为用于检测错误 - 看看 http://www.quirksmode.org

我建议验证服务器侧文档。但如果你真的想这样做在客户端,没有什么错,如果做得正确(这意味着该调查是保证终止)查询。

在以下的工作至少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);
})();

我知道这可能不是最有用的答案,但你有没有考虑切换到一个过渡性的doctype?

通过一切手段,把你的文件通过一个分析器,检测错误,但这样做下线! - 用户展示YSOD的风险是不值得的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top