IE 的行为似乎符合预期。您的相对路径href
应该被解释为相对于当前路径,因为标记不知道服务器端的事物是如何构造的,除非您当然告诉它。
您在 Chrome 中遇到的问题也发生在我身上,这是应该的。如果您希望基于基本路径解析相对 url,您需要href
从一开始就提供它,或者通过以下<base>
标签提供它<head>
:
<!DOCTYPE html>
<html>
<head>
<base href="/app/" />
</head>
<body>
<?php var_dump($_GET); ?>
<ul>
<li><a href="event/7">Foo</a></li>
<li><a href="event/6">Bar</a></li>
</ul>
</body>
</html>
以上将按预期工作,因为我们已指示浏览器根据该部分href
中的<base>
元素解析任何相对路径<head>
。如果你不这样做,浏览器应该解析href
任何<a>
相对于当前路径的相对。
请特别注意规范中有关相对 URL 的这一部分:
用户代理必须根据以下优先级(从最高优先级到最低优先级)计算基本 URI:
- 基本 URI 由 BASE 元素设置。
- 基本 URI 由在协议交互期间发现的元数据给出,例如 HTTP 标头(参见 [RFC2616])。
- 默认情况下,基本 URI 是当前文档的 URI。并非所有的 HTML 文档都有一个基本的 URI(例如,一个有效的 HTML 文档可能出现在电子邮件中,并且可能不是由 URI 指定的)。如果此类 HTML 文档包含相对 URI 并依赖于默认的基本 URI,则认为它们是错误的。(重点补充)
同样,如果您希望看到相对href
值解析为您的基本 url,您需要在链接本身或通过<base>
元素提供该基础,如我在上面的示例中所做的那样。
需要考虑的其他事项:
我想回到这个问题并记录一些其他可能相关的事情。href
访问锚属性的各种方法会返回不同的结果。
考虑以下:
var anchor = document.createElement("a");
anchor.setAttribute("href", "foo.php?fizz=buzz");
console.log( "href: " + anchor.href );
console.log( "getAttribute: " + anchor.getAttribute("href") );
以下是我们看到的各种 Internet Explorer 版本的输出:
互联网浏览器 6 - 7:
href: foo.php?fizz=buzz
getAttribute: foo.php?fizz=buzz
互联网浏览器 8 - 10:
href: http://fiddle.jshell.net/_display/foo.php?fizz=buzz
getAttribute: foo.php?fizz=buzz
从 Internet Explorer 8 开始,该.href
属性会根据当前文档位置自动解析完整的 URI,并将锚点的href
值附加到末尾。这与我们在其他现代浏览器中看到的行为相同。
因此,如果您只需要获取href
值,明智的做法是使用.getAttribute("href")
而不是访问.href
属性。