中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中關于URL的內容詳介

發布時間:2020-07-08 14:19:04 來源:億速云 閱讀:158 作者:Leah 欄目:web開發

這期內容當中小編將會給大家帶來有關JavaScript中關于URL的內容詳介,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

伴隨著微信消息的提示音 小四 發來一段代碼說 不知道為什么請求不到頁面數據:

axios.get('users', {
    params: { ids: [1, 2, 3] }
})

小二一看大概率是 query 中數組傳遞方式引起的,由于后端實現解析數組 ids:[5, 6, 100] 可能有以下幾種方式:

bracket: ids[]=1&ids[]=2&ids[]=3
index: ids[0]=1&ids[1]=2&ids[3]=3
comma: ids=1,2,3
none: ids=1&ids=2&ids=3

小四分別測試后便把問題解決了,這也讓小二想起 小熊貓哥哥 在開發的時候,也遇到過這個問題網上一搜發現別人用 qs 庫中的 stringify 直接代碼一試沒報錯能運行,不管它的原理是什么,現在想想挺可怕的。

雖然天天和 URL 打交道但并不是所有人都懂它。

對于為什么代碼能運行也不是所有人都會去深究它。

現原形

利用 URL() 對象可以快速的把一個 url地址 打回原形:

腳本

const url = new URL('http://www.pushme.top/users?sort_by=asc#page=userlist')
console.log(url)
輸出
{
    hash: "#page=userlist"
    host: "www.pushme.top"
    hostname: "www.pushme.top"
    href: "http://www.pushme.top/users?sort_by=asc#page=userlist"
    origin: "http://www.pushme.top"
    password: ""
    pathname: "/users"
    port: ""
    protocol: "http:"
    search: "?sort_by=asc"
    searchParams: URLSearchParams {}
    username: ""
}

沒想到吧 小小的一段 url地址 里面居然有這么多屬性,在這里主要會講解的 hash 和 search。

推薦打開控制臺把腳本運行一下,這樣閱讀的時候就不需要上下對照查看了。

host 和 hostname

眼尖的同學肯定發現了 host 和 hostname 居然一模一樣這是為什么呢?

回憶一下開發經常在見到的 localhost:8080,這里出現了端口號 8080 而平時使用訪問一些網站的時候卻沒有帶上端口號。這是因為 url地址 會默認端口號為 80,所以你仔細看看會發現上面 port 的值為空。

而 host 和 hostname 的區別便是有 port 的時候 host 會包含端口號,而 hostname 不會包含。

protocol 和 origin

protocol 指的便是 協議 最常見的有 http 和 https,當然現在瀏覽器再不輸入協議時會自動幫你加上,不過在 URL() 不帶上協議可是會報錯的哦。origin 則為 protocel 和 host 拼接組成。

search 和 searchParams

基礎

?search=a 中 query 以第一個?開始至行尾或#結束。用于向后端傳遞一些數據,數據使用 & 進行分隔,值使用 = 分隔。通過一段代碼來理解一下:

const query = 'id=1&sort=asc&hello=world';
// 對 & 分割取得數據對
const data = query.split('&').reduce((data,keyValue) => {
    const [ key, value ] = keyValue.split('=');
    return (data[key] = value, data);
}, {});

// 輸出 {id: "1", sort: "asc", hello: "world"}
console.log(data);

這就是 query 最基礎的數據對的組合方式,當然開頭的四種 數組 的表達方式需要進行另外的處理,無外乎就是對 key 的收集 和 value 的判斷。不過這部分基本上后端的框架都幫我們處理好了,前端也可以使用 qs、query-string、qss 等庫來完成。

題外話:這幾個庫代碼都挺少的,值得一讀說不定有新收獲。

加號與空格

每天使用的 百度 和 谷歌 中不知道大家有沒有主要到這幾個細節:

輸入 https://www.baidu.com/s?wd=小二+pushmetop 搜索框中出現的是小二 pushmetop,地址欄中url地址的 + 神奇的變成了 空格。
輸入 https://www.baidu.com/s?wd=小二 pushmetop 搜索框中出現的是小二 pushmetop,地址欄中url地址的 空格 的變成 %20。
輸入 https://www.baidu.com/s?wd=小二%2Bpushmetop 搜索框中出現的是小二+pushmetop,地址欄中url地址的 %2B 的變成 +。

具體原因可以查看 維基百科 關于 保留字符的百分號編碼 。

URL 編碼

在 掘金 等網站點擊鏈接都會快速的閃現類似 http://www.pushmetop.com?redirect=xxxxx 的 url地址,會發現 redirect 對應的重定向地址會是一堆夾帶 % 的亂碼這是為什么呢?

讓我們假設需要跳轉的鏈接是 www.test.com?hello=world&id=1,把整個鏈接拼接起來則為:

http://www.pushmetop.com?redirect=www.test.com?hello=world&id=1

根據一開始的定義 解析值預期值 完全不同了:

解析值
{
    "redirect": "www.test.com?hello=world",
    "id": "1"
}
預期值
{
    "redirect": "www.test.com?hello=world&id=1"
}

為了解決這個問題便誕生了 URL編碼 來解決問題:

encodeURIComponent() 和 decodeURIComponent() 推薦使用。

encodeURI() 和 decodeURI() 對比前者不會對 "; / ? : @ & = + $ , #" 這些字符編碼。

escape() 和 unescape() 不推薦使用。

例子

let redirect = 'www.test.com?hello=world&id=1';
redirect = encodeURIComponent(redirect);

let url = `http://www.pushmetop.com?redirect=${redirect}`;
url = new URL(url)

// 輸出: www.test.com?hello=world&id=1
console.log(url.searchParams.get('redirect'))

hash

#hash 中 fragment 以 # 為開始 行尾 為結束。在 回到頂部 中有提到過利用hash錨點來進行跳轉,如果大家注意觀察的話會發現 hash 的改變不會引起頁面的刷新。

在 Angular.js、Vue Router 等庫中,會利用在 html5 中提供了 history 的一系列操作,來幫助我們不刷新頁面管理  url。但是在一些舊的瀏覽器上并不兼容時,會利用 hash 不會主動觸發瀏覽器 reload 的特性來修改 location.hash 來管理路由。 當然 hash 的另外一個特點是可以被保存為書簽,也是一大優點。

hash 的小妙用也可以像 query 那樣利用 & 和 = 來存取數據,當然你也可以定制屬于你的規則。

href 和 pathname

href 為整個 url地址。而 pathname 屬性包含 URL 的整個路徑部分。它跟在 host (包括 port)后面,排在 query 或 hash 組成部分的前面且被 ASCII 問號(?)或哈希字符(#)分隔。

username 和 password

username 和 password 在日常使用中很少用,它們可以合稱為 auth。該字符串跟在 protocol 和雙斜杠(如果有)的后面,排在 host 部分的前面且被一個 ASCII 的 at 符號(@)分隔:

http://username:password@www.pushme.top/test/blah?something=123

結尾

本來只是想討論 hash 和 search ,結果全都過一遍,今天就辛苦大家了。

上述就是小編為大家分享的JavaScript中關于URL的內容詳介了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖江市| 龙门县| 子长县| 信阳市| 津市市| 蚌埠市| 皋兰县| 句容市| 祥云县| 遂昌县| 盐津县| 大庆市| 大冶市| 达尔| 南乐县| 伊宁县| 揭东县| 日喀则市| 鄂尔多斯市| 广宗县| 扬中市| 平和县| 广汉市| 扶风县| 西乡县| 昭通市| 华蓥市| 喜德县| 祥云县| 资中县| 浦城县| 朔州市| 托里县| 佛冈县| 新沂市| 扎赉特旗| 高碑店市| 日喀则市| 钟山县| 兴城市| 革吉县|