1、json 是一种传播数据的格式(以对象为样板,本质上就是对象。但用途有区别,对象就是本地用的,json是用来传输的)
{
"name" : "deng", //属性名最好加双引号
"age" : 123
}
2、JSON.parse(); String --> JSON
JSON.stringify(); JSON --> String
3、domTree + cssTree = randerTree
reflow 重排: dom节点的删除添加、dom节点的宽高变化、位置变化、 display: none --> block、offsetWidth offsetLeft
repaint 重绘
4、异步加载JSON
js加载的缺点: 加载工具方法没必要阻塞文档,js 加载会影响页面效率, 一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作,有些工具方法需要按需加载,用到在加载,不用不加载
javascript 异步加载的三种方案
1)defer 异步加载,但要等到dom文档全部解析完才会被执行。
只有IE能用,也可以将代码写到内部
//代码体
2)async 异步加载,加载完就执行,async只能加载外部脚本,不能把js 写在script标签里
3)创建script, 插入到DOM中,加载完毕后 callBack
function loadScript(url, callback) { var script = diciment.createElement('script'); script.type = 'text/javascript'; if(script.readyState){ //IE script.onreadystatechange = function(){ if(script.readyState == "complete"|| script.readyState == "loaded"){ callback(); } } } else { //safari chrome firefox opera script.onload = function() { callback(); // 在这执行,兼容性很好 } } script.src =url;
document.head.appendChild(script); //到这里才执行 demo.js } loadScript('demo.js', function() { test(); });
5、js加载时间线
1、创建document对象,开始解析web页面,这个阶段 document.readyState = 'loading'
2、遇到link外部css,创建线程加载,并继续解析文档
3、遇到外部js,并且没有设置async、defer, 浏览器加载,并阻塞,等待js加载完成并执行js
4、遇到外部js,并且设置async、defer, 浏览器创建线程加载,并继续解析文档, 对于async属性的脚本,脚本加载完成后立即执行(异步加载禁止使用document.write())会把整个文档替换
5、遇到img等,先正常解析dom结构,然后浏览器异步加载src,并继续解析文档
6、当文档解析完成,document.readyState = 'interactive'
7、文档解析完成后,所有设置有defer的脚本会按照顺序执行。
8、document对象触发DOMContentLoaded事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段
9、当所有async的脚本加载完成并执行后,img等加载完成后,document.readyState = 'conplete' ,window对象触发load 事件
10、从此,以异步响应方式处理用户输入,网络事件等。
如果要把js写在上面,应该这样写:
document.addEventListener('DOMContentLoaded', function() {
var div = document.getElementsByTagName('div')[0];
console.log(div);
},false)