HTML可以包含两个HEAD标记

问题描述 投票:19回答:6

在我的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>

这样做是否有效?

html html5 jsp
6个回答
11
投票

根据standard,这是无效的

相关部分:

4.2.1头部元素

分类:无。

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

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


51
投票

简短的回答是肯定的。

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

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

而且这不仅仅是偶然的。 他们有很好的理由:

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有超丑的例子 - 确保你忘记了你回来时看到的一切!)

所以是的,当然,原则是“成为您浏览器的好朋友”,无论它如何巧妙地修复您的错误。但是,如果你在一个黑暗的地牢中醒来,周围有饥饿的狮子,你唯一的出路是使用两个<head>标签 - 好吧,不要犹豫!它没有破坏语法,它不是严重违反HTML5规则 - 它只不过是一种方便的欺骗。并且不要因为非标准的,非整洁的网站繁荣更加普遍的普遍神话:人们通常只是不确定并且想要保持安全。通常情况下,他们将地狱描述为验证者失败的网络作者所在的地方。

TLDR:在实践中,两个头标签工作。

现在请尽可能只有一个。


2
投票

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

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


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

请注意,我已经离开了最终标签。然后在你的所有文件中,你必须关闭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来确定你在哪个页面


1
投票

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

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

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


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>
© www.soinside.com 2019 - 2024. All rights reserved.