整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線:

          一個(gè)頁(yè)面從輸入U(xiǎn)RL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都

          一個(gè)頁(yè)面從輸入U(xiǎn)RL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么

          細(xì)版:

          1、瀏覽器會(huì)開(kāi)啟一個(gè)線程來(lái)處理這個(gè)請(qǐng)求,對(duì) URL 分析判斷,如果是 http 協(xié)議就按照 Web 方式來(lái)處理;

          2、調(diào)用瀏覽器內(nèi)核中的對(duì)應(yīng)方法,比如 WebView 中的 loadUrl 方法;

          3、通過(guò)DNS解析獲取網(wǎng)址的IP地址,設(shè)置 UA 等信息發(fā)出第二個(gè)GET請(qǐng)求;

          4、進(jìn)行HTTP協(xié)議會(huì)話,客戶端發(fā)送報(bào)頭(請(qǐng)求報(bào)頭);

          5、進(jìn)入到web服務(wù)器上的 Web Server,如 Apache、Tomcat、Node.JS 等服務(wù)器;

          6、進(jìn)入部署好的后端應(yīng)用,如 PHP、Java、JavaScript、Python 等,找到對(duì)應(yīng)的請(qǐng)求處理;

          7、處理結(jié)束回饋報(bào)頭,此處如果瀏覽器訪問(wèn)過(guò),緩存上有對(duì)應(yīng)資源,會(huì)與服務(wù)器最后修改時(shí)間對(duì)比,一致則返回304;

          8、瀏覽器開(kāi)始下載html文檔(響應(yīng)報(bào)頭,狀態(tài)碼200),同時(shí)使用緩存;

          9、文檔樹(shù)建立,根據(jù)標(biāo)記請(qǐng)求所需指定MIME類(lèi)型的文件(比如css、js),同時(shí)設(shè)置了cookie;

          10、頁(yè)面開(kāi)始渲染DOM,JS根據(jù)DOM API操作DOM,執(zhí)行事件綁定等,頁(yè)面顯示完成。

          簡(jiǎn)潔版:

          瀏覽器根據(jù)請(qǐng)求的URL交給DNS域名解析,找到真實(shí)IP,向服務(wù)器發(fā)起請(qǐng)求;

          服務(wù)器交給后臺(tái)處理完成后返回?cái)?shù)據(jù),瀏覽器接收文件(HTML、JS、CSS、圖象等);

          瀏覽器對(duì)加載到的資源(HTML、JS、CSS等)進(jìn)行語(yǔ)法解析,建立相應(yīng)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如HTML的DOM);

          載入解析到的資源文件,渲染頁(yè)面,完成。

          于安全和隱私的原因,web 應(yīng)用程序不能直接訪問(wèn)用戶設(shè)備上的文件。如果需要讀取一個(gè)或多個(gè)本地文件,可以通過(guò)使用input file和FileReader來(lái)實(shí)現(xiàn)。在這篇文章中,我們將通過(guò)一些例子來(lái)看看它是如何工作的。

          文件操作的流程

          獲取文件

          由于瀏覽器中的 JS 無(wú)法從用戶的設(shè)備訪問(wèn)本地文件,我們需要為用戶提供一種方法來(lái)選擇一個(gè)或多個(gè)文件供我們使用。這可以通過(guò)文件選擇器<input type='fule' />來(lái)完成。

          <input type="file" id="fileInput">

          如果想允選擇多個(gè)文件,可以添加multiple屬性:

          <input type="file" id="fileInput" multiple>

          我們可以通過(guò)change事件來(lái)監(jiān)聽(tīng)文件的選擇,也可以添加另一個(gè) UI 元素讓用戶顯式地開(kāi)始對(duì)所選文件的處理。

          input file 具有一個(gè)files屬性,該屬性是File對(duì)象的列表(可能有多個(gè)選擇的文件)。

          File對(duì)象如下所示:

          讀取文件

          讀取文件,主要使用的是[FileReader][1]類(lèi)。

          「該對(duì)象擁有的屬性:」

          「FileReader.error」 :只讀,一個(gè)DOMException,表示在讀取文件時(shí)發(fā)生的錯(cuò)誤 。

          「FileReader.readyState」:只讀 表示 FileReader 狀態(tài)的數(shù)字。取值如下:

          常量名值描述EMPTY0還沒(méi)有加載任何數(shù)據(jù)LOADING1數(shù)據(jù)正在被加載DONE2已完成全部的讀取請(qǐng)求

          「FileReader.result」:只讀,文件的內(nèi)容。該屬性?xún)H在讀取操作完成后才有效,數(shù)據(jù)的格式取決于使用哪個(gè)方法來(lái)啟動(dòng)讀取操作。

          「該對(duì)象擁有的方法:」

          readAsText(file, encoding):以純文本形式讀取文件,讀取到的文本保存在result屬性中。第二個(gè)參數(shù)代表編碼格式。

          readAsDataUrl(file):讀取文件并且將文件以數(shù)據(jù)URI的形式保存在result屬性中。

          readAsBinaryString(file):讀取文件并且把文件以字符串保存在result屬性中。

          readAsArrayBuffer(file):讀取文件并且將一個(gè)包含文件內(nèi)容的ArrayBuffer保存咋result屬性中。

          FileReader.abort():中止讀取操作。在返回時(shí),readyState屬性為DONE。

          「文件讀取的過(guò)程是異步操作,在這個(gè)過(guò)程中提供了三個(gè)事件:progress、error、load事件?!?/strong>

          progress:每隔50ms左右,會(huì)觸發(fā)一次progress事件。

          error:在無(wú)法讀取到文件信息的條件下觸發(fā)。

          load:在成功加載后就會(huì)觸發(fā)。

          在下面的示例中,我們將使用readAsText和readAsDataURL方法來(lái)顯示文本和圖像文件的內(nèi)容。

          例一:讀取文本文件

          為了將文件內(nèi)容顯示為文本,change需要重寫(xiě)一下:

          首先,我們要確保有一個(gè)可以讀取的文件。如果用戶取消或以其他方式關(guān)閉文件選擇對(duì)話框而不選擇文件,我們就沒(méi)有什么要讀取和退出函數(shù)。

          然后我們繼續(xù)創(chuàng)建一個(gè)FileReader。reader的工作是異步的,以避免阻塞主線程和 UI 更新,這在讀取大文件(如視頻)時(shí)非常重要。

          reader發(fā)出一個(gè)'load'事件(例如,類(lèi)似于Image對(duì)象),告訴我們的文件已經(jīng)讀取完畢。

          reader將文件內(nèi)容保存在其result屬性中。此屬性中的數(shù)據(jù)取決于我們使用的讀取文件的方法。在我們的示例中,我們使用readAsText方法讀取文件,因此result將是一個(gè)文本字符串。

          例二:顯示本地選擇的圖片

          如果我們想要顯示圖像,將文件讀取為字符串并不是很有用。FileReader有一個(gè)readAsDataURL方法,可以將文件讀入一個(gè)編碼的字符串,該字符串可以用作<img>元素的源。本例的代碼與前面的代碼基本相同,區(qū)別是我們使用readAsDataURL讀取文件并將結(jié)果顯示為圖像:

          總結(jié)

          1)由于安全和隱私的原因,JavaScript 不能直接訪問(wèn)本地文件。

          2)可以通過(guò) input 類(lèi)型為 file 來(lái)選擇文件,并對(duì)文件進(jìn)行處理。

          3) file input 具有帶有所選文件的files屬性。

          4) 我們可以使用FileReader來(lái)訪問(wèn)所選文件的內(nèi)容。


          作者: Martin Splitt 譯者:前端小智 來(lái)源:dev

          原文:https://dev.to/g33konaut/reading-local-files-with-javascript-25hn

          先要安裝css的loader

          npm install css-loader style-loader --save-dev

          然后在webpack.config.js中配置如下代碼

          意思是先用css-loader加載css文件,再用style-loader添加在頁(yè)面中

          在app目錄下創(chuàng)建component.css文件

          body{
           background-color: red;
          }

          在app/index.js中引入css文件

          運(yùn)行npm run start命令。

          可以看到我們?yōu)g覽器整個(gè)背景都變成了紅色。

          webpack做了什么呢?

          看到build/app.js中有如下代碼。

          再看下我們生產(chǎn)的index.html文件

          奇怪了,并沒(méi)有內(nèi)斂樣式也沒(méi)有引入的css文件,那瀏覽器是為什么變紅的呢?

          我們?cè)跒g覽器中打開(kāi)調(diào)試工具。

          原來(lái)樣式在這!

          webpack動(dòng)態(tài)的添加了內(nèi)斂樣式在代碼中。

          如果多人協(xié)作開(kāi)發(fā)的情況下,會(huì)有很大可能出現(xiàn)代碼命名重復(fù)的情況,如果出現(xiàn)這種情況怎么辦呢?

          來(lái)讓我們?cè)囼?yàn)一下。

          在app目錄下添加兩個(gè)css文件,style1.css

          body{
           background-color: red;
          }.class1{
          color: green;
          }

          和style2.css

          body{
           background-color: black;
          }.class1{
           color: blue;
          }

          在index.js中引入這兩個(gè)文件

          修改component.js文件,使其給元素添加傳入的類(lèi)名

          在webpack.config.js中添加如下配置

          我們執(zhí)行npm run start 命令若看到

          即為打包成功。

          打開(kāi)瀏覽器http://localhost:8080/

          可以看到同樣的類(lèi)名都正常顯示出來(lái)了,看下右邊的文檔結(jié)構(gòu),發(fā)現(xiàn)我們的類(lèi)名不是class1了。

          原來(lái)CSS Modules對(duì)我們的類(lèi)名做了哈希處理,我們?cè)僖膊挥脫?dān)心同事跟我們有相同的命名了。

          是不是很方便呢?

          讓我們?cè)賮?lái)面對(duì)另一個(gè)問(wèn)題,現(xiàn)在這種情況下css是js動(dòng)態(tài)添加上去的,如果當(dāng)js文件有一個(gè)長(zhǎng)時(shí)間的阻塞事件,頁(yè)面將會(huì)處于長(zhǎng)時(shí)間的無(wú)樣式的狀態(tài)。

          這是我們不希望看到的,怎么把css文件和js文件分離呢?

          首先我們需要安裝一個(gè)插件

          npm install extract-text-webpack-plugin --save-dev

          安裝成功之后在webpack.config.js中添加如下配置

          完成之后運(yùn)行一下npm run start

          打開(kāi)瀏覽器http://localhost:8080/

          可以看到我們兩個(gè)css文件合并為一個(gè)app.css文件并以外部樣式表的形式加載。

          而且css文件比js文件要先請(qǐng)求,這樣就避免頁(yè)面會(huì)出現(xiàn)FOUC-Flas Of Unstyle Content無(wú)樣式內(nèi)容閃爍。

          webpack關(guān)于css的加載就講到這里。


          主站蜘蛛池模板: 精品无码一区二区三区水蜜桃| 精品少妇人妻AV一区二区| 免费观看一区二区三区| 亚洲高清偷拍一区二区三区| 国产精华液一区二区区别大吗 | 国产精品一区不卡| 国产免费av一区二区三区| 久久国产精品一区| 色一情一乱一伦一区二区三欧美 | 国产SUV精品一区二区88L| 精品无码人妻一区二区三区不卡 | 夜夜爽一区二区三区精品| 成人午夜视频精品一区| 糖心vlog精品一区二区三区| 成人免费区一区二区三区| 韩国精品一区二区三区无码视频 | 久久青草精品一区二区三区| 国产在线一区二区三区在线| 中文精品一区二区三区四区 | 国产一区二区三区乱码网站| 国产一区二区三区在线视頻 | 精品永久久福利一区二区| 人妻无码一区二区三区| 日本一区二区三区四区视频| 成人丝袜激情一区二区| 在线免费视频一区| 国产乱码精品一区二区三区香蕉 | 亚洲福利视频一区| 一区二区乱子伦在线播放| 国产91精品一区二区麻豆亚洲| 韩国一区二区三区| 色一乱一伦一区一直爽| 精品不卡一区中文字幕 | 丝袜人妻一区二区三区网站| 午夜性色一区二区三区不卡视频 | 日本精品一区二区三区在线视频 | 日本精品一区二区在线播放| 日本福利一区二区| 成人精品视频一区二区三区不卡 | 无码一区二区三区亚洲人妻| 国产福利无码一区在线|