【问题标题】:Can HTML contain two HEAD tagsHTML可以包含两个HEAD标签吗
【发布时间】:2014-08-01 05:02:51
【问题描述】:

在我的 Web 应用程序中,我得到了包含默认标题内容的 Header.jsp 文件。我在所有其他页面中使用 jsp:include 标记将其包含在每个单独页面的正文标记中。

Header.jsp 包含它自己的 HEAD 标记来指定默认元标记、链接样式表、脚本和一些 HTML 元素。同时,我将在所有其他单独的页面中使用另一组 HEAD 标记来定义标题、页面特定脚本和样式表。

例如:

Header.jsp

<head>
   <link rel="shortcut icon" href="<%=request.getContextPath()%>/images/favicon.ico" type="image/x-icon" />
   <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
   <script src="js/jquery.js"></script>
   <link rel=stylesheet type="text/css" href="dashboard.css" >
</head>
<h2>Dashboard</h2>

Main.jsp

<!DOCTYPE html> 
<html>
   <head>
      <title>Main page</title>
      <script src="main.js"></script>
   </head>
   <body>
      <jsp:include page="Header.jsp" flush="true" />
      .....
      other HTML contents specific to main page
      .....
   </body>
</html>

这样做是否有效?

【问题讨论】:

  • 您不能在&lt;head&gt; 中包含jsp 文件,而只使用您需要的行,例如&lt;meta&lt;script&lt;link 吗?我对 JSP 不太了解,如果我错了,请纠正我。
  • 当然你“可以”。真正的问题是:'有两个头部标签是否有效?'。答案是否定的,遵循 W3C 规范

标签: html jsp


【解决方案1】:

良好的回应@Gwenc37。您可以在任何其他标签中包含任何标签,但最好始终遵守 W3C 标准和规范。在项目的后期,您可能会遇到 HTML 无法在浏览器中正确解析的情况,甚至会出现更严重的中断。

为了安全起见,请遵守 W3C 标准。这样你就不会出错。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    根据standard无效

    相关部分:

    4.2.1 头部元素

    分类: 没有。

    可以使用此元素的上下文: 作为 html 元素中的第一个元素。

    您的第二个 &lt;head&gt; 元素不会是 html 文档中的第一个元素。

    【讨论】:

    • 从技术上讲,您引用的文件说:“这是一份草稿文件,可能随时被其他文件更新、替换或废弃。除了正在进行的工作之外,引用这份文件是不恰当的。”但是所有 HTML 规范和草案的原则都是一样的:每个文档只允许一个 head 元素。
    • 当然,因为 HTML5 规范仍处于 RC 状态,但发帖人要求 HTML5,正如所选标签所指出的那样。
    • 所以它不是标准,更不是“标准”。
    • 作为实际使用的示例,您可以查看learnxinyminutes.com/docs/html
    【解决方案3】:

    根据 W3C 标准,不!你不能拥有它。

    在您的情况下,您使用 JSP 作为服务器端脚本。该问题可以通过对样式表/脚本/其他 html 元素使用 CONSTANTS 来解决。

    您只需要根据页面要求在“main.jsp”文件中添加条件。

    【讨论】:

      【解决方案4】:

      根据 W3C 标准,您不能有两个 HEAD 标签。

      关于您的问题,您可以调用不带 HEAD 标记的 header.jsp 文件,或者您可以重命名为 scripts.jsp 或 constants.jsp

      例如:

      Header.jsp

      <link rel="shortcut icon" href="<%=request.getContextPath()%>/images/favicon.ico" type="image/x-icon" />
      <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
      <script src="js/jquery.js"></script>
      <link rel=stylesheet type="text/css" href="dashboard.css" >
      

      Main.jsp

      <!DOCTYPE html>
      <html>
      <head> 
      <title>Main page</title>
      <script src="main.js"></script>
      <jsp:include page="Header.jsp" flush="true" />
      </head>
      <body> 
      ..... 
      other HTML contents specific to main page
      ..... 
      </body>
      </html>
      

      【讨论】:

        【解决方案5】:

        简短的回答是肯定的。

        这不是一个好的解决方案,但绝对可以。

        人们通常会从理论上回答这些问题,例如“不,因为按照标准它是无效的”。没错,不是。未来的浏览器可能不支持它,一些源解析器可能会感到困惑,检查你的投资组合的 HR/IT 专家可能会认为你知道的比 Jon Snow 少,以及各种各样的坏事。 理论上。但它确实发生在现实世界中,并且浏览器并不愚蠢:它们知道您的意思,它们同时获取 head 标签并按预期工作。 p>

        这绝非偶然。
        他们有很好的理由:

        1.头标签是可选的。 (请参阅文章下方的注释!)
        浏览器接受类似于头标签的内容,即使是在 它之外,因此实际上它们会忽略完全标记自己。如果他们忽略一个,他们可能也会忽略几个。

        2。访客是宝贵的。
        浏览器希望您享受您的时间。他们想向您展示他们可以从混乱中获得的最佳页面。 这是他们的意图,他们想向您展示互联网的工作原理,而不是告诉您您最喜欢的网站有多糟糕。如果他们能找出 html 代码想要表达的内容(并且结构中没有致命的歧义),他们会尽最大努力修复页面。

        3.糟糕的标记容忍度是一回事。
        浏览器不仅有耐心和宽容,而且有时他们会做一些杂技来让你的东西正常工作。看看这可怕的烂摊子:

        <!-- no doctype! -->
        <!-- no HTML tag! we're all gonna die! -->
        <head>
            <style>
                body {background:#002233;}
            </style>
        </head>
        <head><!-- let's twist again! -->
            <style>
                body {color:white}
            </style>
        <!-- we didn't even close the second one!! -->
        
        See this text?<br>
        With the background AND color properly set?<br>
        <br>
        Your browser's quite a badass.
        

        关于浏览器的容忍度,here's a lot more 有超级丑陋的例子——确保你在回来时忘记你所看到的一切!)

        所以是的,当然,原则是“成为您的浏览器的好朋友”,无论它如何巧妙地修复您的错误。但是,如果你在黑暗的地牢中醒来,周围有饥饿的狮子,你唯一的出路就是使用两个

        标签——好吧,不要犹豫!它不是语法错误,它不是严重违反了HTML5规则——它只不过是一个方便的作弊。并且不要相信非标准、不整洁的网站会繁荣得多的普遍神话:人们通常只是不确定并希望保持安全。通常,他们将地狱描述为验证失败的网络作者去的地方。

        TLDR:实际上,两个头部标签都可以工作。

        如果可能的话,现在请只有一个。


        附加说明

        正如@StanislavBerkov 所指出的,W3C 和 MDN 都建议 HEAD 标签是隐含的,这意味着最好完全保留head 标签。如果您有只使用其中一个的标准选项,我不会推荐这种方法,但没有显然比有两个更好。有关该主题的文档不是很清楚,因此请确保您在主要浏览器中测试所有内容 - 但同样,在实践中,您不会遇到任何问题。

        【讨论】:

        • 可能是我在 SO 上读到的写得最好的答案。内容丰富有趣,但仍然简洁。
        • 肯定是最佳答案
        • 值得添加评论:根据w3.org/TR/html401/struct/global.html for head Start tag: optional, End tag: optional。也根据developer.mozilla.org/en-US/docs/Web/HTML/Element/headThe start tag may be omitted if the first thing inside the &lt;head&gt; element is an element.。所以我们可以将head 视为隐含元素。只是不要使用head 标签并放置内容正确信息html 标签。 @dkellner 请更新您的帖子)
        • @StanislavBerkov 有趣的补充!此外,文档似乎有点不清楚 - “如果头中的第一件事是一个元素,则可以省略头”,好吧,但是当它没有开始标签时,你怎么知道哪个是元素中的第一个?它是否包括 html 标记后的换行符、缩进空格等。也许这只是 MDN 的措辞不佳。此外,“如果头元素后面的第一件事不是空格或注释,则可以省略结束标记”,同样的问题。也许我没有得到它。但无论如何,更新似乎是必要的!
        • 作为实际使用的示例,您可以查看learnxinyminutes.com/docs/html
        【解决方案6】:

        这是一个你可以尝试的想法

        在你的主要头脑中这样做

        <!DOCTYPE html> 
        <html>
        <head>
           <link rel="shortcut icon" href="<%=request.getContextPath()%>/images/favicon.ico" type="image/x-icon" />
           <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
           <script src="js/jquery.js"></script>
           <link rel=stylesheet type="text/css" href="dashboard.css" >
        

        请注意,我已经省略了结束头标记。 然后在所有文件中,您必须关闭 head 标签,或添加额外的标题内容,然后关闭您的 head 标签,例如

              <title>Main page</title>
              <script src="main.js"></script>
           </head>
           <body>
              <jsp:include page="Header.jsp" flush="true" />
              .....
              other HTML contents specific to main page
              .....
           </body>
        </html>
        

        至于您的页面标题,您可以运行一个小 php 来确定您在哪个页面上

        【讨论】:

          猜你喜欢
          • 2015-12-26
          • 2011-01-10
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多