JS 原生事件

JavaScript016

JS 原生事件,第1张

首先,事件对象 event 是一个对象,包含着跟事件有关的所有信息,包括触发事件的 dom 以及 每种事件的一些特征。当dom操作触发某个事件时,会产生事件对象 event, 当事件被触发时产生,事件执行完毕时销毁。

获取鼠标在那个标签上 e.target

2.1. 事件捕获: 当时事件被触发的时候,系统会从 window 开始 依次向下遍历,遍历的过程中,遇到没有触发的相同事件便触发。

(window =>document =>html =>body =>祖先元素 =>父元素 =>目标元素)

2.2 事件触发: 直到找到触发这个事件的元素,触发元素绑定的事件方法

2.3 事件冒泡: 触发目标事件之后,然后会一层一层向上遍历,遍历的过程中,遇到没有触发的相同事件便触发。

直到返回 window 结束 这整个过程叫做事件流。

事件捕获 和 事件冒泡 同一事件流 只能有一个生效,JS中默认执行事件冒泡 (false)。

3.1 Dom 0级

写法: ele.on事件名 = function(){}

特点: js 与 html 完全分离 便于封装

缺点:同一个DOM对象 同时间只能绑定一个 同事件

    也就是说 一个 dom对象 只能执行一个事件处理函数

    如果给 这个事件 绑定了多个事件处理函数, 则执行最后一个事件处理函数

3.2 Dom 2级(事件监听)

写法:

    ele.addEventListener("事件类型",事件处理函数,bool)

    事件处理函数可以是: 匿名函数、 命名函数、 对象

    bool: 布尔值 (只有true 和 false) 不写默认为 false

    true: 触发 事件捕获   false:触发事件冒泡

特点:

    1.DOM 2级不会与DOM 0级事件冲突 同时存在时两个都执行

    2.可以绑定多个事件函数 不会起冲突

    Dom2级 可以删除命名函数 事件移除 removeEventListener

注意: 事件名中没有 on, on是DOM0级的写法

4.1 鼠标事件

 1. 单机事件 click

 2. 双击事件 dblclick

 3. 右键事件 contextmenu   默认事件:右击打开默认菜单栏

 4. 移入事件 mouseenter

 5. 移出事件 mouseoutmouseover

 6. 移动事件 mouseenter mouseleave

 7. 按下事件 mousedown

 8. 释放事件 mouseup

 9. 滚轮事件 mousewheel   e.wheelDelta>0 向上滑 <0 向下滑

4.2 键盘事件

 1. 键盘按下事件 只要按下就一直触发 keydown 获取键码: e.keyCode

 2. 键盘抬起事件keyup

4.3 UI事件(窗口事件)

 1. 资源加载完毕 load

 2. 窗口大小发生改变 resize

 3. 窗口滚动条 scroll

 4. 资源加载完毕 error

4.4 表单事件

 1. 获取焦点focus

 2. 失去焦点blur

 3. 正在输入input

 4. 内容发生改变 change

1.获取鼠标坐标:

 1. 在浏览器的可视窗口的坐标 --- e.clientX / e.clientY

 2. 在标签内的坐标 ----- e.offsetX / e.offsetY

 3. 在屏幕内的坐标 ----- e.screenX / e. screenY

 4. 在文档中内的坐标 -- e.pageX / e.pageY

2. 阻止默认事件:

在给dom元素添加异步事件的时候,如果需要给子元素添加事件,有两种办法,

1.直接给该子元素添加事件;

2.给该子元素的父元素添加事件,再在回调中判断事件点击的对象;

第一种办法是实现起来简单,可是如果子元素较多,这种做会对性能有较大的影响,而且如果是动态添加的dom元素,那么还需要在添加的时候再手动添加事件。操作过于麻烦;下面就看下在原生js中怎么实现事件委托(jq实现简单,在此不做演示);

我们将点击事件添加到ul上,在点击li标签以及a标签,会将该事件冒泡到ul上面,从而触发ul的onmouseover事件,再在ul的事件中判断当前触发的对象是否是li标签。

方法一:通过事件在html中的内联方式来传递参数(假定变量x是参数,下同):

<input type="button" value="点我" onclick="var x=123test(x)"/>

<script>

function test(x){

   alert(x)

}

</script>

方法二:通过全局变量来传递参数:

<input id="abc" type="button" value="点我"/>

<script>

var x=123

window.onload=function(){

   document.getElementById("abc").onclick=function(){

      alert(x)

   }

}

</script>

方法三:通过对象的自定义属性来传递参数:

<input id="abc" type="button" value="点我"/>

<script>

window.onload=function(){

   var abc=document.getElementById("abc")

   abc.x=123

   abc.onclick=function(){

      alert(this.x)

   }

}

</script>

方法四:利用闭包:

<input id="abc" type="button" value="点我"/>

<script>

window.onload=function(){

   (function(x){

      document.getElementById("abc").onclick=function(){

         alert(x)

      }

   })(123)

}

</script>

暂时就想到这么多了,肯定还有其他方法的。