在决定是否使用<base>
标签之前,您需要了解它是如何工作的,它可以用于什么以及它的含义是什么,并最终超过优点/缺点。
该<base>
标签主要简化了在模板语言中创建相对链接的过程,因为您无需担心每个链接中的当前上下文。
你可以做例如
<base href="${host}/${context}/${language}/">
...
<link rel="stylesheet" href="css/style.css" />
<script src="js/script.js"></script>
...
<a href="home">home</a>
<a href="faq">faq</a>
<a href="contact">contact</a>
...
<img src="img/logo.png" />
代替
<link rel="stylesheet" href="/${context}/${language}/css/style.css" />
<script src="/${context}/${language}/js/script.js"></script>
...
<a href="/${context}/${language}/home">home</a>
<a href="/${context}/${language}/faq">faq</a>
<a href="/${context}/${language}/contact">contact</a>
...
<img src="/${context}/${language}/img/logo.png" />
请注意,该<base href>
值以斜杠结尾,否则将相对于最后一个路径进行解释。
至于浏览器兼容性,这只会在 IE 中引起问题。该<base>
标记在 HTML 中指定为没有结束标记</base>
,因此仅在<base>
没有结束标记的情况下使用是合法的。但是 IE6 不这么认为,在这种情况下,标记之后的整个内容都作为元素的子元素放置在 HTML DOM 树中。乍一看,这可能会导致 Javascript/jQuery/CSS 中出现无法解释的问题,即元素在特定选择器中完全无法访问,例如,直到您在 HTML DOM 检查器中发现应该有一个(和)之间。<base>
<base>
html>body
base
head
一个常见的 IE6 修复是使用 IE 条件注释来包含结束标记:
<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->
如果您不关心 W3 验证器,或者您已经在使用 HTML5,那么您可以自行关闭它,每个网络浏览器都支持它:
<base href="http://example.com/en/" />
关闭<base>
标签还可以立即修复 IE6 在 WinXP SP3 上的疯狂问题,即在无限循环中<script>
使用相对 URI请求资源。src
当您在标签中使用相对 URI <base>
(例如<base href="//example.com/somefolder/">
或)时,另一个潜在的 IE 问题将显现出来<base href="/somefolder/">
。这将在 IE6/7/8 中失败。然而,这并不完全是浏览器的错。在标签中使用相对 URI<base>
本身就是错误的。HTML4 规范声明它应该是一个绝对 URI,因此以orhttp://
方案https://
开头。这已在HTML5 规范中被删除。因此,如果您使用 HTML5 并仅针对与 HTML5 兼容的浏览器,那么在<base>
标签中使用相对 URI 应该没问题。
至于使用命名/散列片段锚点<a href="#anchor">
,查询字符串锚点<a href="?foo=bar">
和路径片段锚点<a href=";foo=bar">
,<base>
您基本上是在声明相对于它的所有相对链接,包括那些类型的锚点。所有的相对链接都不再是相对于当前请求 URI 的(就像没有<base>
标签的情况一样)。首先,这可能会让初学者感到困惑。要以正确的方式构建这些锚点,您基本上需要包含 URI,
<a href="${uri}#anchor">hash fragment</a>
<a href="${uri}?foo=bar">query string</a>
<a href="${uri};foo=bar">path fragment</a>
其中${uri}
基本上转换为$_SERVER['REQUEST_URI']
PHP、${pageContext.request.requestURI}
JSP 和#{request.requestURI}
JSF。应该注意的是,像 JSF 这样的 MVC 框架有标签,减少了所有这些样板文件并消除了对<base>
. 另请参阅 ao用于链接/导航到其他 JSF 页面的 URL。