在以前發的 工具方法文章的留言中有人就關於驗證網址的操做時可使用URL對象,以後有人提到了URLSearchParams這個URL對象接口。因爲以前沒有接觸過,因此搜索了一下具體的用處,發現這個接口的功能很實用,特此整理分享一下。
URLSearchParams
接口定義了一些實用的方法來處理 URL
的查詢字符串。參照html
從而咱們能夠知道,它是用來處理URL相關的。那具體都有哪些功能呢?ios
首先,咱們調用new URLSearchParams()
會返回一個 URLSearchParams
對象實例。在這個實例下面咱們能夠調用如下方法:git
append(name, value):插入一個指定的鍵/值對做爲新的搜索參數。
其中name
是須要插入搜索參數的鍵名,value
是須要插入搜索參數的對應值。github
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); //添加第二個foo搜索參數。 params.append('foo', 4); params.toString(); // 'foo=1&bar=2&foo=4'
delete(name):從搜索參數列表裏刪除指定的搜索參數及其對應的值。name
是須要刪除的鍵值名稱。ajax
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); //添加第二個foo搜索參數。 params.delete('foo'); params.toString(); // 'bar=2'
entries():返回一個iterator
能夠遍歷全部鍵/值對的對象。axios
// 建立一個測試用 URLSearchParams 對象 let searchParams = new URLSearchParams("key1=value1&key2=value2"); // 顯示鍵/值對 for(var pair of searchParams.entries()) { console.log(pair[0]+ ', '+ pair[1]); } // key1, value1 // key2, value2
get(name):獲取指定搜索參數的第一個值。name
是將要返回的參數的鍵名。返回一個USVString
;若是沒有,則返回null
。
若是一個頁面的URL是 https://example.com/?name=Jonathan&age=18
,你能夠這樣解析參數name
和age
:後端
let params = new URLSearchParams(document.location.search.substring(1)); let name = params.get("name"); // is the string "Jonathan" let age = parseInt(params.get("age"), 10); // is the number 18 // 查找一個不存在的鍵名則返回 null: let address = params.get("address"); // null
getAll(name):獲取指定搜索參數的全部值,返回是一個數組。name
是返回的參數的名稱。數組
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); //爲foo參數添加第二個值 params.append('foo', 4); console.log(params.getAll('foo'))' //輸出 ["1","4"].
has(name):返回 Boolean 判斷是否存在此搜索參數。name
是咱們要查詢的參數的鍵名。瀏覽器
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); params.has('bar') === true; //true
keys():返回iterator 此對象包含了鍵/值對的全部鍵名。微信
// 創建一個測試用URLSearchParams對象 let searchParams = new URLSearchParams("key1=value1&key2=value2"); // 輸出鍵值對 for(var key of searchParams.keys()) { console.log(key); } // key1 // key2
set(name, value):設置一個搜索參數的新值,假如原來有多個值將刪除其餘全部的值。
其中name
是須要插入修改參數的鍵名,value
是須要插入搜索參數的新值。
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); //Add a third parameter. params.set('baz', 3);
sort(): 按鍵名排序。
// Create a test URLSearchParams object let searchParams = new URLSearchParams("c=4&a=2&b=3&a=1"); // Sort the key/value pairs searchParams.sort(); // Display the sorted query string console.log(searchParams.toString()); // a=2&a=1&b=3&c=4
toString():返回搜索參數組成的字符串,可直接使用在URL上。
let url = new URL('https://example.com?foo=1&bar=2'); let params = new URLSearchParams(url.search.slice(1)); //Add a second foo parameter. params.append('foo', 4); console.log(params.toString()); //Prints 'foo=1&bar=2&foo=4'.
values():返回iterator 此對象包含了鍵/值對的全部值。
// 建立一個測試用URLSearchParams對象 let searchParams = new URLSearchParams("key1=value1&key2=value2"); // 輸出值 for(var value of searchParams.values()) { console.log(value); }
上面就是針對其全部的接口方法進行的一個梳理。然而,感受好像和咱們平時的關聯沒有很大呢?下面讓咱們來看幾個具體的使用場景。
咱們以前在獲取瀏覽器地址參數時不少時候是經過對地址進行分割,而後拼接字段對象的方式來作的,相似
function GetRequest() { let url = location.search; //獲取url中"?"符後的字串 let theRequest = new Object(); if (url.indexOf("?") != -1) { let str = url.substr(1); strs = str.split("&"); for (let i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]); } } return theRequest; }
可是咱們若是使用URLSearchParams
時就不用這麼繁瑣了
const params = new URLSearchParams(location.search) params.get(key)
在咱們使用axios
和fetch
來替換以前的ajax
進行數據請求時,咱們會遇到數據格式不一致的問題。
axios({ method: 'post', url: '/test', data: { name: 'li lei', age: 18 } })
上面的調用方法和咱們使用ajax時很是類似,咱們可能也會天然而然的這樣來寫,可是咱們會發現,其默認的數據格式是有差異的:
axios數據格式:
ajax數據格式:
是的,多了一層包裹,這樣和咱們後端的對接就出現問題了。哪怕是手動去修改ContentType爲application/x-www-form-urlencoded
仍然沒有解決。
那麼URLSearchParams能如何解決呢
let params = new URLSearchParams(); params.append('name', 'li lei'); params.append('age', 18); axios({ method: 'post', url: '/test', data: params })
工具好用,可是不可避免的兼容性並無那麼的理想。那咱們該怎麼辦呢?
工欲善其事,必先利其器
這是一個專門爲URLSearchParams製做的polyfill庫。具體的使用方法你們能夠參照庫的相關說明。在這主要再強調一下,這個庫可以解決瀏覽器的兼容性問題,可是在使用fetch進行請求調用時,咱們仍然須要手動去設置ContentType的值。引用該庫中給到的一個實例
function myFetch(url, { headers = {}, body }) { headers = headers instanceof Headers ? headers : new Headers(headers); if (body instanceof URLSearchParams) { headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); } fetch(url, { headers, body }); }
經過咱們對官方接口的說明以及實際場景的使用,詳細瞭解了URLSearchParams的主要功能和使用方法,但願可以在咱們之後的開發中起到幫助做用。
參考資料:
URLSearchParams API
使用URLSearchParams處理axios發送的數據
關注微信公衆號同步推送更新
![]()
或者能夠去Github上面給個Star