json
JSON是一種傳輸數(shù)據(jù)的格式(以對象為樣板,本質(zhì)上就是對象梆暮,但用途有區(qū)別服协,對象就是本地用的,json是用來運輸?shù)模?br>
JSON.parse(); string -->json
JSON.stringify(); json--> string
domTree + cssTree = randerTree
reflow 重排 : dom節(jié)點的刪除惕蹄,添加
dom節(jié)點的寬高變化蚯涮,位置變化 display none -->block offsetWidth offsetLeft
異步加載js
javascript異步加載的三種方案
1.defer異步加載,但要等到dom文檔全部解析完才會被執(zhí)行卖陵。只有IE能用遭顶,也可以將代碼寫到內(nèi)部。
2.async異步加載泪蔫,加載完就執(zhí)行棒旗,async只能加載外部腳本(src="tools.js"),不能把js寫在script標(biāo)簽里撩荣。
執(zhí)行時也不阻塞頁面
3.創(chuàng)建script铣揉,插入到DOM中,記載完畢后callBack餐曹,
<script type = "text/javascript">
function loadScript(url, callback){//這個方法是讓script加載完之后再去執(zhí)行
var script = document.createElement('script');
script.type = "text/javascript";
if(script.readyState){
script.onreadystatechange = function(){//IE
if(script.readyState == "complete" || script.readyState == "loaded"){
callback();
}
}
}else{
script.onload = function(){//Safari chrome firefox opera
callback();
}
}
script.src = url;
document.head.appendChild(script);//把script插入head里逛拱,讓script開始執(zhí)行,沒有這步即使全加載完畢也執(zhí)行不了
}
loadScript('demo.js',function(){
test();
});
</script>
js加載時間線
js時間線
1.創(chuàng)建Document對象台猴,開始解析web頁面朽合。解析HTML元素和他們的文本內(nèi)容后添加Element對象和Text節(jié)點到文檔中俱两。這個階段document.readyState = "loading"。
2.遇到link外部css曹步,創(chuàng)建線程加載宪彩,并繼續(xù)解析文檔。
3.遇到script外部js讲婚,并且沒有設(shè)置async尿孔,defer,瀏覽器加載筹麸,并阻塞活合,等待js加載完成并執(zhí)行該腳本,然后繼續(xù)解析文檔竹捉。
4.遇到script外部js芜辕,并且設(shè)置有as ync,defer块差,瀏覽器創(chuàng)建線程加載侵续,并繼續(xù)解析文檔。對于async屬性的腳本憨闰,腳本加載完成后立即執(zhí)行状蜗。(異步禁止使用document.write())
5.遇到img等,先正常解析dom結(jié)構(gòu)鹉动,然后瀏覽器異步加載src轧坎,并繼續(xù)解析文檔。
6.當(dāng)文檔解析完成泽示,document.readyState = “interactive”
7.文檔解析完成后缸血,所有設(shè)置defer的腳本會按照順序執(zhí)行。(注意與async的不同械筛,但同樣禁止使用document.write())
8.document對象觸發(fā)DOMConcentLoaded事件捎泻,這也標(biāo)志著程序執(zhí)行從同步腳本執(zhí)行階段,轉(zhuǎn)化為事件驅(qū)動階段埋哟。(監(jiān)視著dom解析完成再去執(zhí)行函數(shù))
9.當(dāng)所有async的腳本加載完成并執(zhí)行后笆豁,img等加載完成后,document.readyState = "complete"赤赊,window對象觸發(fā)事件闯狱。
10.從此,以異步響應(yīng)方式處理用戶輸出抛计,網(wǎng)絡(luò)事件等哄孤。
<div style = "width:100px; height:100px;
background-color:red;"></div>
<script type ="text/javascript'>
window.onload = function(){
document.write('a');
}
</script>
在整個文檔加載完畢document.write清除了所有的文檔流,把html里面
的東西都消除了吹截,例如div录豺,只打印了a朦肘。所以異步加載也不能使用
<script type ='text/javascript'>
console.log(document.readyState);
document.onreadystatechange = function(){
console.log(document.readyState);
}
document.addEventListener('DOMContentLoaded',function (){
console.log('a');
}, false);
return loading interactive a complete
//DOMContentLoaded是dom解析完才執(zhí)行的,而且只能用listener這個方法
window.onload 是文檔全加載完執(zhí)行的
當(dāng)dom解析完就執(zhí)行的部分
$(document).ready(function(){
}) jq方法
</script>