代码编织梦想

URL API 是浏览器根据 Whatwg 的标准[https://url.spec.whatwg.org/]实现的一组 API。通常自己去写正则或循环去解析 URL 时,很难考虑全各种边边角角的问题,导致意想不到的错误。而有了这组 API,就可以方便准确地进行 URL 解析了。

URL 的组成

URL 的规范可以查看 ietf 的标准[https://tools.ietf.org/html/rfc3986],这里就简单说明一下其组成。

拿这个例子来看:http://www.example.com:8080/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument从前往后依次是

  • protocol 协议,http:
  • domain name 域名,www.example.com
  • port 端口,8080
  • path 路径,/path/to/myfile.html
  • parameters 参数,?key1=value1&key2=value2
  • anchor 锚点,#SomewhereInTheDocument

简单使用

URL API 的基本用法就把一个 url 的各部分都解析出来。如下:

let u = new URL('http://user:pass@www.example.com:8080/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument')
// 会返回包括如下属性的对象
//	hash: "#SomewhereInTheDocument"
//	host: "www.example.com"
//	hostname: "www.example.com"
//	href: "http://www.example.com/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument"
//	origin: "http://www.example.com"
//	password: "pass"
//	pathname: "/path/to/myfile.html"
//	port: "8080"
//	protocol: "http:"
//	search: "?key1=value1&key2=value2"
//	username: "user"

这样就可以得到 url 中对应的各个部分。

这里面需要注意的一点是,如果给这些属性设置新的值,那么同时 href 的值也会对应改变。

console.log(u.href) // 'http://user:pass@www.example.com:8080/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument'
u.port = 9090
console.log(u.href) // 'http://user:pass@www.example.com:9090/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument'

URL 对象除了上述所示属性外,还提供了 searchParams 属性,这个属性是一个 URLSearchParams 对象,在这个对象上可以访问如下方法:append(), delete(), entries(), forEach(), get(), getAll(), has(), keys(), set(), sort(), toString(), values()。这里面常用的就是 get, set, keys, values 等,这些方法作用和字面意思一样,然后我们就以例子来理解一下。

u.searchParams.get('key1') // "value1"
u.searchParams.getAll('key1') // ["value1"] 返回所有 key 为 "key1" 的 value 组成的数组。
u.searchParams.has('kkk') // false 是否包含 key 等于 “kkk”

u.searchParams.toString() // "key1=value1&key2=value2&key1=value1"

u.searchParams.forEach((value, key) => { // 跟数组 forEach 类似
	console.log(key, value)  // key1, value1 // key2, value2 // ...
})

let entriesIter = u.searchParams.entries() // 返回一个 entries 的 Iterator
for (let entry of entriesIter) {
	console.log(entry) // ["key1", "value1"] // ["key2", "value2"] // ...
}

let keysIter = u.searchParams.keys() // 返回一个 keys 的 Iterator
for (let key of keysIter) {
	console.log(key) // "key1" // "key2" // ...
}

let valuesIter = u.searchParams.values() // 返回一个 values 的 Iterator
for (let value of valuesIter) {
	console.log(value) // "value1" // "value2" // ...
}

u.searchParams.sort() // 和数组方法一样,会改变原数据
u.searchParams.toString() // "key1=value1&key1=value1&key2=value2"

u.searchParams.set('key1', 'newValue1') // 改变 key1 的值为 “newValue1”
u.searchParams.delete('key1') // 会删掉所有 key 为 key1 的项
u.searchParams.append('key1', 'value1') // 会增加一项 key1=value1,不管是否存在 key1=value1,都会增加一个新项,不会修改之前存在的key和value

上面这些方法中 append, delete, set, sort 都会修改原数据,这些改变也都实时表现到 href 属性上。

其它方法

除了上述对 URL 的解析操作外,URL.createObjectURL() 有时我们也会使用到,比如预览本地图片;通过 Ajax 去下载文件等。它的作用是可以把一个 File,Blob,MediaSource 对象变成一个 URL 字符串,通过这个 URL 浏览器可以访问到原对象。另外需要注意,生成的 URL 的有效期是和 document 绑定的,所以当你使用完之后,一定记得把这部分内容从内存中释放。对应释放的方法为URL.revokeObjectURL()

我这里截取 mdn[https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications#Example_Using_object_URLs_to_display_images] 上一个例子的一部分代码,来简单说明一下:

const img = document.createElement("img");
img.src = URL.createObjectURL(file); // 这里 file 是一个 File 对象
img.height = 60;
img.onload = function() {
  URL.revokeObjectURL(this.src); // 在图片加载完之后,不需要再访问这个图片,就从内存中释放掉
}

URL 部分其实还涉及到一些序列化、转码等问题,这些问题先记下来,之后有时间整理一下。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_49067499/article/details/107131397

axios+qs简单实现post请求form-data格式-爱代码爱编程

axios+qs简单实现post请求form-data格式 有的时候后台接口以form-data的格式来接收参数,那么默认的写法后台是拿不到参数的,这个时候前端必须得以form-data的格式来传递 核心知识 1.引入qsnpm install -save qs #or <script src="https://cdn.bootcdn.n

JavaScript基础之this到底指向哪里-爱代码爱编程

this的指向问题一直以来都是前端开发者找工作面试的重点,现在就聊聊这个this到底是何方神圣? ECMAScript中这样写到:this关键字执行为当前执行环境的thisBinding. MDN这样写到:绝大多数中,函数的调用决定了this的指向。 简单来说,this的指向是由于调用时候决定的,this具有运行期绑定的特性。 全局执行上下文:

Vue从零开始之VueRouter-爱代码爱编程

文章目录 VueRouter路由安装vue-router插件VueRouter+ElementUI基本使用创建项目,安装依赖修改目录结构创建首页视图创建登录页视图创建路由配置导入路由和ElementUI模板中渲染组件路由匹配规则路由跳转标签代码方式进行跳转VueRouter 动态路由

(精华)2020年7月4日 JavaScript高级篇 ES6(函数扩展)-爱代码爱编程

函数参数的默认值 function Person(name = '张三',age=18){ this.name = name this.age = age } let person1 = new Person() console.log(person1); // 好处 // 1 阅读代码清晰 // 2 有利于代买维护 有利于封装代码 /

Vue源码解析:Vue生命周期之从生到死(三)-爱代码爱编程

上俩片文章我们讲到了initLifecycle和initEvents函数,本篇是时候讲讲initInjections初始化函数了。该函数就是用来去实例化inject选项。说到inject,那就必然离不开provide,这俩是成对出现的,它们的作用是:允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

(精华)2020年7月4日 JavaScript高级篇 ES6(箭头函数)-爱代码爱编程

基本用法 // 没有参数 多个参数 需要用() 包裹起来 const fn = ()=>5 console.log(fn()); const fnG = (num1,num2)=>num1 + num2 console.log(fnG(1,2)); // 函数块的语句 多于一条语句的 要使用{} 包裹起来 并且要用return 返回 cons

Web API 之 — History API-爱代码爱编程

History API 允许我们用 js 来操作和访问用户的会话历史记录。在前端路由系统中,History 被广泛使用(对于不支持 History 的老 ie,可以使用 hashchange 事件处理)。History API 都是一些简单好用的功能,没有复杂的功能,知识点也少,今天就来温习一下这组 API。 后退和前进 先来学习两个基本 api。

禁用的表单输入未出现在请求中-爱代码爱编程

本文翻译自:Disabled form inputs do not appear in the request I have some disabled inputs in a form and I want to send them to a server, but Chrome excludes them from the request. 我在表单

检测设备是否为iOS-爱代码爱编程

本文翻译自:Detect if device is iOS I'm wondering if it's possible to detect whether a browser is running on iOS, similar to how you can feature detect with Modernizr (although this is

Web API 之 — Fullscreen API-爱代码爱编程

今天突然发现 Fullscreen API 竟然是在 Element 上的方法,之前一直以为是 window 上的,所以今天就来梳理一下这块儿的知识,全面地了解一下。 首先 Fullscreen API 提供的方法都是作用在 Element 和 Document 上的,所以,是可以让某个元素全屏展示的。接下来,我们来看如何全屏和退出全屏。 全屏和退出全

如何在所有现代浏览器中检测页面缩放级别?-爱代码爱编程

本文翻译自:How to detect page zoom level in all modern browsers? How can I detect the page zoom level in all modern browsers? 如何在所有现代浏览器中检测页面缩放级别? While this thread tells how to do it

自动检测移动浏览器(通过用户代理?)-爱代码爱编程

本文翻译自:Auto detect mobile browser (via user-agent?) [closed] 如何检测用户是否正在通过移动Web浏览器查看我的网站,以便随后可以自动检测并显示适当版本的网站? #1楼 参考:https://stackoom.com/question/4DU9/自动检测移动浏览器-通过用户代理 #2楼 Yes u