Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
家好,我是大澈!
本文約 600+ 字,整篇閱讀約需 1 分鐘。
每日分享一段優(yōu)質(zhì)代碼片段。
今天分享一段優(yōu)質(zhì) JS 代碼片段,從而比以往更簡(jiǎn)單的從 URL 中獲取查詢參數(shù)。
老規(guī)矩,先閱讀代碼片段并思考,再看代碼解析再思考,最后評(píng)論區(qū)留下你的見解!
const getQueryByName = (name) => {
const query = new URLSearchParams(location.search)
return decodeURIComponent(query.get(name))
}
// url: https://sunday.com/?name=fatfish&age=100
const name = getQueryByName('name') // fatfish
const age = getQueryByName('age') // 100
const gender = getQueryByName('gender') // null
分享原因
這段代碼通過(guò) URLSearchParams 對(duì)象簡(jiǎn)化了從 URL 中獲取查詢參數(shù)的過(guò)程。
通過(guò)這種方法,可以更方便地在 JavaScript 中解析和獲取 URL 查詢參數(shù),特別適用于處理需要從 URL 中提取參數(shù)的場(chǎng)景,比如讀取用戶在網(wǎng)頁(yè)中的輸入或搜索關(guān)鍵字等。
這是項(xiàng)目中一個(gè)很常見的操作,之前我們經(jīng)常會(huì)使用 正則表達(dá)式 或者 拆分字符串 來(lái)完成,現(xiàn)在有了更簡(jiǎn)單的方式!
代碼解析
1. const query = new URLSearchParams(location.search);
創(chuàng)建 URLSearchParams 對(duì)象。
URLSearchParams 是 Web API 的一部分,用于操作 URL 的查詢字符串。
location.search 返回當(dāng)前 URL 的查詢字符串(例如 ?name=value&key=value)。
URLSearchParams 對(duì)象將其解析為一個(gè)可以操作的查詢參數(shù)對(duì)象。
2. decodeURIComponent(query.get(name));
query.get(name) 方法從查詢參數(shù)對(duì)象中獲取名稱為 name 的參數(shù)值。
decodeURIComponent 用于對(duì)參數(shù)值進(jìn)行解碼,以確保返回的值是一個(gè)人類可讀的字符串,避免 URL 編碼帶來(lái)的問(wèn)題(例如 %20 代表空格)。
- end -
大多數(shù)用戶來(lái)說(shuō),Web服務(wù)最具有吸引力的就是Web的按需操作。當(dāng)用戶需要時(shí),就能得到他想要的內(nèi)容。而對(duì)于正在閱讀這份文檔的你來(lái)說(shuō),HTTP真的很重要,因?yàn)橹灰銖氖掠?jì)算機(jī)行業(yè),估計(jì)就離不開它。
1.HTTP概況
HTTP協(xié)議由兩部分程序?qū)崿F(xiàn):一個(gè)客戶機(jī)程序和一個(gè)服務(wù)器程序,它們運(yùn)行在不同的端系統(tǒng)中,通過(guò)交換HTTP消息進(jìn)行會(huì)話。HTTP定義了瀏覽器和Web服務(wù)器之間的消息格式以及客戶機(jī)和服務(wù)器是如何進(jìn)行消息交換的。
HTML是超文本標(biāo)記語(yǔ)言,定義了網(wǎng)頁(yè)的表現(xiàn)形式,例如字體、排版等。
Web頁(yè)面是由對(duì)象組成的。對(duì)象(object)簡(jiǎn)單來(lái)說(shuō)就是文件,如HTML文件、JPEG圖形文件、Java小程序或視頻片段文件,這些文件可通過(guò)一個(gè)URL地址尋址。多數(shù)Web頁(yè)面含有一個(gè)基本HTML文件以及幾個(gè)引用對(duì)象(你看到的web頁(yè)是瀏覽器根據(jù)HTML語(yǔ)法,將多個(gè)對(duì)象文件渲染而成的)。
例如,如果一個(gè)Web頁(yè)面包含HTML文本和5個(gè)JPEG圖形文件,那么這個(gè)Web頁(yè)面有6個(gè)對(duì)象:一個(gè)基本HTML文件加5個(gè)圖片。在基本HTML文件中通過(guò)對(duì)象的URL地址對(duì)對(duì)象進(jìn)行引用。在服務(wù)器磁盤中,這個(gè)HTML文件和圖片是分開存放的。瀏覽器獲得這些對(duì)象后,進(jìn)行渲染,把它們組合在一起呈現(xiàn)給用戶。
URL地址由兩部分組成:存放對(duì)象的服務(wù)器主機(jī)名和對(duì)象的路徑名。
例如,URL地址
http://www.someschool.edu.cn/images/Department.gif
中的http://www.someschool.edu.cn就是主機(jī)名,images/Department.gif是路徑名。當(dāng)用戶請(qǐng)求一個(gè)Web頁(yè)面時(shí),瀏覽器向服務(wù)器發(fā)出對(duì)該頁(yè)面中所有包含對(duì)象的HTTP請(qǐng)求消息,服務(wù)器接受請(qǐng)求并生成包含這些對(duì)象HTTP響應(yīng)消息進(jìn)行響應(yīng)。
HTTP使用TCP而不是UDP作為它的傳輸層協(xié)議。瀏覽器發(fā)起一個(gè)與服務(wù)器的TCP連接,一旦連接建立,瀏覽器和服務(wù)器進(jìn)程就可以通過(guò)套接字接口(就是發(fā)送/接收函數(shù)調(diào)用)訪問(wèn)TCP。
HTTP是無(wú)狀態(tài)的。服務(wù)器向客戶機(jī)發(fā)送被請(qǐng)求的文件時(shí),并不存儲(chǔ)任何關(guān)于該客戶機(jī)的狀態(tài)信息。假如一個(gè)特定的用戶在幾秒鐘內(nèi)多次請(qǐng)求同一個(gè)對(duì)象,服務(wù)器并不會(huì)因?yàn)閯倓倿樵撚脩籼峁┝嗽搶?duì)象就不再做出反應(yīng),而是重新發(fā)送該對(duì)象。但服務(wù)器一般會(huì)在日志文件中記錄用戶的訪問(wèn)歷史。
2.非持久連接和持久連接
如果瀏覽器使用一個(gè)TCP連接向服務(wù)器請(qǐng)求一個(gè)Web頁(yè)面對(duì)象,也就是說(shuō)請(qǐng)求一個(gè)對(duì)象后這個(gè)連接就關(guān)閉了,就稱為HTTP的非持久連接。
如果瀏覽器使用一個(gè)TCP連接向服務(wù)器請(qǐng)求多個(gè)Web頁(yè)面對(duì)象,那么稱為持久連接。
例如上面那個(gè)Web頁(yè)面有6個(gè)對(duì)象,使用非持久連接,將打開6個(gè)TCP連接取回所有對(duì)象。若使用持久連接,理論上只需要一次TCP連接。
現(xiàn)在的瀏覽器通常使用持久連接,即使選擇了HTTP1.0。
瀏覽器通常使用并行的TCP連接來(lái)加快Web頁(yè)面的獲取。例如Firefox瀏覽器,在其配置頁(yè)面about:config中就可以方便地設(shè)置訪問(wèn)單個(gè)Web服務(wù)器的最大TCP連接數(shù)目。如果將最大并行連接數(shù)設(shè)置為1,這樣在非持久連接中TCP連接就會(huì)以串行方式建立。
往返時(shí)間(Round-TripTime,RTT)的定義,即一個(gè)分組從客戶機(jī)到服務(wù)器再回到客戶機(jī)所花費(fèi)的時(shí)間。RTT包括分組傳播時(shí)延、分組在中間路由器和交換機(jī)上的排隊(duì)時(shí)延以及分組處理時(shí)延。
3:HTTP消息格式
HTTP消息有兩種:請(qǐng)求消息和響應(yīng)消息。
?HTTP請(qǐng)求消息
下面是一個(gè)典型的HTTF請(qǐng)求消息:
GET/somedir/Page.htmlHTTP1.1
Host:http://www.someschool.edu.cn
Connection:KeepAliveUser-agent:
Moailla/2.0
Accept-language:fr
Entitybody
HTTP消息頭部是用普通的ASCII文本書寫的。
HTTP請(qǐng)求消息的第一行叫做請(qǐng)求行(requestline),其后繼的行叫做頭部行(headerline)。
請(qǐng)求行有3個(gè)字段:方法字段、URL字段和HTTP協(xié)議版本字段。
方法字段可以取值GET、POST、HEAD、PUT和DELETE。
當(dāng)瀏覽器請(qǐng)求一個(gè)對(duì)象時(shí),使用GET方法,在URL字段填寫該對(duì)象的URL。
首部行Host:http://www.someschool.edu.cn定義了目標(biāo)所在的主機(jī)。
通過(guò)包含Connection:KeepAlive首部行,瀏覽器告訴服務(wù)器希望使用持久連接。
User-agent:首部行用來(lái)定義用戶發(fā)送請(qǐng)求的瀏覽器的類型。
最后,Accept-language:fr首部行表示用戶想獲的該對(duì)象的語(yǔ)言版本
“實(shí)體”(entitybody)。使用GET方法時(shí)實(shí)體為空,而使用POST方法提交表單(Form,
HTML語(yǔ)言的一個(gè)標(biāo)簽)時(shí)將表單內(nèi)容放在Entitybody部分。例如,用戶在使用POST方法向搜索引擎提供搜索關(guān)鍵詞,關(guān)鍵詞就出現(xiàn)在Entitybody部分。
也可以使用GET方法向服務(wù)器提交表單,這時(shí)輸入數(shù)據(jù)(表單字段值)會(huì)在請(qǐng)求行的URL字段進(jìn)行發(fā)送。例如,一個(gè)表單使用GET方法,它有一個(gè)字段,分別填寫的是test,那么得到的URL可能就是http://www.somesite.com/search?test。
HEAD方法類似于GET方法。當(dāng)服務(wù)器收到使用HEAD方法的請(qǐng)求時(shí),會(huì)用一個(gè)HTT'P消息進(jìn)行響應(yīng),但是并不返回請(qǐng)求對(duì)象。應(yīng)用程序開發(fā)者常用HEAD方法進(jìn)行故障跟蹤。
PUT方法將對(duì)象上傳到指定的Web服務(wù)器上指定的路徑。DELETE方法可以刪除Web服務(wù)器上的對(duì)象。
?HTTP響應(yīng)消息
HTTP1.1200OK
Connection:KeepAlive
Date:Tue,09Aug201723:23:02GMT
Server:Apache/3.0(unix)
Last-Modified:Sun,6May201712:13:24GMTContent-Length:6821
Con}tent-Tyge:text/html
(data...)
響應(yīng)消息分成三個(gè)部分:初始狀態(tài)行、首部行,然后是實(shí)體。
狀態(tài)行有3個(gè)字段:協(xié)議版本、狀態(tài)碼和相應(yīng)狀態(tài)信息。
首部行中Date:首部行指示服務(wù)器產(chǎn)生并發(fā)送該響應(yīng)消息的日期和時(shí)間。
Last-Modified:首部行指示了對(duì)象創(chuàng)建或者最后修改的日期和時(shí)間。
它對(duì)可能在客戶機(jī)也可能在網(wǎng)絡(luò)緩存服務(wù)器上的對(duì)象緩存來(lái)說(shuō)非常重要。
實(shí)體部分包含了所請(qǐng)求的對(duì)象。
常見的狀態(tài)碼
狀態(tài)碼 說(shuō)明
200 響應(yīng)成功
302 跳轉(zhuǎn),跳轉(zhuǎn)地址通過(guò)響應(yīng)頭中Location屬性指定
400 客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器識(shí)別
403 服務(wù)器接收到請(qǐng)求,但是拒絕提供服務(wù)(例如認(rèn)證失敗)
404 請(qǐng)求資源不存在(?)
500 服務(wù)器內(nèi)部錯(cuò)誤
首部行的使用是由瀏覽器和Web服務(wù)器根據(jù)HTTP協(xié)議和用戶設(shè)置決定的。部分瀏覽器甚至有插件可以修改HTTP消息頭部,例如Chrome瀏覽器。
4用戶與服務(wù)器的交互:cookie
HTTP使用cookie技術(shù)使Web站點(diǎn)能夠跟蹤用戶。
cookie技術(shù)有4個(gè)組成部分:
1 在HTTP響應(yīng)消息中有一個(gè)set-cookie首部行;
2 在HTTP請(qǐng)求消息中有一個(gè)cookie首部行;
3 在用戶端系統(tǒng)中保留有一個(gè)cookie文件,由用戶的瀏覽器管理;
4 在Web站點(diǎn)有一個(gè)后端數(shù)據(jù)庫(kù)。
假設(shè)Susan從她的家用PC機(jī)使用瀏覽器第一次訪問(wèn)Amazon。
當(dāng)請(qǐng)求消息到達(dá)AmazonWeb服務(wù)器時(shí),該Web站點(diǎn)將產(chǎn)生一個(gè)唯一識(shí)別碼,并以此作為索引在它的后端數(shù)據(jù)庫(kù)中產(chǎn)生一個(gè)表項(xiàng)。
接下來(lái)AmazonWeb服務(wù)器用一個(gè)包含set-cookie:首部行的HTTP響應(yīng)消息對(duì)Susan的瀏覽器進(jìn)行響應(yīng),其中set-cookie:首部行含有識(shí)別碼。
當(dāng)Susan的瀏覽器收到了該HTTP響應(yīng)消息時(shí),它會(huì)看到該set-cookie:首部。瀏覽器在它管理的特定cookie文件中添加一行,其中包含該服務(wù)器的主機(jī)名和set-cookie:首部中的識(shí)別碼。
注:
當(dāng)Susan繼續(xù)瀏覽Susan網(wǎng)站時(shí),每請(qǐng)求一個(gè)Web頁(yè)面,其瀏覽器就會(huì)從它的cookie文件中獲取這個(gè)網(wǎng)站的識(shí)別碼,并放到HTTP請(qǐng)求消息的首部行中。
用這種方式,Amazon服務(wù)器可以跟蹤Susan在該站點(diǎn)的活動(dòng)。
cookie常用于購(gòu)物車、用戶登錄認(rèn)證等。cookie的訪問(wèn)控制是用戶隱私訪問(wèn)控制的重要組成部分,很多瀏覽器(IE等)都可以進(jìn)行cookie訪問(wèn)權(quán)限的設(shè)置。
5:Web緩存
Web緩存(webcache)也叫代理服務(wù)器(proxyserver),可以配置用戶的瀏覽器,使得用戶的所有HTTP請(qǐng)求首先指向Web緩存。
如果設(shè)置瀏覽器每次訪問(wèn)一個(gè)Web網(wǎng)站時(shí)都通過(guò)緩存服務(wù)器。
瀏覽器會(huì)首先建立一個(gè)到Web緩存服務(wù)器的TCP連接,并向Web緩存服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求。
Web緩存服務(wù)器檢查本地是否存儲(chǔ)了該對(duì)象拷貝。
如果有,Web緩存服務(wù)器就用HTTP響應(yīng)消息向客戶機(jī)瀏覽器返回該對(duì)象。
如果web緩存服務(wù)器沒(méi)有該對(duì)象,它就與該對(duì)象的原始服務(wù)器建立TCP連接,請(qǐng)求該對(duì)象。
當(dāng)web緩存服務(wù)器接收該對(duì)象時(shí),它在本地存儲(chǔ)一份拷貝,并用HTTP響應(yīng)消息向客戶機(jī)的瀏覽器發(fā)送該拷貝。
在因特網(wǎng)上部署Web緩存服務(wù)器有兩個(gè)原因。首先,可以加快對(duì)客戶機(jī)請(qǐng)求的響應(yīng)時(shí)間。其次,Web緩存可以大大減少一個(gè)單位內(nèi)部網(wǎng)與因特網(wǎng)接入鏈路上的通信量。
條件GET方法
HTTP協(xié)議有一種機(jī)制,ConditionalGet方法允許緩存服務(wù)器保證它的對(duì)象是最新的。
如果
1請(qǐng)求消息使用GET方法。
2請(qǐng)求消息中包含一個(gè)If-modified-since:首部行,那么
這個(gè)HTTP請(qǐng)求消息就是一個(gè)條件GET請(qǐng)求消息。
使用該條件GET消息告訴服務(wù)器,如果當(dāng)自指定日期之后修改過(guò)該對(duì)象那么重新發(fā)送
該對(duì)象,反之不需要發(fā)送。
Etag
Etag是服務(wù)器對(duì)象的唯一標(biāo)識(shí)符,瀏覽器也可以根據(jù)ETag值緩存數(shù)據(jù)。
客戶機(jī)再次請(qǐng)求服務(wù)器時(shí),通過(guò)If-None-Match:字段告知服務(wù)器客戶端緩存數(shù)據(jù)的ETag值。
服務(wù)器收到請(qǐng)求后發(fā)現(xiàn)頭部的If-None-Match,與被請(qǐng)求對(duì)象的唯一標(biāo)識(shí)進(jìn)行比對(duì)。如果兩個(gè)值不相同,說(shuō)明對(duì)象已被改動(dòng),則響應(yīng)此對(duì)象,反之告知瀏覽器可以使用其緩存。
lt;br>downLoadProcess(url,filename){
filename = filename || 'xxx.csv';
// 創(chuàng)建xhr對(duì)象
var req = new XMLHttpRequest();
//向服務(wù)器發(fā)送請(qǐng)求 open() send()
req.open("POST", url, true); //(method-GET/POST ,url, async)
req.setRequestHeader("Content-type","application/x-www-form-urlencoded");//POST時(shí)需要傳遞
//監(jiān)聽進(jìn)度事件
req.addEventListener("progress", function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
console.log(percentComplete);
$("#progressing").html((percentComplete * 100) + "%");
}
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。