【1】浏览器渲染引擎
-----步骤:
1. 解析HTML,构建DOM树(构建DOM节点);
2. 构建渲染树(解析样式信息,包括外部的css文件、style标签中的样式,按优先级解析)。渲染树由一些包含有各种属性的矩形组成,他们将会按照正确的顺序显示到屏幕上;
3. 布局渲染树(布局DOM节点),执行布局的过程,将确定每个节点在屏幕上的确切坐标;
4. 绘制渲染树(绘制DOM节点,即遍历渲染树),使用UI后端层来绘制每个节点。
【2】DOMReady :
1. window.onload用以保证页面的所有资源都加载完毕后才执行当中的js代码,但是当页面存在大量图片或其他需要较长时间加载的资源时,显然让js等待这些资源加载完毕再执行是一个糟糕的用户体验。
2. HTML是标记语言,它的本质就是告诉浏览器这里有什么节点,节点都是以树的形式组织,浏览器解析后才会变成DOM节点。 当页面上的所有HTML都转换为节点,就称为DOMReady
3. DOMReady是在构建了DOM树之后就开始解析JS,而不是等待页面渲染完毕。
- function myReady(fn) {
- // 对于现代浏览器,对DOMContentLoaded事件的处理采用标准的事件绑定方式
- if (document.addEventListener) { //通过能力检测区分
- document.addEventListener("DOMContentLoaded", fn, false);
- } else {
- IEContentLoaded(fn);
- }
- // IE模拟DOMContentLoaded
- function IEContentLoaded(fn) {
- var d = window.document;
- var done = false;
- // 只执行一次用户的回调函数init()
- var init = function() {
- if (!done) {
- done = true;
- fn();
- }
- };
- (function() {
- try {
- // DOM树未创建完之前调用doScroll会抛出错误
- d.documentElement.doScroll('left');
- } catch (e) {
- // 延迟在试一次
- setTimeout(arguments.callee, 50);
- return;
- }
- // 没有错误就表示DOM树创建完毕,然后立马执行用户回调
- init();
- })();
- // 监听docuemnt的加载状态
- d.onreadystatechange = function() {
- // 如果用户是在domReady之后绑定的函数,就立马执行
- if (d.readyState == 'complete') {
- d.onreadystatechange = null;
- init();
- }
- }
- }
- }
【3】节点
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8">
- <meta charset="utf-8">
- </head>
- <body>
- <!-- 注释节点的内容 -->
- <div id="container"> 元素节点的内容</div>
- <script>
- // 元素节点 输出: 1/DIV/null
- var dnode = document.getElementById('container');
- alert("节点类型:"+dnode.nodeType+"/"+dnode.nodeName+"/"+dnode.nodeValue);
- //属性节点 输出: 2/id/container
- var attrnode = dnode.attributes[0];
- alert("节点类型:"+attrnode.nodeType+"/"+attrnode.nodeName+"/"+attrnode.nodeValue);
- //文本节点 输出: 3/#text/ 元素节点的内容
- var textnode = dnode.childNodes[0];
- alert("节点类型:"+textnode.nodeType+"/"+textnode.nodeName+"/"+textnode.nodeValue);
- //注释节点 输出: 8/#comment/ 注释节点的内容
- var commentnode = document.body.childNodes[1];
- alert("节点类型:"+commentnode.nodeType+"/"+commentnode.nodeName+"/"+commentnode.nodeValue);
- //文档节点 输出: 10/html/nul
- alert("节点类型:"+document.doctype.nodeType+"/"+document.doctype.nodeName+"/"+document.doctype.nodeValue);
- //文档片段节点 输出: 11/#document-fragment/null
- var frag = document.createDocumentFragment();
- alert("节点类型:"+frag.nodeType+"/"+frag.nodeName+"/"+frag.nodeValue);
- </script>
- </body>
- </html>
【4】节点层次
【5】html嵌套规则
1. 块元素可以包含内联元素或某些块元素,但内联元素却不能包含块元素,它只能包含其他的内联元素
2. 块级元素不能放在<p>里面
3. 有几个特殊的块级元素只能包含内联元素,不能再包含块级元素,这几个特殊的标签是h1-h6 p dt
4. li内可以包含div标签
5. 块级元素与块级元素并列,内联元素与内联元素并列
【6】事件
事件流定义:事件流描述的是从页面中接受事件的顺序;
——1. 事件冒泡流:
事件最开始由罪具体的元素接收,然后逐级向上传播至最不具体的那个节点
——2. 事件捕获流:
与事件冒泡流相反
——3. html事件处理程序
<input type="button" id = "btn1" onclick="funt( );">
——4. DOM 0级事件处理程序
<input type="button"id = "btn2">
var btn2 = document.getElementById('btn2');
btn2.onclick = funtcion(){
alert("这是DOM 0级事件处理程序 ");
}
——5. DOM 2级事件处理程序
用于处理指定和删除事件处理程序的操作:addEventListener() 和 removeEventListener()
参数:要处理的事件名、作为事件处理程序的函数和布尔值。
<input type="button"id = "btn3">
var btn3 = document.getElementById('btn3');
btn3.addEventListener('click',funt,false);
btn3.removeEventListener('click',funt,false); // 参数与addEventListener()相同
——6. I E 的事件处理程序
btn3.attachEvent('click',funt);
btn3.detachEvent('click',funt);
——7. 跨浏览器的事件处理程序
能力检测:目标不是识别特定的浏览器,而是识别浏览器的能力,浏览器有这个功能实现
跨浏览器 :
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8">
- <meta charset="utf-8">
- </head>
- <body>
- <input type="button" id = "btn3" value="按钮">
- <script>
- var btn3 = document.getElementById('btn3');
- function funt(){
- alert("事件处理程序");
- }
- // 添加句柄
- var eventUtil = {
- addHandler:function(element,type,handler){
- if(element.addEventListener){
- //DOM 2级事件处理程序
- element.addEventListener(type,handler,false);
- }else if(element.attachEvent){
- // I E 的事件处理程序
- element.attachEvent('on'+type,handler);
- }else{
- // DOM 0级事件处理程序
- element['on'+type] = handler;
- }
- },
- // 删除句柄
- removeHandler:function(element,type,handler){
- if(element.addEventListener){
- //DOM 2级事件处理程序
- element.removeEventListener(type,handler,false);
- }else if(element.attachEvent){
- // I E 的事件处理程序
- element.detachEvent('on'+type,handler);
- }else{
- // DOM 0级事件处理程序
- element['on'+type] = null;
- }
- }
- };
- eventUtil.addHandler(btn3,'click',funt); // 添加事件的元素、添加的动作、添加的事件
- </script>
- </body>
- </html>
联系:
DOM 0级不能给元素添加多个事件,如果添加了多个事件,则只会执行最后添加的那个事件;
DOM 2级可以给元素添加多个事件,而且会按顺序进行
【7】事件对象
什么是事件对象?在触发DOM上的事件时都会产生一个对象事件对象 event
——1. DOM中的事件对象属性
(1)type属性用于获取事件类型
(2)target属性用于获取事件目标
(3)stopPropagation()方法 用于阻止事件冒泡
(4)preventDefault() 方法 阻止事件的默认行为
——2. IE中的事件对象
(1)type 属性 用于获取事件类型
(2)srcElement 属性 用于获取事件目标
(3)cancelBubble 属性 用于阻止/取消事件冒泡,设置为true表示阻止冒泡 设置为false表示不阻止冒泡
(4)returnValue 属性 用于阻止事件的默认行为,设置为false表示阻止事件的默认行
兼容代码:
- //获取事件
- getEvent:function(event){
- return event ? event:window.event;
- },
- //获取事件的类型
- getType:function(event){
- return event.type;
- },
- //获取事件来自于哪个元素
- getElement:function(event){
- return event.target || event.srcElement;
- },
- //阻止或取消事件的默认行为
- preventDefault:function(event){
- if(event.preventDefault){
- event.preventDefault();
- }else{
- event.returnValue = false;
- }
- },
- //阻止事件冒泡
- stopPropagation:function(event){
- if(event.stopPropagation){
- event.stopPropagation();
- }else{
- event.cancelBubble = true;
- }
- }