代码之家  ›  专栏  ›  技术社区  ›  Tim has moved to Codidact

我可以使用javascript检测XHTML解析错误吗?

  •  1
  • Tim has moved to Codidact  · 技术社区  · 16 年前

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

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

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

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

    剩余问题: -我可以收听哪些事件来发现这种情况?(投票很糟糕。) -如何在其他浏览器中检测到这一点?

    5 回复  |  直到 14 年前
        1
  •  2
  •   CantFindMyOpenidPassword    16 年前

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

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

    也就是说,如果您确实希望将页面解析为XHTML,那么最好在服务器上处理此类错误。通过构建一个DOM来生成页面,然后发送序列化结果。如果这不是一个选项,那么从生成页面开始,就像现在一样,但不要将其传输到客户机。以您生成的XHTML为例,使用验证XHTML解析器(或者至少是通用XML解析器)在服务器端解析它。如果出现错误,请显示所需的错误页。否则,序列化解析的DOM并将其发送给客户机。

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

    1. 不要。
    2. (对于高级用户)不要这样做,除非您已经证明您所做的操作如果页面被用作文本/html,将无法工作。这适用于占XHTML文档百分比的一小部分。
    3. 如果必须将页面作为application/xhtml+xml提供服务,请使用某种方法生成它,以确保有效性。
    4. 除非你 真的? 知道你在做什么, 从未 对包含用户输入的页面使用application/xhtml+xml。

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

        2
  •  1
  •   ChrisW    16 年前

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

        3
  •  1
  •   cofiem    16 年前

    我的第一个问题是:由于Internet Explorer不容易允许您将application/xhtml+xml实际指定为mime类型,也不太支持它,为什么需要检测xhtml解析错误?

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

        4
  •  1
  •   Christoph    16 年前

    我建议在服务器端验证文档。但是,如果您真的想在客户机端执行此操作,那么如果正确执行了轮询,就不会有任何错误(这意味着该轮询肯定会终止)。

    以下 应该 至少在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);
    })();
    
        5
  •  0
  •   nickf    16 年前

    我知道这可能不是最有用的答案,但是你考虑过转换成一个过渡的doctype吗?

    无论如何,把你的文件通过一个解析器来检测错误,但是离线操作——向用户展示ysod的风险是不值得的!