DOM基础详解

​认识DOM

    是什么:

        文档对象模型

    为什么:

        W3C推出,为了兼容浏览器,替代DHTML

    

    文档类型:

        GML:通用标记语言

        SGML:标准通用标记语言

        HTML:超文本标记语言,用于显示数据

        XML:可扩展标记语言,用于描述数据


节点

    节点类型:

        基础:

            元素节点1、属性节点2、文本节点3

        注释节点8

        文档:

            文档节点9、文档类型节点10、文档片段节点11

    节点属性:

        nodeType

        nodeName

        nodeValue

    元素节点类型的判断:

        isElement

            判断条件:

                nodeType===1,对象实例于Node,可添加删除节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var testDiv = document.createElement('div');
var isElement = function (obj) {
    if (obj && obj.nodeType === 1) {
        if (window.Node && (obj instanceof Node)) {
            return true;
        }
        try {
            testDiv.appendChild(obj);
            testDiv.removeChild(obj);
        catch (e) {
            return false;
        }
    }
    return false;
};


        isHTML

            判断条件:

                nodeName一定是大写

1
2
3
4
var isHtml = function (doc) {
    return doc.createElement('p').nodeName === doc.createElement('P').nodeName;
};
console.log(isHtml(document));


        isXML

            判断条件:

                nodeName区分大小写

1
2
3
4
var isXML = function (doc) {
    return doc.createElement('p').nodeName !== doc.createElement('P').nodeName;
};
console.log(isXML(document));


        contains

            判断方法:

                现代浏览器 支持contains,兼容方法尝试递归b.parentNode

1
2
3
4
5
6
7
8
9
10
11
12
function fixContains(a, b) {
    try {
        while ((b = b.parentNode)){
            if (b === a) {
                return true;
            }
        }
        return false;
    catch (e) {
        return false;
    }
}



domReady

    渲染引擎的基本流程:

        解析HMTL、构建DOM树 → 构建渲染树  → 布局渲染树  → 绘制渲染树

    domReady实现策略:

        window.load问题:

            等所有元素加载完执行,例如图片, 不能立即执行

            不支持多个函数

        DOMReady策略:

            1.支持DOMContentLoaded事件就用DOMContentLoaded

            2.不支持,就用Hack兼容,通过IE中的document.documentElement.doScroll('left') 来判断DOM树是否创建完毕

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function myReady(fn) {
    //现代浏览器,对DOMContentLoaded事件标准处理事件绑定方式
    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", fn, false);
    else {
        IEContentloaded();
    }
 
    //IE模拟DOMContentLoaded
    function IEContentloaded(fn) {
        var d = window.document;
        var done = false;
        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();
        })();
 
        //监听document的加载状态
        d.onreadystatechange = function () {
            if (d.readyState == 'complete') {
                d.onreadystatechange = null;
                init();
            }
        }
    }
}


 

 

posted @ 2017-02-23 17:00  前望  阅读(381)  评论(0编辑  收藏  举报