浏览器的location对象拥有很多方便的属性用于获取当前URL的组成部分:
location.protocol
:协议名location.username
:用户名location.password
:密码location.hostname
:主机名location.port
:端口号location.host
:主机名和端口号location.pathname
:路径location.search
:查询串location.hash
:书签名
在较新(未测试,估计是支持跨域XHR之后的)浏览器中,还有
location.origin
:协议名、主机名和端口号
可以使用。
可以看出location的属性是非常方便的URL解析器。但是其局限是只能解析当前URL的组成部分。如果我们要解析任意URL的组成部分,使用location是无法完成的。location的构造器Location是无法在JavaScript中手动创建的。所以如果我们要解析任意URL还需要找别的办法。
查询了MDN,发现Location中获得URL的组成部分的属性都来自于一个叫URLUtil的接口。然后惊喜的发现实现这个接口的接口有三个:Location、HTMLAnchorElement、HTMLAreaElement。Location不能手动创建,但是后两者都是可以用JavaScript手动创建的。
所以我们有了解决方案:
- 构造一个HTMLAnchorElement(或者HTMLAreaElement)对象。
- 将该对象的href设置为要解析的URL。
- 获得对象的相关属性。
在JSFiddle上做了基本实现:
PS. 我在IE8中测试发现以下几点差别:
- 前文提到的没有origin属性
- 如果没在URL中指定端口号,host属性中会返回一个默认的端口号。
- 如果URL中有username部分,那么无法获取任何一个部分,给出安全错误。
PS2. 如果没有很高的兼容性需求,HTML5还提供了URL接口,可以更方便的进行URL解析。