【问题标题】:HTML/PHP - Wrong closing tag orderHTML/PHP - 错误的结束标签顺序
【发布时间】:2014-05-31 08:15:53
【问题描述】:

当然,这个标签是不正确的:

<b><i>Hi</b></i>

但是,它仍然可以在现代浏览器中完美运行(至少在最新版本的 chrome 中)。

这种错误的代码顺序有什么负面影响?

另外,看看这个:

<table><tr><td>Hi</td></table></tr>

浏览器将如何处理此代码?

【问题讨论】:

  • 根本不要使用&lt;b&gt;&lt;i&gt;。改用 CSS。 (虽然只是提到它,但与问题无关)
  • @Daan 你不能说不知道上下文。
  • 如果您真的想知道浏览器如何解析错误的 HTML,read the parsing rules in the spec。但是,如果您正在编写 HTML 解析器,您真的只需要担心它们,内容作者应该首先编写好的 HTML(并使用 validator 对其进行测试)。
  • 是的,@Daan,但我正在制作一个聊天框。 &lt;b&gt; 会比添加style="text-weight:bold" 更方便,所以我个人同意@enapupe。
  • 也不建议这样使用内联样式。您可以使用 (在我看来比 更好),或者根据内容的含义(例如 messageHeading 或其他东西)使用带有类的跨度。这意味着,如果您在某些时候希望该文本被加下划线/更大/红色/正常/等而不是粗体,您只需更改 CSS 中的一个位置,而不是更改所有使用它的位置。这也意味着您可以轻松添加多种样式,打印样式不同等

标签: html browser tags


【解决方案1】:

现代浏览器会尝试假设您正在尝试对您的代码执行什么操作。 根据我对浏览器的谦虚理解,我注意到了这一点:

每个开始标签都会有一个结束标签。 每个结束标签都必须有一个开始标签,如果没有,那么就不需要那个结束标签。 如果缺少结束标记,浏览器将为您完成代码并添加结束标记(这是棘手的部分)。

结束标签很可能会在打开新部分或新标签集合之前出现。

如果您的代码是:

<table> 
  <tr> 
    <td> 
       Hi
    </td> 
  </table> 
</tr>

那么会被解释为:

<table>//opening OK
  <tr>//opening OK
    <td>//opening OK
       Hi
    </td>//closing an opened tag - OK
  </table>//closing table, we still have <tr> opened, close <tr> first by adding </tr> before this tag /*now '<tr>' has been closed already and then </table> is closed*/     
</tr>//this closing tag doesn't have an opening, remove it. 

语法自动更正导致:

<table> 
  <tr> 
    <td> 
       Hi
    </td> 
  </tr>
</table> 

但是,某些浏览器(例如 IE7)会以不同的方式处理它。它不会知道您的意图是什么以及哪个元素是另一个元素的父元素。

在下面的例子中,假设我们忘记关闭标签&lt;b&gt;。现在,&lt;c&gt; 应该是 &lt;b&gt; 的孩子还是兄弟姐妹?

<a>
 <b> // doesn't have a closing
  <c>
  </c>
</a>

Firefox 和 Chrome 按我的意图将 &lt;b&gt;&lt;c&gt; 视为同级并显示所有项目,但在 IE7 中它只显示一个项目,因为它假定 &lt;c&gt;&lt;b&gt; 的子级。

因此,我假设 firefox 和 chrome 在&lt;c&gt; 开放之前为我关闭了&lt;b&gt;,这是我的意图。

虽然 IE 将 &lt;b&gt; 打开后的所有内容都包含为 &lt;b&gt; 的子项,但它本身使得所有后续元素都属于 &lt;b&gt; 并仅显示一个列表项。

Firefox 和 Chrome:

<a>
 <b>
 </b> // auto close here as expected
 <c>
 </c>
</a>

IE:

<a>
 <b>
  <c>
  </c>
 </b>//auto close, they closed <b> just before closing the parent <a> logical but somehow falsy!
</a>

希望对您有所帮助,我希望我的理解在某种程度上是准确的。

【讨论】:

    【解决方案2】:

    一般来说,浏览器会尝试理解您的意思。

    “负面影响”是不可预测性。

    【讨论】:

    • 很公平。你可能会破坏互联网。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多