JavaScript之js非同步載入精解
在解釋之前先鋪墊幾個知識點。
DomTree:在頁面渲染時候會把html構建成一個樹形結構,把標籤全部掛在樹形結構上,構建DOM樹採用深度優先原則。
Dom解析:繪製DOM樹過程中,當遇到外部引入的檔案標籤時候,不用等到DOM元素全部載入完成再放到DOM樹上,只知道是什麼就可以了,DOM樹的構建完畢表示所有DOM節點解析完畢。
CssTree:當DOM樹構建完畢之後,開始構建CSS樹,構建CSS樹規則和構建Dom樹一樣採用深度優先原則。
randerTree:當CSS樹構建完畢之後,CSS樹和Dom樹合成rander樹
當randerTree構建完成之後,瀏覽器開始渲染頁面。渲染引擎按照randerTree的規則渲染。
當我們渲染完成頁面的時候,有時候需要js事件去動態改變頁面中Dom元素,改變Dom元素有兩種,一種是重排,一種是重繪。
重排:reflow----浪費瀏覽器效率。能產生重排的有:dom節點的刪除和增加。dom節點的寬高變化,dom節點的位置變化,offsetWidth/offsetHeight,
重繪:repaint----重排的是html文件頁面,而重繪的是css,相對於重排,浪費瀏覽器效率所造成的影響較小。
終於到正文了,我們看了上面我們知道,當瀏覽器繪製頁面的時候,js有時候會載入不當會阻礙頁面的繪製。js載入的缺點
載入工具方法沒必要阻塞文件,過得js載入會影響頁面載入效率,當網速不好的時候,那麼整個網站將等待js載入而不進行後續渲染。js非同步載入的三種方法
defer = “defer”
defer非同步載入,但要等到Dom文件全部解析完成之後才被執行,只能IE9一下能用,也可以將程式碼寫到內部<script type="text/javascript" src = "demo.js" defer = "defer"></script>
<script defer = "defer">
console.log("a");
</script>
上面兩種方式都可以。async = “async”
<script type ="text/javascript" src = "demo.js" async = "async"></script>
預載入--非同步
我們知道document可以建立Dom標籤,我們可以當我們需要外部js的時候建立script標籤,var script = document.createElement('script');
script.src = 'demo.js';
script.type = 'text/javascript';
document.head.appendChild(script);
我們知道執行上述程式碼是需要耗時間的,當demo.js中有個a函式功能是輸出a,此時我們執行a(),肯定會報錯,因為,當我們程式碼還沒有解析完成之後我們執行a(),此時a函式還沒有解釋出來,所以報錯, 預載入必須下載完成之後才能執行,load事件不只是window上有,script上也有,load事件可以當預載入完成之後再執行,相容性很好,但是有個重要的缺點:IE上沒有。script.onload = function(){
a();
}
不相容IE,這麻煩大了,但是IE自己有辦法,在IE上script上有個狀態碼,script.readyState。這個屬性裡面有值,當正在載入時候,script.readyState = “loading”,當載入完成之後,script.readyState = "loaded" 或者 script.readyState = "complete", 出現上面這個東西,當然IE不會讓它自己孤獨著,在IE裡script標籤有個readyStatechange事件,這個事件監聽的是,當script.readyState值變化的時候觸發事件,script.onreadyStatechange = function(){
if(scriptreadyState == "loaded" || script.readyState == "complete".){
//程式碼執行
}
}
最後我們封裝函式,實現我們按需載入的功能。 function loadScript(url,callback){
var script = document.createElement('script');
script.type = "text/javascript";
if(script.readyState){
script.onreadyStatechange = function(){
if (script.readyState == "loaded" || script.readyState == "complete") {
obj[callback]();
}
}
}else{
script.onload = function(){
obj[callback]();
}
}
script.src = url;
document.head.appendChild(script);
}
loadScript('demo.js','test');
JavaScript語言我個人感覺是最有意思的了,我也是一個初學者,遇到問題,喜歡在部落格上分享,
也希望能幫到大家。一個初學者,有什麼不足或者紕漏的話,希望在下面評論出來,相互學習,共同進步
--主頁傳送門--相關推薦
JavaScript之js非同步載入精解
在解釋之前先鋪墊幾個知識點。 DomTree:在頁面渲染時候會把html構建成一個樹形結構,把標籤全部掛在樹形結構上,構建DOM樹採用深度優先原則。 Dom解析:繪製DOM樹過程中,當遇到外部引入的檔案標籤時候,不用等到DOM元素全
Javascript 非同步載入詳解(轉)
本文總結一下瀏覽器在 javascript 的載入方式。 關鍵詞:非同步載入(async loading),延遲載入(lazy loading),延遲執行(lazy execution),async 屬性, defer 屬性 一、同步載入與非同步載入的形式 1. 同步載入 我們平時最常使用
[js點滴]JavaScript之Cookie/Session機制詳解01
一 基本概念 會話(Session)跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話。 常用的會話跟蹤技術是Cookie與Session。 1).Cookie通過在客戶端記錄資訊確定使用者身份 2).Session通過在伺服器端記錄資訊確定使
js 非同步載入
一、為什麼要JS非同步載入? 因為同步載入存在問題! JS在預設情況下是以同步模式(又稱阻塞模式)載入的,這裡“載入”的意思是“解釋、執行”。在最新版本的瀏覽器中,瀏覽器對於程式碼請求的資源都是瀑布式的載入,而不是阻塞式的,但是JS的執行總是阻塞的。這會引起什麼問題呢?如果在頁面中載
js-JSON, js非同步載入
1. JSON json是一種傳輸資料的格式(以物件為樣板,本質上就是物件,但用途有區別,物件是本地的,JSON是用於傳輸的。 JSON.parse();//string --> json JSON.stringify();//json --> string 2. 頁面渲染
字元裝置驅動------非同步通知 按鍵之使用非同步通知(詳解)
引入: 按鍵驅動方式對比 查詢:一直讀,耗資源 中斷: 沒有超時機制,當沒有中斷,read函式一直休眠 poll機制,加入超時機制 以上3種,都是讓應用程式主動去讀,本節我們學習非同步通知,它的作用就是當驅動層有資料時,主動告訴應用程式,然後應用程式再來讀, 這樣,應用程式就可以幹其它
turn.js 非同步載入實現翻書效果
1、閱讀翻書js /** * 電子翻書 */ //var width = 1080; //var height = 1680; var width = "10rem"; var height = "15.2rem"; window.onload = function
JS非同步載入的三種方式
非同步載入又叫非阻塞載入,瀏覽器在下載執行js的同時,還會繼續進行後續頁面的處理。主要有三種方式。 方法一:也叫Script DOM Element (function(){ var scriptEle = document.createElement("script"); script
頁面優化——js非同步載入
同步載入 在介紹js非同步載入之前,我們先來看看什麼是js同步載入。我們平時最常使用的就是這種同步載入形式: <script src="http://XXX.com/script.js"></script> 同步模式,又稱阻塞模式,會阻止瀏覽器
js非同步載入的四種解決方案
js非同步載入的4種方式,點評開始。 方案1:$(document).ready <!DOCTYPE html> <html> <head> <script src="http://commo
Android學習之圖片非同步載入框架Picasso
原創地址:http://mcode114.com/android/network/picasso/ Picasso Picasso是Square公司開源的一個Android圖形快取庫。可以實現圖片下載和快取功能。僅僅只需要一行程式碼就能完全實現圖片的非同步載入。使用複
淺談android中非同步載入之"取消非同步載入"二
首先,我得解釋一下為什麼我的標題取消非同步載入打引號,這是因為可能最後實現效果並不是你自己想象中的那樣。大家看取消非同步載入,這不是很簡單嗎?AsyncTask中不是有一個cancel方法嗎?直接呼叫該方法不就行了嗎?但是事實上是這樣的嗎?如果真是這樣,我相信我就沒有以寫這
js 非同步載入和json格式
1:json解析 <!--json--> var json = { name: "json", age: 123 } var str
JS非同步載入的幾種方式
1、同步載入我們平常寫JS的時候都是用的阻塞模式如<script type="text/javascript" src="../../libs/crypto/abc.js" ></script> <script type="text/javasc
Echarts擴充套件之ajax非同步載入tooltip資料
最近做大資料視覺化檢視展現,隨著業務的加深,正常的簡單的echars裡面的例項已經滿足不了現有的需求;所以就需要對echarts進行更深一步的瞭解; 因為接觸echars比較早,所以現在使用的是echarts的2.*版本;最新的echarts3添加了非常多的人性化的設計;非
htmlunit爬取js非同步載入後的頁面
直接上程式碼: 一、 index.html 呼叫後臺請求獲取content中的內容。 <html> <head> <script type="text/j
JavaScript之JS資料型別轉換
前言 在js中,資料型別轉換分為顯式資料型別轉換和隱式資料型別轉換。 JavaScript的資料型別分為六種,分別為null,undefined,boolean,string,number,object。 object是引用型別,其它的五種是基本型別或者是
JavaScript——從setTimeout()的執行了解js的單執行緒和非同步
眾所周知,JavaScript是單執行緒的,那麼到底什麼是單執行緒呢?今天我們就用setTimeout()舉例,看看單執行緒到底是什麼樣的。 單執行緒,從名字就能知道,它只有一個主執行緒。單執行緒就意味著,所有任務需要排隊,前一個任務結束,才會執行後一個任務。如果前一個任務
網頁效能優化之非同步載入js檔案
一個網頁的有很多地方可以進行效能優化,比較常見的一種方式就是非同步載入js指令碼檔案。在談非同步載入之前,先來看看瀏覽器載入js檔案的原理。 瀏覽器載入 JavaScript 指令碼,主要通過<script>元素完成。正常的網頁載入流程是這樣的。 瀏覽器一邊下載 HTML 網頁,一邊開始解析。
JavaScript 之 非同步載入 defer和async的區別
按照慣例,所有script元素都應該放在頁面的head元素中。這種做法的目的就是把所有外部檔案(CSS檔案和JavaScript檔案)的引用都放在相同的地方。可是,在文件的head元素中包含所有JavaScript檔案,意味著必須等到全部JavaScript