为什么浏览器对 HTML 不严格?[关闭]

Why aren't browsers strict about HTML? [closed]

提问人:Francisco Zarabozo 提问时间:8/29/2014 最后编辑:Francisco Zarabozo 更新时间:8/30/2014 访问量:2739

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

9年前关闭。

众所周知,浏览器会接受无效的 HTML,并尽最大努力从中找出意义。如果创建仅包含以下代码的网页:

<html>
    <head>
        <title>This is bad HTML</title>
    <body>
        <h1>Bad HTML</h2>
        <p>This is a paragraph
    </body>

然后,您将以显示可接受视图的方式解析网页。这是否是你的思,取决于每个浏览器对你的错误的理解。

对我来说,这就像 Javascript 可以这样写一样:

if (some_var == 1) {
    say_something("some text');
else {
    do_something_else();
// END OF CODE

其中,一个以同样的努力编写的 Javascript 编译器可以按照你的意思进行解析 - 或者有自己的意义,但毕竟运行它。

我看过几篇关于“写有效的HTML值得吗?”的文章和问题,其中提出了一些关于编写有效HTML的利弊的观点。然而,这真正让我想知道的是:

为什么浏览器首先接受无效的 HTML?

注意:以下问题不是更多问题,而是为我在这里提出的唯一问题提供背景的一种方式:

  • 为什么浏览器不严格?

  • 为什么他们不像任何其他编程语言一样拒绝无效代码呢?(并不是说我把HTML称为编程语言,但你明白了)

  • 这难道不会迫使所有开发人员编写在任何浏览器中解释完全相同的 HTML 代码吗?

  • 如果浏览器拒绝解析无效的标记,这难道不会有效地导致任何想要在网络上发布内容的人都能获得有效的标记吗?

  • 如果这是由于历史原因和向后兼容性造成的,那么当我们已经看到像 adsense.google.com 这样的网站拒绝与 IE < v10 兼容时,是不是已经是时候改变了?

编辑:那些投票决定关闭这个问题的人,请重新考虑。这不是一个宽泛的问题,也不是一个基于意见的问题。这是一个非常具体的主题,与编程世界完全相关,并且真正了解它的人绝对可以用真正的答案来回答。谢谢。

HTML DOM xhtml xhtml-1.0-严格

评论

6赞 Jared Farrish 8/29/2014
哦,天哪。Waaayyy 太宽泛了,而且受到历史的损害(它不漂亮,brutha,它是彻头彻尾的古怪)。而且,呃,早期的 Javascript(最初可能价值 10 年)非常糟糕。
3赞 SLaks 8/29/2014
@FranciscoZarabozo:如果你发送 as,我相信它是严格的。application/xhtml+xml
8赞 Jared Farrish 8/29/2014
它太宽泛了,因为一是五个问题,二是包括 SGML、XML、XHTML、多个浏览器渲染系统、浏览器大战、怪癖模式、文字处理、桌面排版等的历史。这是一段真实的历史,所以它不是意见(除非有人猜测),但它漫长而乏味,对于这种类型的论坛来说太多了。可能是一本书。
2赞 BoltClock 8/29/2014
@SLaks是正确的。如果您不将其作为 发送,则永远不会发送 XHTML;假设默认值是,您将始终发送标签汤。application/xhtml+xmltext/html
4赞 BoltClock 8/29/2014
郑重声明,您给出的示例中唯一无效的是 / 标签不匹配。如果你解决了这个问题,其他一切都是有效的 HTML 4 和 HTML5。是,包括缺少的结束标记 和 。h1h2htmlheadp

答:

5赞 IMGlow 8/29/2014 #1

我不知道为什么他们从一开始就允许这样做,但这就是他们现在不能切换的原因:传统支持。如果浏览器强制使用严格的 html,互联网的很大一部分就会中断,是的,有些人会更新他们的代码,但有些页面会丢失。浏览器没有动力这样做,因为在消费者看来,浏览器只是在某些页面上不起作用,并且会切换到另一个仍然支持不太理想的 html 的页面。

基本上是因为它从一开始就被允许,现在必须允许。

评论

1赞 Jared Farrish 8/29/2014
标准组织可以设计一个非常严格的 HTML 版本,它限制了任何不遵守其解析规则的任性内容,但具有讽刺意味的是,使 HTML 5 不如 HTML 4(.1) 严格,正是因为严格性在 Web 浏览器空间的上下文中无关紧要
2赞 Francisco Zarabozo 8/29/2014
@falsarella:浏览器可以开始放置一个大的红色条,说明标记中存在错误,因为它写得很差,但仍然显示内容。这将使用户意识到这一点,将责任从浏览器本身中剥离出来,并给糟糕的HTML编写者带来很多耻辱,这将很快导致编码人员努力编写有效的标记,并实际上为他们的正确性感到自豪。
4赞 thirtydot 8/29/2014
@FranciscoZarabozo:用户不关心 HTML 是否有效。
4赞 Francisco Zarabozo 8/29/2014
@thirtydot:他们不在乎,只是因为它是由浏览器修复的。他们关心网站无法正常工作,并想知道这是浏览器还是计算机的错。
1赞 BoltClock 8/29/2014
@Jared Farrish:你总是可以通过编写严格的多语言标记并将其作为(“XHTML5”)来挑战自己。application/xhtml+xml
2赞 falsarella 8/29/2014 #2

为了避免基于意见的答案,这种类型的问题需要基于具有可靠和/或官方来源的权威参考的答案。

以下摘录自 W3C Validator Help & FAQ,解决了与此相关的其他一些已证明的问题。Why are browsers accepting invalid HTML in the first place?


关于标记

万维网上的大多数页面都是用计算机语言编写的 (例如 HTML),允许 Web 作者构建文本,添加 多媒体内容,并指定结果的外观或样式 应该有。

至于每种语言,它们都有自己的语法、词汇和 语法,并且用这些计算机语言编写的每个文档都是 应该遵循这些规则。(X)HTML 语言,适用于所有人 XHTML 1.1 及以下版本使用机器可读的语法,称为 DTD,一种继承自 SGML 的机制。

但是,就像自然语言中的文本可以包括拼写或 语法错误,使用标记语言的文档可能(对于各种 原因)不遵守这些规则。

[...]


概念

计算机编程的重要格言之一是:“成为 在你生产的东西上保守;对你所接受的东西要宽容。

浏览器通过接受网页来遵循这一格言的后半部分 并尝试显示它们,即使它们不是合法的 HTML。通常 这意味着浏览器将尝试对 你可能的意思。问题是不同的浏览器(或 即使同一浏览器的不同版本)也会有所不同 对同一非法结构的猜测;更糟糕的是,如果你的 HTML 是 真的很病态,浏览器可能会无可救药地混淆和 造成一团糟,甚至崩溃。

这就是为什么你要遵循格言的前半部分,使 确保您的页面是合法的 HTML。

[...]


有效性可能并不意味着质量,无效性可能并不意味着质量差

一个有效的网页不一定是一个好的网页,而是一个无效的网页 网页几乎没有机会成为一个好的网页。

出于这个原因,W3C Markup Validator 说了 页面通过验证并不意味着 W3C 评估它是 好页面。它只意味着一个工具(不一定没有缺陷) 发现该页面符合一组特定的规则。没有了,没有 少。这也是为什么“有效......”图标永远不应该是 被认为是“W3C质量印章”。


意外的浏览器行为可能意味着它们实际上不接受无效标记

虽然当代 Web 浏览器在解析方面做得越来越好 即使是最糟糕的 HTML“标签汤”,也并不总是能捕捉到一些错误 优雅。很多时候,不同平台上的不同软件会 没有以类似的方式处理错误,这使得它变得非常困难 以一致地应用样式或布局。

另一方面,使用标准的、可互操作的标记和样式表 手,提供了更大的机会来处理一个人的页面 跨平台和用户代理始终如一。

[...]


兼容性问题

检查页面在多个现代浏览器中是否“显示正常” 可能是该页面今天“工作”的合理保险,但它 不保证明天会起作用。

过去,许多依赖 Netscape 1.1 怪癖的作者 突然发现他们的页面在 Netscape 2.0 中完全空白。 虽然 Internet Explorer 最初设定与 Netscape,它后来也朝着符合标准的方向发展 释放。

[...]


过度依赖第三方工具

这个问题的答案是标记语言只不过是数据 格式。所以一个网站看起来根本不像任何东西!它只需要 在浏览器呈现时的视觉外观上。

在实践中,不同的浏览器可以而且确实非常显示同一页面 不同。这是故意的,并不意味着任何类型的浏览器 错误。有时用于此的术语是 WYSINWOG - 您所看到的不是 其他人得到什么(除非是巧合)。它确实是其中之一 网络的主要优势,即(例如)视障人士 用户可以在没有发布者的情况下选择非常大的打印或文本到语音转换 不得不费心费力地准备一个单独的 版。

评论

1赞 Clément Malet 8/29/2014
我觉得这并不能真正回答“为什么浏览器不严格”的问题,而是“我们为什么要遵循 W3C 规则”,这有点不同。
0赞 Francisco Zarabozo 8/29/2014
@ClémentMalet:虽然我几乎和你感觉一样,但第二段非常接近回答它。到目前为止,这个问题中的任何其他评论或答案都更接近:特别是说:One of the important maxims of computer programming is: "Be conservative in what you produce; be liberal in what you accept." Browsers follow the second half of this maxim by accepting Web pages and trying to display them even if they're not legal HTML.
0赞 falsarella 8/29/2014
@ClémentMalet我已经更新了我的问题,将重点放在其中的“主题”部分。
0赞 Clément Malet 8/29/2014
@FranciscoZarabozo 无论如何,第 2 段正在被讨论很多:W3C 在验证新工具、标签、方法方面非常缓慢......这样一来,没有人愿意尝试验证他们的页面,因为他们必须删除他们的超级新功能 HTML 14.0
6赞 Peter O. 8/29/2014 #3

“为什么浏览器首先接受无效的 HTML?”

出于兼容性原因,对于较新的浏览器,因为 HTML5 规定了一种算法来解析无效文档。

早期的 HTML 规范在许多情况下都是模棱两可的, 例如,当看到错误的标签时会发生什么,或者嵌套不一致 标记,例如 .即便如此,许多文档“只能工作”,因为一些早期的浏览器忽略了意外的标签,甚至“纠正”了不正确的嵌套。<b><i></b></i>

但现在 HTML5 规范包含了一种用于解析 HTML 文档的不那么模糊的算法。请注意,该算法包括可能发生“解析错误”的点。但是,这些解析错误通常不会阻止现代浏览器显示 HTML 文档,尽管浏览器可以选择以下方式,可以自由地在其开发人员工具中显示解析错误:

[U]ser 代理在解析 HTML 文档时,可能会在遇到第一个解析错误时中止解析器,而这些错误不希望应用本规范中描述的规则。[着重号是后加的。

但同样,据我所知,没有一个现代浏览器会因为解析错误而如此早地中止解析文档(除非出现特殊情况,例如内存不足)。

关于 adsense.google.com 情况:这可能与无效的 HTML 无关,而是因为 IE9 及更早版本的 DOM 支持不足以满足 adsense.google.com 的需求。