众所周知,咱们能够经过location
得到当前页面地址(URL)的href
、protocol
、host
、search
、hash
等属性,可是若是给你一个url字符串,怎么获得这些属性呢?也许用正则是一个方法。html
假设有这样一个 url 字符串"https://demo.vczhan.com/wave/heart-wave.html?name=abc&age=18#part"
,该怎么解析它呢。跨域
直接把url赋值给location.href
会从当前页面跳转到 url 的页面,若是咱们在当前页面新建一个iframe
并给它的src
赋值这个 url ,彷佛能够经过iframe的window.location
拿到url的各个属性。
可是很遗憾,对于跨域的url,不会触发iframe的window.onload
,直接访问location.href
,浏览器也给出提示限制跨域。浏览器
提到 url ,可能会有人想到<a>
标签,由于咱们常常访问页面地址是经过点击a
连接跳转的,那么可否经过它来解析 url 呢?
咱们建立了一个a
元素,并给它的href
赋值了 url ,能够打印出这个a
元素的对象,其中就包括 url 的这些属性。
而且能够利用它简单判断一个 url 是不是合法的,不合法的 url,host
, origin
为null
app
利用a
元素来解析 url 算是奇淫巧技吧,其实现代浏览器提供了一个建立的URL对象的构造函数—URL()
,直接把url看成参数传入,就会返回一个URL对象。
返回的URL对象有个searchParams
属性,能够对 url 的search
部分解析,不再须要用循环或正则方式获取search
对象。函数
var url = 'https://demo.vczhan.com/wave/heart-wave.html?name=abc&age=18#part' var searchParams = new URL(url).searchParams searchParams.get('name') // abc searchParams.has('age') // 18
固然,有个专门处理search
的API:URLSearchParams
url
// {a: 1, b: 2} -> a=1&b=2 new URLSearchParams({a: 1, b: 2}).toString() // a=1&b=2 -> {a: "1", b: "2"} var obj ={} var searchParams = new URLSearchParams('?a=1&b=2') // searchParams.has('a') // true // searchParams.get('a') // 1 // searchParams.append('c', '3'); searchParams.toString() // "a=1&b=2&c=3" for(var [key, value] of searchParams.entries()) { obj[key] = value } console.log(obj)
更详细的请参考下方连接
URL:https://developer.mozilla.org...
URLSearchParams:https://developer.mozilla.org...spa