URL
是浏览器原生提供的对象,同时也是一个构造函数,可以用来构造、解析和编码 URL。一般情况下,通过window.URL
可以拿到。
构造函数
URL作为构造函数,可以生成 URL 实例。它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。
var url = new URL('http://www.example.com/index.html');
url.href
// "http://www.example.com/index.html"
如果参数是另一个 URL 实例,构造函数会自动读取该实例的href
属性,作为实际参数。
如果 URL 字符串是一个相对路径,那么需要表示绝对路径的第二个参数,作为计算基准。
var url1 = new URL('index.html', 'http://example.com');
url1.href
// "http://example.com/index.html"
var url2 = new URL('page2.html', 'http://example.com/page1.html');
url2.href
// "http://example.com/page2.html"
var url3 = new URL('..', 'http://example.com/a/b.html')
url3.href
// "http://example.com/"
实例属性
URL 实例的属性与Location
对象的属性基本一致,返回当前 URL 的信息。
- URL.href:返回整个 URL
- URL.protocol:返回协议,以冒号
:
结尾 - URL.hostname:返回域名
- URL.host:返回域名与端口,包含
:
号,默认的80和443端口会省略 - URL.port:返回端口
- URL.origin:返回协议、域名和端口
- URL.pathname:返回路径,以斜杠
/
开头 - URL.search:返回查询字符串,以问号
?
开头 - URL.searchParams:返回一个
URLSearchParams
实例,该属性是Location
对象没有的 - URL.hash:返回片段识别符,以井号
#
开头 - URL.password:返回域名前面的密码
- URL.username:返回域名前面的用户名
这些属性里面,只有origin
属性是只读的,其他属性都可写。
searchParams
URLSearchParams
对象是浏览器的原生对象,用来构造、解析和处理 URL 的查询字符串(即 URL 问号后面的部分)。
它本身也是一个构造函数,可以生成实例。参数可以为查询字符串,起首的问号?
有没有都行,也可以是对应查询字符串的数组或对象。
// 方法一:传入字符串
var params = new URLSearchParams('?foo=1&bar=2');
// 等同于
var params = new URLSearchParams(document.location.search);
// 方法二:传入数组
var params = new URLSearchParams([['foo', 1], ['bar', 2]]);
// 方法三:传入对象
var params = new URLSearchParams({'foo' : 1 , 'bar' : 2});
静态方法
URL.createObjectURL()
**URL.createObjectURL()**
静态方法会创建一个 [DOMString](https://developer.mozilla.org/zh-CN/docs/Web/API/DOMString)
,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 [document](https://developer.mozilla.org/zh-CN/docs/Web/API/Document)
绑定。这个新的URL 对象表示指定的 [File](https://developer.mozilla.org/zh-CN/docs/Web/API/File)
对象或 [Blob](https://developer.mozilla.org/zh-CN/docs/Web/API/Blob)
对象。
URL.createObjectURL()
方法用来为上传/下载的文件、流媒体文件生成一个 URL 字符串。这个字符串代表了File对象或Blob对象的 URL。通常将url用于a、img等元素中,常用于下载或展示文件。
实例:预览上传的图片
<input type="file" accept="image/*" />
<img src="" alt="" />
<script>
const inp = document.querySelector('input')
const img = document.querySelector('img')
inp.onchange = function () {
const blob = URL.createObjectURL(inp.files[0])
img.setAttribute('src', blob)
}
</script>
实例:从服务器请求得到excel的二进制数据,然后通过创建url下载文件。
import XLSX from "xlsx";
/**
* @description 将一个sheet转成最终的excel文件的blob对象
* @param {XLSX.utils.json_to_sheet} sheet
* @returns {String} sheetName
*/
export function sheetToBlob(sheet, sheetName) {
sheetName = sheetName || "sheet1";
var workbook = {
SheetNames: [sheetName],
Sheets: {},
};
workbook.Sheets[sheetName] = sheet; // 生成excel的配置项
var wopts = {
bookType: "xlsx", // 要生成的文件类型
bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type: "binary",
};
var wbout = XLSX.write(workbook, wopts);
var blob = new Blob([s2ab(wbout)], {
type: "application/octet-stream",
}); // 字符串转ArrayBuffer
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
return buf;
}
return blob;
}
/**
* @description 将sheetToBlob转化的blob对象利用URL.createObjectURL下载为excel文件
* @param {ArrayBuffer} blob
* @returns {String} saveName
*/
export function downloadExcel(blob, saveName) {
if (typeof blob == "object" && blob instanceof Blob) {
var url = URL.createObjectURL(blob); // 创建blob地址
}
var aLink = document.createElement("a");
aLink.href = url;
aLink.style.display = "none";
aLink.download = saveName || ""; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink); //下载完成移除元素
window.URL.revokeObjectURL(url); //释放掉blob对象
}
URL.revokeObjectURL()
URL.revokeObjectURL()方法用来释放URL.createObjectURL()方法生成的 URL 实例。它的参数就是URL.createObjectURL()方法返回的 URL 字符串。
参考
MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/URL/URL
https://wangdoc.com/javascript/bom/location.html
常用操作
键值对拼接成URL参数
const params2Url = (uri, params) => {
const paramsArray = [];
Object.keys(params).forEach(
(key) => params[key] && paramsArray.push(`${key}=${params[key]}`)
);
if (uri.search(/\?/) === -1) {
uri += `?${paramsArray.join("&")}`;
} else {
uri += `&${paramsArray.join("&")}`;
}
return uri;
};
let params = {
keyword: "t",
page: 1,
size: 2,
};
params2Url('/datasource/check/p', params)