2009-01-16 53 views
1

当我的XHTML页面出现标记错误时,Mozilla Firefox显示“黄色死亡屏幕”,在黄色背景上只显示大量红色错误消息。我可以使用Javascript检测XHTML解析错误吗?

尽管这些错误很罕见,但它们是非常不利于用户不友好的

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

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

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

回答

2

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

我知道这不是你所要求的,但是除非你真的像XHTML一样做了一些特定的内容,比如嵌入一些其他标记语言,否则你应该把你的页面作为text/html而不是application/xhtml + xml。即使它是XHTML。通过将其作为text/html提供,您将避免您遇到的问题,并让您的页面在IE中也能正常工作。请注意,它是MIME类型,而不是确定使用哪个分析器的doctype声明 - 使用过渡型文档不会。这就是说,如果你确定你希望你的页面被解析为XHTML,最好在服务器上处理这种错误。通过构建DOM生成页面,然后发送序列化结果。如果这不是一个选项,那么首先按照现在的方式生成页面,但不要将其传输到客户端。以生成的XHTML为例,使用验证的XHTML解析器(或者至少是通用的XML解析器)解析服务器端。如果您遇到错误,请显示您想要的任何错误页面。否则,序列化解析的DOM并将其发送给客户端。

总之,使用应用程序/ xhtml + xml的基本规则是:

  1. 不要。
  2. (对于高级用户)不要,除非你已经证明你正在做的事情,如果页面被作为文本/ HTML提供不起作用。这适用于XHTMl文档百分比很小的一小部分。
  3. 如果您必须将您的页面作为application/xhtml + xml进行处理,请使用一些保证有效性的方法生成它。
  4. 除非你真的知道你在做什么,从来没有使用application/xhtml + xml作为包含用户输入的页面。

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

+0

+1,除了用户输入在XHTML中并不比普通的旧HTML更危险;如果攻击者可以潜入一个 bobince 2009-01-16 11:39:44

0

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

通过一切手段,通过解析器来检测您的文件,以检测错误,但脱机 - 它显示用户YSOD的风险是不值得的!

+0

过渡/严格是不伦不类的,他们都将无法解析,如果您的服务器不构成井内容为XML。但是,是的,在打击用户之前检查格式良好是一种方式。 – bobince 2009-01-16 11:36:51

1

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

1

我的第一个问题是:由于Internet Explorer不容易让你真正指定application/xhtml + xml作为MIME类型,也不支持这一切,为什么你需要检测XHTML解析错误?

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

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); 
})(); 
相关问题