DOM&事件委托

199 阅读5分钟

not finished

事件

事件流:从页面中接受事件的顺序。 事件机制:捕获阶段、目标元素阶段、冒泡阶段
事件委托:利用事件冒泡原理,对子元素的事件绑定可以委托上级元素 e.target||e.srcElement 例如,click事件会一直冒泡到document,即给整个页面指定onclick事件处理程序,而不必给每个可点击的元素分别添加事件处理程序。

var list = document.getElementById('myLinks');
EventUtil.addHandler(list, 'click', function(event){
  event = EventUtil.getEvent(event);
  var target - EventUtil.getTarget(event);
  switch(target.id) {
    case “doSomething”:
    document.tiele = “I changed the document’s titile”;
    break;
    case “goSomething”:
    location.href = “http://www.wrox.com”;
    break;
    case “sayHi”:
    alert(“hi”);
    break;
  }
});

页面卸载之前,要通过onunload事件处理程序移除所有事件处理程序。事件委托就体现了它的好处,容易定位,移除很容易。

鼠标相关——event对象

  • 兼容写法:var e = window.event||e;
    window.event不兼容火狐
  • 鼠标位置的属性
    • 鼠标距离屏幕的距离:e.screenX
    • 鼠标距离浏览器可视区域的距离:e.clientX
    • 数据距离页面的距离:e.pageX(有兼容问题)
      兼容写法:e.clientX+scroll().left=看的见的+看不见的
    • 数据距离所在元素的距离:e.offsetX/e.layerX
  • 鼠标按键相关 e.button
    • 0 左键 1 中间键 2 右键
    • 有兼容问题,主要是ie678
  • 键盘相关属性
    • event.keyCode/which
      按键编码
      通过 String.fromCharCode()转字符串
    • event.ctrlKey/shiftKey/altKey 组合按键
  • 阻止冒泡
    • e.stopPropagation()
    • e.cancleBubble=true IE678
  • 阻止浏览器默认行为
    • e.parventDefault()
    • return false;

  • e.clientX
    鼠标距离页面可视区域的宽高
  • e.pageX
    鼠标距离文档的距离
  • e.offsetX/e.layerX
    鼠标距离最近的元素的距离
  • e.screenX
    鼠标距离页面可视区域的距离

拖拽

onmousedown+onmousemove+onmouseup+边界检测

事件类型

  • onclick 单击事件
  • onload 页面加载完成
  • onmouseover 鼠标悬停
  • onmouseout 鼠标移出
  • onmouseenter
  • onmouseleave
  • onchange 表单元素内容改变
  • onfocus 失去焦点
  • onblur 获取焦点
  • onkeydown
  • onkeypress
  • onkeyup

事件绑定方法

  • <p onclick="alert(1)">
  • dom.onclick = function(){}
  • dom.addEventListenr('click',function(){},false)
    IE9
  • dom.attachEvent('onclick',function(){})
    IE9以下

BOM

浏览器对象模型
常用的方法和对象

  • alert()
  • console.dir() 控制台输出
  • confirm()
  • window.close()
  • window.open()
  • history.back() 回退
  • history.forward() 前进
  • history.href() 地址信息
  • location.reload() 重新加载
  • var timer = setTimeout(function(){},1000)
    clearTimeout(timer)
  • var timer = setInterval(function(){},1000) clearInterval(timer)
  • 浏览器可视区域的宽高getClient
    • window.innerWidth/innerHeight IE9+
    • 标准模式:document.documentElement.clientWidth
    • 怪异模式:document.body.clientWidth
    • 模式判定:document.compatMode
  • 页面被卷去的距离
    • window.pageYOffset IE9+
    • 兼容写法:
      document.documentElement.scrollTop||document.body.scrollTop
      document.documentElement.scrollLeft||document.body.scrollLeft

DOM

文本对象模型

DOM节点选择

  • document.getElementById(id)
  • document.getElementByClassName(className)
  • document.getElementsByTagName(tagName)
  • document.getElementsByName(name)
  • document.querySelector()
  • document.querySelectorAll()

DOM元素的内容获取和设置

  • innerHTML 认识HTML标签
  • innerText 不认识HTML标签
  • value 针对表单元素
  • DOM标签名
    tagName 都是大写
  • DOM属性值的获取和设置
    • dom.getAttribute(属性名)
    • dom.setAttribute(属性名,属性值)
    • dom.removeAttribute(属性名)

DOM节点类型

  • 元素节点
    • nodeType=1
    • nodeValue 类似inneText
    • nodeNAme 类似tagName,都是大写
  • 属性节点 nodeType=2
  • 文本节点 nodeType=3
  • 注释节点 nodeType=8
  • 文档节点 nodeType=9
  • 文档类型节点 nodeType=10
  • 文档碎片节点 nodeType=11
    document.createDocumentFragment()

节点选择

  • dom.parentNode

  • dom.children 元素子节点
  • dom.childNode 所有子节点
  • dom.firstElementNode 第一个子元素节点
  • dom.lastElementNode 最后一个子元素节点

兄弟

  • dom.previousElementSibling 前一个兄弟元素节点
  • dom.nextElementSibling 后一个兄弟元素节点

节点操作

  • 创建节点

    • 创建注释节点
    var commentNode = document.createComment('注释的内容')
    <!--注释的内容-->
    
    • 创建新的空白文档片段
    let fragment = document.createDocumentFragment();
    

    因为文档片段存在于内存中,并不在DOM树中,因此将子元素插入到fragment中时不会引起页面回流。

    • 创建标签名指定的HTML元素
    var element = document.createElement("tagName")
    
  • 插入节点:
    在父元素的最后插入一个子节点 father.appendChild(son)
    在父元素的某个节点之前插入一个子节点 father.insertBefore(son,参照物)

  • 删除节点
    自杀:son.remove()
    父杀子:son.parentNode. (son)

  • 获取元素的样式
    window.getComputedStyle(要获取样式的元素节点,null)[要获取的样式名] div.currentStyle[要获取的样式名]

  • 自定义属性

p.dataset[xxYy]=45

元素距离和位置相关

  • 浏览器可视区域的宽高
    window.innerWidth/innerHeight
  • 页面被卷去的距离
    window.pageXOffset
  • 元素的宽高
    dom.offsetWidth/offsetHeight
  • 元素距离最近的有定位的父元素的距离
    dom.offsetLeft

Element元素

方法

  • Element.after() 在Element节点之后插入节点
  • Element.append() 在element中最后一个子节点插入
  • Element.before() 在Element节点之前插入节点
  • Element.closest() :匹配特定选择器且离当前元素最近的祖先元素(也可以是当前元素本身)。如果匹配不到,则返回 null。包含子元素
  • Element.getAttribute(attributeName) 返回单个属性值
  • Element.getAttributeNames() 返回Element属性的集合数组

DOM元素

offset家族

  • offsetLeft/offsetTop 元素距离最近的有定位的父元素的距离
    没有单位,取整会四舍五入。若要赋值用left/top
  • offsetWidth/offsetHeight
    获取元素的宽高=width+padding+border
  • offsetParent
    距离元素最近的有定位的父元素

scroll家族

  • scrollTop/scrollLeft 被卷曲的部分

    • 元素被卷曲的部分
      dom.scrollLeft
    • 页面被卷曲的部分
        window.pageXOffset == window.scrollX;
        //都不支持IE9 
        //兼容写法
        
        var x = (window.pageXOffset !== undefined) ? window.pageXOffset 
        : (document.documentElement || document.body.parentNode || document.body).scrollLeft;
        var y = (window.pageYOffset !== undefined) ? window.pageYOffset 
        : (document.documentElement || document.body.parentNode || document.body).scrollTop;
      
      
  • scrollWidth/scrollHeight
    元素内容的宽高,不能小于盒子的宽高,IE67除外

cliet家族

  • clientWidth/clientHeight
    元素的宽高=width+padding
  • 页面可视区域的宽高
    • window.innerWidth IE9+
    • document.documentElement.clientWidth 标准模式
    • document.body.clientWidth 怪异模式

DOM事件处理函数

  • addEventListener, removeEventListener()
    参数:要处理的事件名字、事件处理函数、布尔值
    布尔值若在true标准在捕获阶段处理程序,若是false在冒泡阶段处理程序(默认)
  • addtachEvent(), detachEvent()——IE
    参数:事件处理程序名称,事件处理函数
    由于IE8及更早版本只支持事件冒泡,所以通过addEvent()添加的事件处理程序度会添加到冒泡阶段
  • onclick和addtachEvent只能得到冒泡阶段
  • event.currentTarget,event.target
    前者是绑定事件的元素,后者是当前触发事件的元素
    li的事件事件委托到ul上,ul是event.currentTarget,li是event.target

阻止冒泡

function Bubble(e){
    var e = e||window.event;
    if(e&&e.stopPropagation){
        e.stopPropagation();
    } else {
        //IE9+
        e.cancleBubble=true;
    }
}

阻止默认事件

function cancleDefault(e){
    var e = e||window.event;
    if(e&&e.preventDefault){
        e.preventDefault();//IE9+
    } else {
        return false;
        //但这个不能直接用于onClick
    }
}