• JS--DOM


    # DOM 基础
    ## Document Object Model 
    - 文档对象模型
    - DOM就是让我们可以通过JS来操作网页
    - 文档
        - 文档指的是整个网页文档
    - 对象
        - 将网页中的每一个部分都转换为了一个对象
    - 模型
        - 通过模型来表示对象之间的关系,方便我们查找对象

    ![](http://i.imgur.com/lRO2maM.png)

    ### DOM 节点
    - 节点是构成网页的最基本的单位.网页就是由节点构成的
    - 节点又分为多种不同的类型:
        - 文档节点  (doument)
            - 代表整个网页
        - 元素节点    (element)
            - 代表网页中的标签
        - 属性节点    (arreibute)
            - 代表标签中的属性
        - 文本节点    (text)
            - 代表网页中的文本
            
    ### Document 对象方法
    - document.getElementById("id属性值")
        - 根据元素的id属性值,查找一个元素节点
    - document.getElementsByTagName("标签名")
        - 根据标签名,查询一组元素节点对象
    - document.getElementsByName("name属性值")
        - 根据元素的name属性值,查找一组元素节点对象 (用于表单返回一个数组)
    - document.getElementsByClassName('class属性值')
        - 根据class属性值获取一组元素节点对象
    - **document.querySelector("CSS选择器")**
        - 根据css选择器去页面中查找对象
        - 只返回一个符合条件的元素
    - **document.querySelectorAll("CSS选择器")**
        - 匹配的CSS选择器的所有元素节点列表
        - 将所有符合条件的元素封装到一个数组中返回
    - **document.addEventListener()**
        - 第一个参数: 要绑定的事件(字符串格式.没有on)
        - 第二个参数: 回调函数(事件触发时函数执行.形参event)
        - 第三个参数: 是否在捕获阶段触发事件(默认false)
    - document.createElement('标签名')
        - 可以根据标签名来创建一个指定的元素节点对象
    - document.createTextNode('文本内容')
        - 可以根据文本内容创建一个文本节点对象
        
    ### Document 对象属性
    - document.body
        - 可以用来获取页面中的body元素
    - document.documentElement
        - 可以获取页面的根元素
    - document.all 
        - 可以获取页面的所有元素

    ----------


    ### element方法
    - element.childNodes
        - 获取当前元素所有的子节点
        - 包括空白的文本节点
    - element.children
        - 获取当前元素所有的子节点
        - 不包括文本节点
    - element.firstChild
        - 获取当前元素的第一个子节点
    - element.lastChild
        - 获取当前元素的最后一个子节点
    - element.prentNode
        - 获取当前元素的父节点
    - element.previousSibling
        - 获取当前元素的前一个兄弟节点
        - previousElementSibling(不包括空白文本)
    - element.nextSibling
        - 获取当前元素的后一个兄弟节点
        - nextElementSibling (不包括空白文本)
    - element.appendChild()
        - 为元素添加一个新的子元素
    - element.insertBefore()
        - 在指定的子节点前插入新的子节点
        - 第一个参数:新的节点
        - 第二个参数:要添加新的节点前的子节点
    - element.replaceChild()
        - 指定子节点替换现有的
        - 第一个参数: 要插入的节点
        - 第二个参数: 要移除的节点
    - element.removeChild()
        - 删除一个子节点
    - element.cloneNode()
        - 克隆某个元素
        - 参数: true 表示深度克隆
    ### element属性
    - element.className
        - 设置或返回元素的class属性
    - element.innerHTML
        - 获取和设置元素内部的html代码
    - element.innerText
        - 获取和设置元素内部的文本内容
    - element.nodeValue
        - 文本节点可以通过nodeValue属性获取和设置文本节点的内容
    - **element.classList**
        - 操作 class 属性的对象
        - classList.add(); 为一个DOM动态“追加”一个类(class)
        - classList.remove();为一个DOM动态“删除”一个类(class)
        - classList.toggle();切换一个class属性的状态
        - classList.contanins() 是否包含某class属性
        - length 获取类选择器的个数

    ### arreibute属性相关
    - element.getAttribute()
        - 获取指定元素的属性值
    - element.removeAttribute()
        - 从元素中删除指定属性
    - element.setAttribute()
        - 设置或改变指定属性并指定值
        - 第一个参数: 要添加的属性名
        - 第二个参数: 要添加的属性值
    - attr.name
        - 返回属性名
    - attr.value
        - 设置或返回属性值
        
    ### DOM修改CSS样式
    - 语法: 元素.style.样式名 = 样式值;
    - 样式名需要将其修改为驼峰命名法
    - 通过style修改的样式都是元素的内联样式.所以优先级最高
    #####  getComputedStyle()
    - 第一个参数: 要获取样式的元素
    - 第二个参数: 要获取元素的伪类. 不需要的话传null
    ##### 兼容IE8的获取样式函数
    - 第一个参数: 要获取样式的元素
    - 第二个参数: 要获取的样式的名字

            function getStyle(obj,name){
              if(window.getComputedStyle){
                  return getComputedStyle(obj,null)[name];
              }else{
                  return obj.currentStyle[name];
                };
              };
    #### 其他CSS样式修改
    -  clientWidth
    -  clientHeight
        - 获取元素的可见宽度和高度
        - 包括元素的内容区和内边距
        - 只读
    - offsetWidth
    - offsetHeight 
        - 获取元素整个可见框大小
        - 包括内容区内边距和边框
    - offsetParent
        - 返回当前元素的定位父元素
        - 最近开启了定位的祖先元素
        - 如果没有开启定位则返回body
    - offsetLeft 水平偏移量
    - offsetTop 垂直偏移量 
        - 获取当前元素相对于其定位父元素的偏移量
    - scrollHeight
    - scrollWidth
        - 获取元素滚动区域的高度和宽度
    - scrollTop
        - 垂直滚动条滚动的距离
    - scrollLeft
        - 水平滚动条滚动的距离
    - clientX
        - 可以获取鼠标指针的水平坐标
    - clientY
        - 可以获取鼠标指针的垂直坐标
    - pageX
    - pageY
        - 可以获取鼠标指针相对于页面的坐标
            

    ### DOM事件 event
    - 事件指的用户和网页或浏览器之间的交互行为
    - 需要为事件绑定响应函数来处理事件
          - e.pageX/Y   绝对定位
          - e.clientX/Y   基于视口
          - e.offsetX/Y  相对定位
          
    #### 文档加载
    - 浏览器在加载一个页面时,是按照自上向下的顺序加载
    - 如果将js代码写在页面最上边,在JS代码执行时,页面还没有加载完毕就会导致无法正常获取到DOM对象
    - 解决方法
        - 将js代码写在body标签的下边
        - 将js代码写在````window.onload = function( ){ }; ````里面.onload回调函数会在页面加载完毕以后执行
    #### 事件处理中的this 
    - 在事件处理程序内的 this 所引用的对象即是设定了该事件处理程序的元素。
    - 事件给哪个对象绑定的 this就是哪个对象
    #### 取消默认行为
    - return false 适合dom0
    - event.preventDefault(); 适合dom2
    #### 事件对象
    - 当浏览器调用事件的响应函数时,每次都会传递进一个事件对象,作为参数
    - 在事件对象中封装了当前事件相关的信息.
    - **event 作为形参注入到函数里作为事件对象**
    #### 冒泡
    - 冒泡简单来说就是事件的向上传导. (结构上的关系.不是表现上面的)
    - 当后代元素上的事件被触发时,将会导致祖先元素上的相同事件也被触发
    - 大部分情况下冒泡都是对开发有利的.它可以简化我们的开发
    - 如果不希望发生事件的冒泡.则可以通过事件对象来取消冒泡
    - 取消冒泡
        - event.stopPropagation()
        - event.cancelBubble = true
    #### 事件委派
    - 统一将多个元素上的事件绑定到他们共同的祖先元素上.
    - 这样我们只需要绑定一次即可同时处理多个元素上的相同事件
    - 这样简化了代码开发.这样也确保新添加的元素上也可以有事件响应函数.
    - target属性 ---> 事件由谁触发谁就是target

    #### 事件监听 
    - addEventListener() 普通浏览器
        - 第一个参数: 要绑定的事件(字符串格式.没有on)
        - 第二个参数: 回调函数(事件触发时函数执行.形参event)
        - 第三个参数: 是否在捕获阶段触发事件(默认false)
    - attachEvent() IE浏览器
        - 第一个参数: 绑定的事件 (字符串格式.需要on)
        - 第二个参数: 回调函数

    ###### 事件监听 (兼容IE8)
    参数:

    - obj 要绑定事件的对象
    - eventStr 事件的字符串
    - callback 回调函数.事件触发时调用的函数

            function bind(obj,eventStr,callback){
                 if(obj.addEventListener){
                    obj.addEventListener(eventStr,callback,false)
                }else{
                    attachEvent()
                    obj.attachEvent("on"+eventStr,function(){
                    callback.call(obj);
                  });
              }

    #### 事件的传播
    - 捕获阶段
        - 事件从最外层的元素(document),向目标元素进行事件的捕获
        - 该阶段默认不会触发
    - 目标阶段
        - 触发事件的元素.捕获到目标元素则捕获阶段停止
    - 冒泡阶段
        - 事件从目标元素向祖先元素中冒泡. 此时开始触发事件
        
    ![](http://i.imgur.com/4jpYruV.png)

    ##### 鼠标相关事件
    - onclick 鼠标单击事件
    - ondbclick 鼠标双击事件
    - onmousemove 鼠标移动事件
    - onmouseenter 鼠标移入元素时触发
    - onmouseleave 鼠标移出元素时触发
    - onmouseover 鼠标移到某元素之上时触发
    - onmousedown 鼠标按下时
        - contextmenu  右键菜单
        - e.button == 0 左键
        - e.button == 1 滚轮键
        - e.button == 2 右键
    - onmouseup 鼠标松开时

    ##### 键盘相关事件
    - onkeydown 某个按键按下时
        - event.keyCode 确认按下的键
    - onkeyperss 按键被按下并松开
    - onkeyup 按键松开时

    ##### 其他重要事件
    - onload 当页面加载完成时
    - onresize 当窗口被调整时
    - onscroll  滚动条滚动时触发的事件
    - onblur 元素失去焦点时触发
    - onfocus 元素获取焦点时触发
    - onchange 当input输入值失去焦点发生改变会触发该事件
    - oninput 实时记录input表单输入的内容



    ##### 滚轮相关事件
    **ie/chrome : onmousewheel(dom0)**

        event.wheelDelta
            上:120
            下:-120
                
    **firefox : DOMMouseScroll 必须用(dom2的标准模式)**

        event.detail
            上:-3
            下:3

    - return false阻止的是  dom0 所触发的默认行为
    - dom2 需要通过event下面的event.preventDefault();

  • 相关阅读:
    腾讯2016春招安全岗笔试题解析
    AlgorithmVisualizer
    agentzh --春哥--调试专家
    大话Java性能优化 BOOK
    《Linux内核分析》-----张超
    ROS中Mangle解析
    shell中trap捕获信号
    虚拟化技术性能总结:Zones, KVM, Xen
    Dtrace on Mac OS X
    linux内核学习-建议路线
  • 原文地址:https://www.cnblogs.com/huifang/p/7341922.html
Copyright © 2020-2023  润新知