HTML可以包含两个HEAD标记

时间:2014-06-11 08:14:11

标签: html html5 jsp

在我的Web应用程序中,我获得了包含默认标头内容的Header.jsp文件。我在所有其他页面中使用jsp:include标签将其包含在每个页面的body标签内。

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>

这样做是否有效?

6 个答案:

答案 0 :(得分:47)

简短的回答是“是”。

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

人们通常在理论上回答这些问题,例如&#34; no,因为它不符合标准&#34; 。没错,不行。未来的浏览器可能不支持它,一些源解析器可能会混淆,HR / IT专家检查您的投资组合可能认为您比Jon Snow知道的更少,以及各种不好的事情。 理论上。但它确实发生在现实世界中,并且浏览器并不愚蠢:他们知道你的意思,他们采用两个头标记并按预期工作。

而且这不只是偶然的机会 他们有很好的理由:

<强> 1。头标记是可选的。
浏览器甚至接受标题内容甚至之外,因此实际上它们完全忽略了标记本身。如果他们忽略了一个,他们也可能会忽略几个。

<强> 2。访客很珍贵。
浏览器希望您享受您的时间。他们希望向您展示他们可以从他们所拥有的混乱中创建的最佳页面。 这是他们的意图,他们想告诉你互联网有效,而不是教你最喜欢的网站有多糟糕。如果他们能够找出html代码想要表达的内容(并且结构中没有致命的歧义),他们将尽力修复页面。

第3。糟糕的标记容忍是一件事。
浏览器不仅耐心而且宽容,但有时他们会做杂技动作来让你的东西工作。看看这个可怕的混乱:

    var parsedSoap = XElement.Parse(soapMessage);
    XNamespace  payPalResponseNs ="urn:ebay:api:PayPalAPI";
    XNamespace resultingResponseNs = "urn:ebay:apis:eBLBaseComponents";
    parsedSoap.Descendants()
              .Where(x=> x.Name == payPalResponseNs+"SetExpressCheckoutResponse")
              .Select(x=> new 
                    {
                        Timestamp = x.Element(resultingResponseNs +"Timestamp")?.Value,
                        Ack = x.Element(resultingResponseNs +"Ack")?.Value,
                        CorrelationID = x.Element(resultingResponseNs +"CorrelationID")?.Value,
                        Version = x.Element(resultingResponseNs +"Version")?.Value,
                        Build = x.Element(resultingResponseNs +"Build")?.Value,
                        Token = x.Element(payPalResponseNs +"Token")?.Value
                    }
                    );

关于浏览器容差,here's a lot more以及超级丑陋的例子 - 确保您忘记了当您回来时所见到的一切!)

所以是的,当然,原则是&#34;成为浏览器的好朋友&#34;,无论它如何巧妙地修复你的错误。但是,如果你在一个黑暗的地牢中醒来,周围有饥饿的狮子,你唯一的出路就是使用两个&lt; head&gt;标签 - 好吧,不要犹豫!它没有 并且不要因为普遍的神话而感到沮丧,因为非标准,非整洁的网站繁荣得更厉害:人们通常只是不确定并且想要保持安全。通常情况下,他们将地狱描述为验证者失败的网络作者所在的地方。

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

现在请尽可能只有一个。

答案 1 :(得分:11)

根据standard

,它无效

相关部分:

  

4.2.1头元素

     

类别:       没有。

     

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

您的第二个<head>元素不会是html文档中的第一个元素。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

在你的主脑中做这个

<!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" >

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

      <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来确定你在哪个页面

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

根据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>