DOM介绍

DOM 文档对象模型     D - Document      O - Object      M - Model

Node 对象属性

1、nodeType: 节点类型

    e.target.nodeType 来获取节点的类别

    1、Element 1

    2、Attr  2

    3、Text  3

    4、注释  8

    5、Document 9


2、nodeName: 节点名称   返回的是大写 'DIV'

3、nodeValue: 节点的类型

    元素节点的 nodeValue 是 undefined 或 null
    文本节点的 nodeValue 是文本本身
    属性节点的 nodeValue 是属性值

    <p>dfsdfsdf</p>

    let oP = document.querySelector('p');   
    // 这里注意oP是元素如果直接写成oP.nodeValue返回是null,写成oP下的第一个节点才找到文本元素
    oP.firstChild.nodeValue;            

4、parentNode: 返回当前节点的父节点   e.target.parentNode.nodeName

    document.querySelector('ul').parentNode     // <div class="box">...</box>

5、childNodes、children: 返回所有子节点元素,不包括孙节点

    <ul id="list">
        <li>111</li>
        <li>222</li>
        <li>
            <ul>
                <li>333</li>
                <li>444</li>
            </ul>
        </li>
    </ul>

    let oList = document.querySelector("#list");
    let lis = oList.children;
    for(let i=0; i<lis.length; i++){
        console.log(lis[i].nodeName);   // output LI LI LI
    }

    ** childeNodes与children区别 ** 

        childeNodes: 包括空行的文本节点, 如果是空行的节点返回是一个text节点
        children: 不包括空行之类的节点

6、hasChildNodes(): 判断是否有子节点,返回Booleanw值

7、firstChild、lastChild: 返回子节点的第一个节点、最后一个节点

    firstChild 相当于 children[0]

    lastChilde 相当于 children[node.children.length-1]

    <div id="car"><p>aaa</p><div>bbb</div><span>ccc</span></div>

    let oCars = document.querySelector("#car");
    console.log(oCars.firstNode, oCars.lastNode);   //<p>aaa</p> 、 <span>ccc</span>

8、previousSibling、nextSibling: 当前节点的前一个节点、后一个节点

    注意: 如果是空行返回的是 text

9、innerHTML: 获取或修改HTML元素内容

    Element.innerHTML = '<div>xxxxx<div>';

10、innerText: 获取或修改的是除去html的文本

11、outerHTML、outerText: 与innerHTML、innerText相当,不同的是它包含当前节点元素,inner只包含子节点元素

12、offsetParent: 获取当前元素定位的父元素  找到基于设置position的父元素

     document.querySelector('ul').offsetParent

Node 对象的方法

一、节点操作方法

    1、getElementById(): 获取指定ID的元素

    2、getElementsByTagName(): 获取指定标签名称的所有元素

    3、getElementsByClassName(): 获取指定类名的元素

    4、appendChild(): 追加子节点  注意这里插入的是一个节点,而不是HTML的字符串 parent.appendChild(children);

    5、removeChild(): 删除子节点,不能删除孙子节点    (removeNode 只支持IE)

        删除节点 并返回删除的节点
        let oSubCar = document.querSelector('#subCar');
        document.querySelector('body').removeChild(oSubCar);        // <div id="subCar">...</div>

    6、cloneNode(Boolean): 复制节点  如果参数为true复制指定节点下包括所有子节点,如果不写只复制当前节点不手包子节点

        <div class="car">
            <ul id="box">
                <li>aaa</li>
                <li>bbb</li>
                <li>ccc</li>
            </ul>
        </div>
        <div id="subCar"></div>

        <script>
            // 将id=box所有的节点插入到id=subCar中
            let boxList = document.querySelector('#box').cloneNode(true);
            var oSubCar = document.querySelector('#subCar');
            oSubCar.appendChild(boxList);
        </script>

    7、hasAttributes(): 判断当前节点是否拥有属性

        <div id="miniCar"></div>
        <div>swsss</div>

        let isAttribute = document.getElementsByTagName('div')[1].hasAttributes();
        console.log(isAttribute);   // false

    8、hasChildNodes(): 判断当前节点是否拥有子节点

    9、insertBefore(newitem, ex): 在指定节点之前插入

        insertAfter(): 这个需要自己来写没有这个方法

        let oMain = document.querySelector('#main');
        let oP = document.querySelector('p');
        let oUl = document.querySelector('.uls').cloneNode(true);
        oMain.insertBefore(oUl, oP);    将ul元素内所有节点复制并插入到oP元素之前

    10、replaceChild(newNode, oldNode): 替换节点

        document.querySelector('body').replaceChild(oMiniCar, oSubCar)


二、创建元素方法

    1、createAttribute(): 创建属性节点

    2、createElement(): 创建元素节点

    3、createTextNode(): 创建文本节点


三、操作属性方法

    1、getAttribute(): 获取属性值

    2、setAttribute(): 设置属性值

CSS样式

1、style:获取或设置style值   Element.style.color = 'blue' 

2、currentStyle、getCurrentStyle()获取样式中每个属性的值

    var oBox = document.querySelector('#box');
    var getStyle = function(obj, attr){
        return window.getComputedStyle ? window.getComputedStyle(obj, null)[attr] : obj.currentStyle[attr];
    }

    var attrTxt = getStyle(oBox, 'width');          // '100px';

    注意: (1)中style只能获取元素中的内联样式,而currentStyle、getCurrentStyle()无论是内联样式还是在class中都可以找到

3、getComputedStyle(元素, 伪类): 获取指定元素值,currentStyle(ie独有) 

    <script>
        function getStyle(element, attr) {
            if(window.getComputedStyle) {
                return window.getComputedStyle(element, null)[attr];
            } else {
                return element.currentStyle[attr];
            }
        }

        // 获取class=position-node元素上的position值
        var dom = document.querySelector(".position-node");
        var style = getStyle(dom);
        console.log(style.position);    // 返回relative
    </script>


    *** element.getComputedStyle与element.style的区别

    element.getComputedStyle: 只读
    element.style: 可读写

4、className: 获取或设置元素的类名  Element.addClass = 'classname'

其它

1、write(): 向输出流写文本或html

2、document.title: 返回标题

4、"javascript:" : 伪协议 来调用javascript http协议(http://),FTP协议(ftp://)

5、对象检测: 可以测试浏览器是否支持当前对象

    if(document.getElementById){ ...}

性能

1、createDocumentFragment: 创建文档碎片

    Example: 创建节点并插入到body中,如果不使用文档碎片,每次都需要重新插入一次

    var oFragment = document.createDocumentFragment();
    for(var i = 0 ; i < 10; i ++) {
        var p = document.createElement("p");
        var oTxt = document.createTextNode("段落" + i);
        p.appendChild(oTxt);
        oFragment.appendChild(p);
    }
    document.body.appendChild(oFragment);

事件

1、表单事件:

    submit事件

    reset事件

    click事件

    change事件

    focus事件(不冒泡) (IE和ES5支持冒泡的focusin)

    blur事件(不冒泡) (IE和ES5支持冒泡的focusout)

    input事件(ES5 textinput提供更方便的获取输入文字的方案)


2、Window事件

    load: 资源全部加载完成后触发事件(图片、css、js)

    DOMContentLoaded事件: Document对象构建完后就开始调用此事件

    readyStatechage事件:

    unload事件: 关闭borwser的时候触发

    beforeunload事件

    resize: 浏览器窗口发生改变触发

    scroll: 滚动条有变化时触发


3、鼠标事件

    click: 点击事件

    dbclick:双击事件

    mouseover: 鼠标移入事件(冒泡)

    mouseout: 鼠标移出事件(冒泡)

    mousedown: 鼠标按下事件

    mouseup: 鼠标放开事件

    contextmenu: 上下文本菜单事件

    mouseenter: 事件(不冒泡)

    mouseleave: 事件(不冒泡)

    mousewheel: 事件(FF DOMMouseScroll事件、DOM3 wheel事件)


4、键盘事件

    keydown事件

    keyup事件

    keypress事件