JavaScript事件总结
Javascript Event事件-总结
一、事件类型
例如:mouseover鼠标移动到、keydown键盘按下
二、事件目标
是发生的事件或与之相关的对象,window、document和Element对象是最常见的事件目标
三、事件对象
是与特定事件相关且包含有关该事件详细信息的对象
用来指定事件类型的属性type
用来指定事件目标的属性target
四、事件类型
鼠标事件
- ‘mousedown’ – 鼠标设备按下一个元素的时候触发mousedown事件。
- ‘mouseup’ – 鼠标设备从按下的元素上弹起的时候触发mouseup事件。
- ‘click’ – 鼠标点击元素的时候触发click事件。
- ‘dblclick’ – 鼠标双击元素的时候触发dblclick事件。
- ‘mousemover’ – 鼠标移动到某元素上的时候触发mousemove事件。
- ‘mouseout’ – 鼠标从某元素离开的时候触发mouseout事件。
- ‘mousemove’ – 鼠标在某元素上移动但未离开的时候触发mousemove事件。
- mousewheel:当使用滚轮时触发
- contextmenu:显示菜单时会触发些事件
- detail:对于click事件来讲他指定了是单击还是双击还是三击
- altKey、ctrlKey、metakey和shiftKey:组合键当键盘按下这几个按钮时返回 true
键盘事件
- ‘keypress’ – 按键按下的时候触发该事件。
- ‘keydown’ – 按键按下的时候触发该事件,并且在keypress事件之前。
- ‘keyup’ – 按键松开的时候触发该事件,在keydown和keypress事件之后。
表单事件
- ‘select’ – 文本字段(input, textarea等)的文本被选择的时候触发该事件。
- ‘change’ – 控件失去input焦点的时候触发该事件(或者值被改变的时候)。
- ‘submit’ – 表单提交的时候触发该事件。
- ‘reset’ – 表单重置的时候触发该事件。
- ‘focus’ – 元素获得焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
- ‘blur’ – 元素失去焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
window事件
- ‘load’ – 页面加载完毕(包括内容、图片、frame、object)的时候触发该事件。
- ‘resize’ – 页面大小改变的时候触发该事件(例如浏览器缩放)。
- ‘scroll’ – 页面滚动的时候触发该事件。
- ‘unload’ – 从页面或frame删除所有内容的时候触发该事件(例如离开一个页面)。
五、注册事件处理程序
addEventListener():标准模式下,ie8之前
attachEvent():ie8之前
移事件事侦听
removeEventListener()
removeattchEvent();
六、事件处理程序
一旦注册了事件处理,浏览器会在指定对象上发生指定类型事件时自动调用它。
通常调用事件处理程序时事件对象作为一个参数,
function handler(event){
event = event || window.event;
}
七、取消默认事件
preventDefault():阻止默认事件
1、eturn false 与 event.preventDefault()的区别:
event.stopPropagation(); // 事件停止冒泡到,即不让事件再向上传递到document,但是此事件的默认行为仍然被执行,如点击一个链接,调用了
event.stopPropagation(),链接仍然会被打开。
event.preventDefault(); // 取消了事件的默认行为,如点击一个链接,链接不会被打开,但是此事件仍然会传递给更上一层的先辈元素。
在事件处理函数中使用 return false; 相当于同时调用了event.stopPropagation()和event.preventDefault(),事件的默认行为不会被执行,事件也不会冒泡向上传递。
八、阻止冒泡事件
if(event.stopPropagation){
event.StopPropagation(); // 非ie
}
else{
event.cancelBubble = true; // ie
}
九、文档加载事件
当文档加载解析完毕且所有延迟脚本 都执行完毕时会触发DOMContentLoaded事件,此时图片和异步脚本可能依旧在加载
1、事件DOMContentLoaded与load的区别:
先看这两句代码:
window.addEventListener(‘load’, loaded, false);
document.addEventListener(‘DOMContentLoaded’, loaded, false);
问题回顾:
这问题可把我郁闷死了,网上找的一个demo里头,他把样式直接用style内联(这种引进方式是dom方式)进来,然后用DOMContentLoaded来处理js,本来是没问题的。
但是当你把内联的样式写在一个外联的样式文件里头然后再进来的时候,问题就出现了。
什么原因?
DOMContentLoaded在外联样式加载前(dom加载完后)就触发了,外联的样式还没来得及渲染dom,这样导致DOMContentLoaded捕获的状态是外联样式渲染前的状态。
改变窗口大小可以重新触发样式的渲染,所以会形成一个假象:
页面进来的时候某个被样式定义过高度的元素的offsetHeight在你改变一下窗口(或者别的可以引起reflow的操作)时,js获取的这个offsetHeight居然不一样的,而在我们看来页面进来时跟窗口改变后,元素本身就没发生高度变化。
总结:
load事件是在页面所有元素都加载完后触发;
DOMContentLoaded,它是指dom tree加载完就触发。这个事件要小心使用,当然它是个强大的事件,起码用上它在某一层面上防止了页面加载被堵塞。
十、MouseEvent
button:0表示左健、1表示中间键、2表示右键
chientX、chilentY:表示鼠标指针相对于客户区或浏览器窗口的X坐标和Y坐标
screenX、screenY:鼠标指针相对于用户显示器的左上角X坐标和Y坐标
十一、IE Event
type:返回发生事件的类型
srcElement:发生事件的文档元素。与DOM Event对象的target兼容
勿重复检测浏览器
// 事件侦听方式1 function addEvent(el, type, fn){ if(el.addEventListener){ el.addEventListener(type, fn, false); }else{ el.attachEvent('on'+type, fn) } } // 事件侦听方式2 var addEvent = document.addEventListener ? function(el, type, fn) {el.addEventListener(type, fn, false);} : function(el, type, fn) {el.attachEvent('on'+type, fn)};
// 此方式与以上的方式来侦听方式相同,此代码不兼容ie6
var obj = document.getElementById("ss"); obj.onclick = function(){ alert("aa"); }
1、捕捉按键的兼容代码:
1
2
3
4
5
6
7
8
9
|
document.onkeydown=keydown; function keydown( event ) { if ( ! event ) event = window. event ; fasdf var keycode = event .KeyCode | event .Which; alert(keycode); } |
2、window.event只能在ie上执行
1 document.getElementById('btn1').onclick = function(event){ 2 var e = event || window.event; 3 var target = e.srcElement || e.target; // 火狐只能用 event.target,IE只能用event.srcElement 4 alert(target.innerHTML); 5 }
$("#text").click(function(){ alert($(this).attr("aa")); // $(this)相当于event.srcElement || event.target; })
二、获取中文的uncode编码 使用escape和unescape来进行编码
$(function(){ var str = '\u6e56\u5357' ; alert(unescape(str)); // 输出 湖南 var str = '湖南' ; alert(escape(str)); // 输出 \u6e56\u5357 }) |
三、事件绑定
事件绑定的3中常用方法:传统绑定、W3C绑定方法、IE绑定方法。但是,在实际开发中对于我们来讲重要的是需要一个通用的、跨浏览器的绑定方法。如果我们在互联网上搜索一下会发现许多方法,一下是比较知名的几种方法:
创建侦听:
1 // 公用脚本 绑定事件-判断浏览器兼容 2 function addEvent(obj,evtType,func,cap){ 3 cap = cap || false; 4 if(obj.addEventListener){ // w3c标准兼容 5 obj.addEventListener(evtType,func,cap); 6 return true; 7 } 8 else if(obj.attachEvent){ // IE兼容 9 if(cap){ 10 obj.setCapture(); 11 return true; 12 } 13 else{ 14 return obj.attachEvent("on" + evtType,func); 15 } 16 } 17 else{ // 其它浏览器 18 return false; 19 } 20 } 21 22 addEvent(window, "resize", AdMoveConfig.Resize); 23 addEvent(window, "scroll", AdMoveConfig.Scroll);
解除侦听:
1 function removeEventHandler(target, type, func) { 2 if (target.removeEventListener) 3 target.removeEventListener(type, func, false); 4 else if (target.detachEvent) 5 target.detachEvent("on" + type, func); 6 else delete target["on" + type]; 7 }
1 removeEventHandler(Button1, "click", test);
完整代码:
四、键盘事件
1、首先需要知道的是:
1、keydown()
keydown事件会在键盘按下时触发.
2、keyup()
keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件
3、keypress()
keypress事件会在敲击按键时触发,我们可以理解为按下并抬起同一个按键
2、获得键盘上对应的ascII码:
1
2
3
|
$(document).keydown(function( event ){ alert( event .keyCode); }); |
3、实例(当按下键盘上的左右方面键时)
<div style= "width:30px; height: 30px; border: 1px #ccc solid; left: 0px; top:0px; position: absolute;" id= "bl" ></div> <div id= "test" ></div> $(function(){ $(document).keydown(function( event ){ var slef = $( '#bl' ); var _l = slef.css( 'left' ); $( '#test' ).html(_l); //判断当event.keyCode 为37时(即左方面键),执行函数to_left(); //判断当event.keyCode 为39时(即右方面键),执行函数to_right(); if ( event .keyCode == 37){ slef.css( 'left' , parseInt(_l)-5+ 'px' ); } if ( event .keyCode == 39){ slef.css( 'left' , parseInt(_l)+5+ 'px' ); } }) }) |
4、组合键
<div style= "width:30px; height: 30px; border: 1px #ccc solid; left: 0px; top:0px; position: absolute;" id= "bl" ></div> <div id= "test" ></div> <script type= "text/javascript" > $(function(){ $(document).keydown(function( event ){ // alert(event.keyCode); // 输入键盘码 var slef = $( '#bl' ); var _l = slef.css( 'left' ); $( '#test' ).html(_l); if ( event .ctrlKey && event .keyCode == 73){ // 组合键ctrl+i slef.css( 'left' , parseInt(_l)-5+ 'px' ); } if ( event .keyCode == 39){ slef.css( 'left' , parseInt(_l)+5+ 'px' ); } }) }) </script> |
5、侦听ctrl键
$(function(){ $(document).keydown(function( event ){ if ( event .ctrlKey){ //(ctrlKey和metaKey等效:都是监测)按下ctrl返回turn,按下非ctrl键返回false; $( '#test' ).html( '已按下' ); } }) }) |
6、键盘系列操作
$(function(){ $(document).keydown(function ( event ) { //$('#test').html(event.keyCode); // 输入键盘码 /* var e = event || window.event; var k = e.keyCode || e.which; */ var e = event || window. event ; // 获取window.event ie兼容 var k = e.keyCode || e.which; // 获取按键码 switch (k) { case 69: $( '#test' ).html( 'e' ); break ; case 81: $( '#test' ).html( 'q' ); break ; case 82: $( '#test' ).html( 'r' ); break ; case 87: $( '#test' ).html( 'w' ); break ; default : $( '#test' ).html( '不对' ); break ; } }) }); |
五、JS中判断鼠标按键
IE 左键是 window.event.button = 1 右键是 window.event.button = 2 中键是 window.event.button = 4 没有按键动作window.event.button = 0
Firefox 左键是 event.button = 0 右键是 event.button = 2 中键是 event.button = 1 没有按键动作 event.button = 0
Opera 7.23/7.54 鼠标左键是 window.event.button = 1 没有按键动作 window.event.button = 1 右键和中键无法获取
Opera 7.60/8.0 鼠标左键是 window.event.button = 0 没有按键动作 window.event.button = 0 右键和中键无法获取
另外:屏蔽右键的是window.event.button = 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$(function () { $(document).mousedown(function( event ){ // var e = event || window.event; switch ( event .button){ case 1: $( '#test' ).html( '中键按下' ); break ; case 2: $( '#test' ).html( '右键按下' ); break ; case 3: $( '#test' ).html( '左右键同时按下' ); break ; default : $( '#test' ).html( '没有键按下' ); break ; } $( '#test1' ).html(e.button); }) }) |
四、Event属性:
altKey, button, cancelBubble, clientX, clientY, ctrlKey, fromElement, keyCode, offsetX, offsetY, propertyName, returnValue, screenX, screenY, shiftKey, srcElement, srcFilter, toElement, type, x, y
1.altKey 描述: 检查alt键的状态。
语法: event.altKey
可能的值: 当alt键按下时,值为 TRUE ,否则为 FALSE 。只读。
2.button 描述: 检查按下的鼠标键。
语法: event.button
可能的值: 0 没按键 1 按左键 2 按右键 3 按左右键 4 按中间键 5 按左键和中间键 6 按右键和中间键 7 按所有的键
这个属性仅用于onmousedown, onmouseup, 和 onmousemove 事件。对其他事件,不管鼠标状态如何,都返回 0(比如onclick)。
3.cancelBubble 描述: 检测是否接受上层元素的事件的控制。
语法: event.cancelBubble[ = cancelBubble]
可能的值: 这是一个可读写的布尔值:
TRUE 不被上层原素的事件控制。 FALSE 允许被上层元素的事件控制。这是默认值。
例子: 下面的代码片断演示了当在图片上点击(onclick)时,如果同时shift键也被按下,就取消上层元素(body)上的事件onclick所引发的showSrc()函数。
<SCRIPT LANGUAGE="JScript"> function checkCancel() ...{ if (window.event.shiftKey) window.event.cancelBubble = true; } function showSrc() ...{ if (window.event.srcElement.tagName == "IMG") alert(window.event.srcElement.src); } </SCRIPT> <BODY onclick="showSrc()"> <IMG onclick="checkCancel()" src="/sample.gif">
4.clientX 描述: 返回鼠标在窗口客户区域中的X坐标。
语法: event.clientX
注释: 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。
5.clientY 描述: 返回鼠标在窗口客户区域中的Y坐标。
语法: event.clientY
注释: 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。
6.ctrlKey 描述: 检查ctrl键的状态。
语法: event.ctrlKey
可能的值: 按ctrl键按下时,值为 TRUE ,否则为 FALSE 。只读。
7.fromElement 描述: 检测 onmouseover 和 onmouseout 事件发生时,鼠标所离开的元素。 参考:18.toElement
语法: event.fromElement
注释: 这是个只读属性。
8.keyCode 描述: 检测键盘事件相对应的内码。 这个属性用于 onkeydown, onkeyup, 和 onkeypress 事件。
语法: event.keyCode[ = keyCode]
可能的值: 这是个可读写的值,可以是任何一个Unicode键盘内码。如果没有引发键盘事件,则该值为 0 。
9.offsetX 描述: 检查相对于触发事件的对象,鼠标位置的水平坐标
语法: event.offsetX
10.offsetY 描述: 检查相对于触发事件的对象,鼠标位置的垂直坐标
语法: event.offsetY
11.propertyName 描述: 设置或返回元素的变化了的属性的名称。
语法: event.propertyName [ = sProperty ]
可能的值: sProperty 是一个字符串,指定或返回触发事件的元素在事件中变化了的属性的名称。 这个属性是可读写的。无默认值。
注释: 你可以通过使用 onpropertychange 事件,得到 propertyName 的值。
例子: 下面的例子通过使用 onpropertychange 事件,弹出一个对话框,显示 propertyName 的值。
<HEAD> <SCRIPT>... function changeProp()...{ btnProp.value = "This is the new VALUE"; }
function changeCSSProp()...{ btnStyleProp.style.backgroundColor = "aqua"; } </SCRIPT> </HEAD> <BODY> <P>The event object property propertyName is used here to return which property has been altered.</P>
<INPUT TYPE=button ID=btnProp onclick="changeProp()" VALUE="Click to change the VALUE property of this button" onpropertychange='alert(event.propertyName+" property has changed value")'> <INPUT TYPE=button ID=btnStyleProp onclick="changeCSSProp()" VALUE="Click to change the CSS backgroundColor property of this button" onpropertychange='alert(event.propertyName+" property has changed value")'> </BODY>
12.returnValue 描述: 设置或检查从事件中返回的值
语法: event.returnValue[ = Boolean]
可能的值:
true 事件中的值被返回 false 源对象上事件的默认操作被取消
例子见本文的开头。
13.screenX 描述: 检测鼠标相对于用户屏幕的水平位置
语法: event.screenX
注释: 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。
14.screenY 描述: 检测鼠标相对于用户屏幕的垂直位置
语法: event.screenY
注释: 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。
15.shiftKey 描述: 检查shift键的状态。
语法: event.shiftKey
可能的值: 按shift键按下时,值为 TRUE ,否则为 FALSE 。只读。
16.srcElement 描述: 返回触发事件的元素。只读。例子见本文开头。
语法: event.srcElement
17.srcFilter 描述: 返回触发 onfilterchange 事件的滤镜。只读。
语法: event.srcFilter
18.toElement 描述: 检测 onmouseover 和 onmouseout 事件发生时,鼠标所进入的元素。 参考:7.fromElement
语法: event.toElement
注释: 这是个只读属性。
例子:下面的代码演示了当鼠标移到按钮上时,弹出一个对话框,显示“mouse arrived”
<SCRIPT> function testMouse(oObject) ...{ if(oObject.contains(event.toElement)) ...{ alert("mouse arrived"); } } </SCRIPT>
<BUTTON ID=oButton onmouseover="testMouse(this)">Mouse Over This.</BUTTON>
19.type 描述: 返回事件名。
语法: event.type
注释: 返回没有“on”作为前缀的事件名,比如,onclick事件返回的type是click 只读。
20. x 描述: 返回鼠标相对于css属性中有position属性的上级元素的x轴坐标。如果没有css属性中有position属性的上级元素,默认以BODY元素作为参考对象。
语法: event.x
注释: 如果事件触发后,鼠标移出窗口外,则返回的值为 -1 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。
21. y 描述: 返回鼠标相对于css属性中有position属性的上级元素的y轴坐标。如果没有css属性中有position属性的上级元素,默认以BODY元素作为参考对象。
语法: event.y
注释: 如果事件触发后,鼠标移出窗口外,则返回的值为 -1 这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。