事件

1事件对象包含哪些信息: e

     *      e.clientX: 当前鼠标点击位置距离(浏览器)左上角的x轴坐标
     *      e.clientY: 当前鼠标点击位置距离(浏览器)左上角的y轴坐标
     *      e.pageX :  当前鼠标点击位置距离(页面body)左上角的x轴坐标
     *      e.pageY :  当前鼠标点击位置距离(页面body)左上角的y轴坐标
     *      ps: e.pageX和e.pageY在ie6-8中是不存在的
     *      e.pageX = e.clientX + (document.documentElement.scrollLeft||document.body.scrollLeft);
     *      e.type : 事件类型  点击事件:'click' 没有'on'
     *      e.preventDefault()  阻止默认行为
     *      e.returnValue = false; ie6-8阻止默认行为
     *      e.target 事件源: 真正触发事件的那个元素,比如:给body绑定一个事件。那么点击任何一个body内的后代元素都会触发body的click事件。而       e.target就是保存的就是真正点击的元素
     *      e.srcElement 在ie6-8中的事件源   window.event.target
     *      e.target = e.target || e.srcElement
     *      e.stopPropagation() 阻止事件传播
     *      e.cancelBubble = true; 在ie6-8中阻止事件冒泡传播
     *      冒泡传播 : 从子元素传播到祖先元素

2常用事件

鼠标事件
onclick onmouseover onmouseout onmouseenter onmouseleave ondbclick...
系统事件
onload onscroll onresize...
表单事件
onfocus onblur
键盘事件
onkeydown onkeyup onkeypress...

3事件包含两种

  • DOM0级事件:
    1)属于元素的私有属性
    2)只能发生在事件流的冒泡阶段
    3)给同一个元素同一个行为绑定相同的方法,之前的方法就会被覆盖;
  • DOM2级事件:1)在元素所属的eventTarget这个类的原型上-公有方法2)
    标准浏览器:addEventListener(type,fn,false)
    事件对象:对当前行为的详细描述
    事件对象的兼容处理:e=e||window.event;
    1.type:当前所触发的行为-兼容
    2.clientX/Y:当前鼠标落脚点,距离可视区左上角的坐标位置-兼容
    3.pageX/pageY:当前鼠标落脚点,距离第一屏左上角的坐标位置-不兼容
    (document.documentElement.scrollTop||document.body.scrollTop)+e.clientY;
    4.e.keyCode:键码
    5.阻止默认事件:e.preventDefault? e.preventDefault(): e.returnValue=false;
    6.阻止冒泡 e.stopPropagation? e.stopPropagation(): e.cancelBubble=true;
    7.关联元素:
    onmouseover :e.fromElement||e.relatedTarget; if(!this.contains(oTo)){}
    onmouseout :e.toElement||e.relatedTarget; if(!this.contains(oTo)){}

4事件流:

第一种:事件流包含3阶段:1)捕获阶段 2)事件源 3)冒泡阶段
第二种:事件流包含2阶段:1)捕获阶段 2)冒泡阶段

5事件委托:

当一个容器中的n多个元素,都要发生某个行为的时候,我们可以把这个行为委托给他们共同的父级(父容器);然后通过事件源做不同的区分;
事件委托->是对事件冒泡的典型运用;

6onmouseover和onmouseout:

问题:如果里面有子元素的话;会发生冒泡的问题,无法通过阻止冒泡来解决
其他解决措施:
1)onmosueenter 和 onmouseleave
2)用关联元素来解决:如果是关联元素,不做任何操作,如果不是关联元素,才写代码块;
oncontextmenu 阻止鼠标右键的
e.pageX=(document.documentElement.scrollLeft||document.body.scrollLeft)+ e.clientX;
e.pageY=(document.documentElement.scrollTop||document.body.scrollTop)+ e.clientY;

7拖拽思路

  • 基本效果
    1.当鼠标按下的时候:保存元素的位置和鼠标落脚点
    2.当鼠标移动的时候:元素以前的位置+新的鼠标落脚点-以前的鼠标落脚点
    3.当鼠标抬起的时候:释放元素身上的onmousemove和onmouseup事件
  • 兼容处理:
    因为当快速移动的时候,元素会失去焦点,导致拖拽无法正常进行
    标准浏览器下:document
    IE浏览器下:焦点捕获
    - 设置焦点 ele.setCapture()
    - 释放焦点 ele.releaseCapture();

IE事件库的问题:

  • 1)顺序问题 2)重复绑定的问题 3)this问题:attachEvent绑定方法中,this指向window;而不是当前发生事件的这个元素;
  • 封装兼容版事件库思路:
    1)浏览器的兼容处理:
    标准浏览器:ele.addEventListener(type,fn,false)
    IE浏览器:ele.attachEvent('on'+type,fn)
    2)标准浏览器下的DOM2级事件绑定:1)顺序 2)this指向当前元素 3)不会重复绑定
    IE下attachEvent存在的问题:1)顺序 2)this 3)重复绑定
    3)在IE浏览器下做兼容处理:
    this:把fn放在匿名函数中-》无法解除事件绑定
    放在私有变量中-》unbind中无法获取该私有变量
    ele.tmp=匿名函数->同一个属性名上只能存一个值;后面绑定的方法,覆盖前面绑定方法;
    把每个tmp都放进自己事件池:[]; ele[type+'aEvent']=[];
    -重复绑定的问题: 在放进自己的事件池之前,先检查自己事件池中是否重复;如果重复,既不放进自己事件池(过滤),也不放入系统事件池;
    -顺序问题:把所有click行为下要绑定的方法,都放进自己事件池,给系统事件池中只放了一个run方法(获取数组,顺序调用-判断为函数才能顺序调用);
    解除绑定的时候,一定不能用splice;而要赋值为null;

你可能感兴趣的:(事件)