朋友们,美好的一天!
我提请您注意Dmitri Pavlutin的文章“如何在JavaScript中解析URL:主机名,路径名,查询,哈希”的翻译。
统一资源定位符或简称URL是指向Web资源(网页,图像,文件)的链接。URL定义资源的位置以及如何接收资源-协议(http,ftp,mailto)。
例如,这是本文的URL:
https://dmitripavlutin.com/parse-url-javascript
通常有必要检索URL的某些元素。这可以是主机名(hostname,
dmitripavlutin.com
)或路径名(pathname,/parse-url-javascript
)。
获取URL的各个组件的便捷方法是使用构造函数
URL()
。
在本文中,我们将讨论URL的结构和主要组成部分。
1. URL结构
一张图片胜过千言万语。在上图中,您可以看到URL的主要组成部分:
2. URL构造函数()
构造
URL()
函数是使您能够解析(解析)URL组件的函数:
const url = new URL(relativeOrAbsolute [, absoluteBase])
参数
relativeOrAbsolute
可以是绝对URL或相对URL。如果第一个参数是相对链接,则第二个参数absoluteBase
是必需的,并且是作为第一个参数基础的绝对URL。
例如,让我们
URL()
使用绝对URL进行初始化:
const url = new URL('http://example.com/path/index.html')
url.href // 'http://example.com/path/index.html'
现在,让我们结合相对和绝对URL:
const url = new URL('/path/index.html', 'http://example.com')
url.href // 'http://example.com/path/index.html'
href
instance
属性URL()
返回传递的URL字符串。
创建实例后
URL()
,您可以访问URL组件。供参考,这是实例接口URL()
:
interface URL {
href: USVString;
protocol: USVString;
username: USVString;
password: USVString;
host: USVString;
hostname: USVString;
port: USVString;
pathname: USVString;
search: USVString;
hash: USVString;
readonly origin: USVString;
readonly searchParams: URLSearchParams;
toJSON(): USVString;
}
在这里,类型
USVString
表示JavaScript应该返回一个字符串。
3.查询字符串
该属性
url.search
允许您获取以前缀开头的URL查询字符串?
:
const url = new URL(
'http://example.com/path/index.html?message=hello&who=world'
)
url.search // '?message=hello&who=world'
如果没有查询字符串,则
url.search
返回一个空字符串(''):
const url1 = new URL('http://example.com/path/index.html')
const url2 = new URL('http://example.com/path/index.html?')
url1.search // ''
url2.search // ''
3.1。解析(解析)查询字符串
除了获取原始查询字符串,我们还可以获取其参数。
该属性提供了一种简单的方法
url.searchParams
。此属性的值是URLSeachParams接口的实例。
该对象
URLSearchParams
提供了许多使用查询字符串参数(get(param), has(param)
等等)的方法。
让我们举个例子:
const url = new Url(
'http://example.com/path/index.html?message=hello&who=world'
)
url.searchParams.get('message') // 'hello'
url.searchParams.get('missing') // null
url.searchParams.get('message')
返回message
查询字符串参数的值。
访问不存在的参数
url.searchParams.get('missing')
将返回null
。
4.主机名(hostname)
该属性值
url.hostname
是URL的主机名:
const url = new URL('http://example.com/path/index.html')
url.hostname // 'example.com'
5.路径(路径名)
该属性
url.pathname
包含URL路径:
const url = new URL('http://example.com/path/index.html?param=value')
url.pathname // '/path/index.html'
如果URL没有路径,则
url.pathname
返回字符/
:
const url = new URL('http://example.com/');
url.pathname; // '/'
6.哈希
最后,可以通过属性获得哈希值
url.hash
:
const url = new URL('http://example.com/path/index.html#bottom')
url.hash // '#bottom'
如果没有哈希,它将
url.hash
返回一个空字符串(''):
const url = new URL('http://example.com/path/index.html')
url.hash // ''
7.检查(验证)URL
调用构造函数
new URL()
不仅可以创建实例,还可以验证传递的URL。如果URL无效,则将其丢弃TypeError
。
例如,这
http ://example.com
不是有效的网址,因为后面http
有一个空格。
让我们尝试使用以下URL:
try {
const url = new URL('http ://example.com')
} catch (error) {
error // TypeError, "Failed to construct URL: Invalid URL"
}
由于
'http ://example.com'
错误的网址按预期方式new URL('http ://example.com')
抛出TypeError
。
8.使用URL
诸如
search, hostname, pathname, hash
可写的属性。
例如,让我们将现有URL的主机名从
red.com
更改为blue.io
:
const url = new URL('http://red.com/path/index.html')
url.href // 'http://red.com/path/index.html'
url.hostname = 'blue.io'
url.href // 'http://blue.io/path/index.html'
属性
origin, searchParams
是只读的。
9.结论
构造函数
URL()
是解析(解析)和验证JavaScript中URL的一种非常方便的方法。
new URL(relativeOrAbsolute, [, absoluteBase]
将绝对或相对URL作为第一个参数。如果第一个参数是相对URL,则第二个参数必须是绝对URL-第一个参数的基础。
创建实例后
URL()
,您可以访问URL的主要组件:
url.search
-原始查询字符串url.searchParams
-URLSearchParams
获取查询字符串参数的实例url.hostname
- 主机名url.pathname
- 办法url.hash
-哈希值