当前位置: 首页 > 面试题库 >

为什么会流浪结束标签会生成一个空的段落?

令狐经武
2023-03-14
问题内容

显然,如果元素中</p>没有结束标签而没有匹配的开始标签body,则大多数(如果不是全部)浏览器将在其位置生成一个空段:

<!DOCTYPE html>
<title></title>
<body>
</p>
</body>

即使end标记周围存在任何文本,也不会将其作为此p元素的一部分-它将始终为空,并且文本节点将始终独立存在:

<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>

如果以上内容body都包裹在<p></p>标记中,…我将让您猜测会发生什么:

<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>

有趣的是,如果</p>标记之前没有<body></body>标记,则除IE9和更早版本之外的所有浏览器都 不会
生成空段落(另一方面,IE≤9始终会创建一个空段,而IE10和更高版本的行为与所有其他浏览器相同) :

<!DOCTYPE html>
<title></title>
</p>



<!DOCTYPE html>
<title></title>
</p><body>



<!DOCTYPE html>
<title></title>
</p></body>

我找不到任何规定没有相应开始标签的结束标签应生成一个空元素的引用,但是考虑到它甚至不是有效的HTML,这也就不足为奇了。确实,我只发现浏览器使用p元素(在某种程度上也包括该br元素!)来执行此操作,但是没有关于原因的任何解释。

尽管在传统模式和标准模式下都可以使用传统的HTML解析器和HTML5解析器,但在浏览器中它还是很一致的。因此,可以推断这是为了与早期规范或传统行为向后兼容。

标记有效且未关闭的原因是,最初

被定义为“新段落”标记,而不是p是容器元素。等效于
是“换行”标记。你可以看到这个文件中这样定义从1992年:而这一次从1993年:由于存在更改之前的网页,并且浏览器解析器始终与现有Web内容尽可能向后兼容,因此始终可以使用

那样。

但这并不能完全解释为什么解析器将显式</p>结束标记(带有斜线)简单地视为一个标记,并在DOM中生成一个空元素。一些解析器错误处理从归途公约的这一部分时,语法是不是严格定义,因为它是更加最近的东西?如果是这样,是否在任何地方都有记录?


问题答案:

则需要在HTML5被记录在案。看到并向下搜索An end tag whose tag name is "p",它说:

如果打开元素堆栈在按钮作用域中没有与标记具有相同标签名称的元素,则这是解析错误;就像看到带有标签名称“ p”的开始标签一样,然后重新处理当前令牌。

翻译成英文意味着p如果</p>标签不能与现有<p>标签匹配,则创建一个元素。

为什么 会这样,很难确定。通常,这是因为过去某些浏览器导致此错误的发生,并且网页开始依赖此行为,因此其他浏览器也必须实现它。



 类似资料:
  • 问题内容: 抱歉,这听起来太简单了。我是Java的新手。 这是我用来检查的一些简单代码。当我运行它时,我无法停止它。我以为如果不写任何输入并按,就可以避免循环。 有人可以向我解释在这种情况下如何工作吗? 问题答案: 从System.in读取时,默认情况下是从键盘读取的,这是一个无限的输入流……它的行数与用户希望输入的行数相同。我认为发送EOF的控制序列可能会起作用,例如CTL-Z(或者是CTL-D

  • 以下是有趣的: 它会生成如下错误: 只要我将其中一个空值更改为非空值,它就会工作。我想我明白了,因为在这个领域无法做出任何推断,但这确实看起来很奇怪。想法?

  • 为什么以下未有效使用的行(在方法中:getAllDefinedVars)会对最终结果产生影响: List collect=AllVars.Stream().Filter(v->false).collect(Collectors.ToList()); 如果我删除整个方法和调用此方法的一行代码(generateOneSetOfBools中的第一行),我最终会得到另一个结果。 如果... 提到的行对列表

  • 当我发现这个奇怪的东西时,我正在玩JSX。使用以下JSX: 会产生正确的结果: 但我想在引号周围添加双引号,因此我尝试: 令我惊讶的是,它给出了正确的输出: 我希望得到类似的输出,因为它是字符串文字: 既然在字符串文本中,它为什么不按字面意思告诉我?这是巴贝尔的错误吗? 注意:这是一个自我提问和回答

  • 问题内容: 我正在使用ant生成javadocs,但是一遍又一遍地获取此异常-为什么? 我正在使用JDK 1.6.0_06 版本。 问题答案: 看来这已被报告为Java错误。这似乎是由于使用了第三方库(例如JUnit)中的注释,而在Javadoc调用中不包含带有该注释的jar。 如果是这种情况,只需在javadoc上使用-classpath选项并包括额外的jar文件。