JS事件及其兼容用法
JavaScript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。
1、事件流:描述的是从页面中接收事件的顺序。
IE提出的事件冒泡流:事件开始由最具体的元素接收,然后向上传播到较为不具体的节点。
Nerscape提出的事件捕获流:由最不具体的元素逐渐传播到最具体的节点。
DOM2级事件规定了事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。
2、事件处理程序:响应事件的函数。名字一般以“on”开头,如onclick、onload、onmouseover... 添加事件处理程序有3种方法:HTML事件处理程序、DOM0级事件处理程序、DOM2级事件处理程序.
HTML事件处理程序:某个元素支持某种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。
例如: <input type = "button" value = "Click" onclick = "alert('Click')" /> ,由于这个值是JavaScript,因此不能在其中使用未转义的HTML语法字符,例如&、“”、<、>。若要使用引号,可以这么来用: <input type = "button" value = "Click" onclick = "alert("Click")" />
DOM0级事件处理程序:将一个函数赋值给一个事件处理程序。例如:
1 var btn = document.getElementById("myBtn");2 btn.onclick = function(){3 alert("Click");4 };
同时,也可以删除DOM0级方法指定的事件处理程序,只要设置为null即可: btn.onclick = null; //删除DOM0级事件处理程序
DOM2级事件处理程序:“DOM2级事件”定义了俩个 方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener(),接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值,布尔值如果为true,表示在捕获阶段调用事件处理函数;如果是false(默认),在冒泡阶段调用。同时,IE有自己“独特”的事件处理程序去替代这俩个方法:attachEvent()和detachEvent().这样一来,我们就得苦逼的想着如何兼容俩者了,常用的做法如下:
1 var eventUtil={ //type事件不加on! 2 //添加句柄 3 addHandle:function (element,type,handler){ 4 if(element.addEventListener){ 5 element.addEventListener(type,handler,false); 6 }else if(element.attachEvent){ 7 element.attachEvent("on"+type,handler); 8 }else{ 9 element["on"+type].handler;10 }11 }12 //删除句柄---匿名函数不能被移除13 removeHandle:function (element,type,handler){14 if(element.removeEventListener){15 element.removeEventListener(type,handler,false);16 }else if(element.detachEvent){17 element.detachEvent("on"+type,handler);18 }else{19 element["on"+type]=null;20 } 21 }22 } 23 24 eventUtil.addHandle(oBtn,'click',show); //调用方法
3、事件对象:在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。
事件对象的获取和属性方面,IE有显得那么“特殊”。因此,我们处处要想着兼容它。有关事件对象和对象属性,常用的兼容方法如下:
1 var eventUtil={ 2 //获取事件对象 3 getEvent : function (event){ 4 return event ? event : window.event; 5 } 6 //获取事件目标 7 getElement : function(event){ //传入获取到的事件对象 8 return event.target || event.srcElement; 9 }10 //阻止事件冒泡11 stopPropagation:function(event){ //传入获取到的事件对象 12 if(event.stopPropagation){13 event.stopPropagation;14 }else{15 event.cancelBubble=true;16 }17 }18 //阻止默认行为19 preventDefault:function(event){ //传入获取到的事件对象 20 if(event.preventDefault){21 event.preventDefault;22 }else{23 event.returnValue=false;24 } 25 }26 }
具体用法:
use
4、事件类型:Web浏览器中可能发生的事情有很多类型,不同的事件类型具有不同的信息。 “DOM3级事件”规定了以下几类属性:
UI(User Interface,用户界面)事件,当用户与页面上的元素交互时触发;
焦点事件,当元素获取或失去焦点时触发;
鼠标事件,当用户通过鼠标在页面上执行操作时触发;
滚轮事件,当使用滚轮(或类似设备)时触发;
文本事件,当在文档中输入文本时触发;
键盘事件,当用户通过键盘在页面上执行操作时触发;
合成事件,当为IME(Input Method Editor,输入法编辑器)输入字符时触发;
变动(mutation)事件,当底层DOM结构发生变化时触发;
变动名称事件,当元素或属性名变动时触发。此类事件已被废弃。
4.1 UI事件:指的是那些不一定与用户操作有关的事件。这些事件在DOM规范出现之前,都是以这种形式存在的,现有的UI事件如下:
load:当页面完全加载后再window上触发。
unload:当页面完全卸载后再window上触发。
error:当发生JavaScript错误时在window上面触发。
select:当用户选择文本框(<input>或<textarea>)中的一或多个字符时触发。即复制开始时触发。
resize:当窗口或框架的大小变化在window或框架上触发。
scroll:但用户滚动条的元素中内容时,在该元素上面触发。<body>元素中包含所加载页面的滚动条。
4.2 焦点事件:焦点事件会在页面元素获得或失去焦点时触发。
blur:在元素失去焦点时触发。这个事件不会冒泡;所有浏览器都支持它。
focus:在元素获得时触发。这个事件不会冒泡;所有浏览器都支持它。
focusout:与blur等价。
focusin:与focus等价,但它冒泡。
DOMFocusIn:在元素获得焦点时触发。这个事件和focus等价,但它冒泡。只有Opera支持,且在DOM3级事件废除了,选择了focusin。
DOMFocusOut:在元素失去焦点时触发。这个事件是blur的通用版本。只有Opera支持。DOM3级事件废除了,选择了focusout。
4.3 鼠标与滚轮事件
click:在用户单击主鼠标按钮或按下回车键时触发。
dblclick:在用户双击主鼠标时触发。
mousedown:在用户按下了任意鼠标按钮时触发。不能通过键盘触发这个事件。
mouseup:在用户释放鼠标按钮时触发。不能通过键盘触发这个事件。
mouseout:在鼠标指针位于一个元素上方,然后用户将其移入另一个元素时触发。又移入的另一个元素可能位于前一个元素的外部,也可能是这个元素的子元素。不能通过键盘事件触发。
mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发。不能通过键盘事件触发这个事件。
mouseenter:在鼠标光标从元素外部首次移动到元素范围之内触发。这个事件不冒泡,而且在光标移动到后代元素上不会触发。DOM3级纳入规范。IE、Firefox 9+和Opera支持。
mouseleave:在位于元素上方的光标移动到元素范围之外时触发。这个事件不冒泡,而且在光标移动到后代元素上不会触发。DOM3级纳入规范。IE、Firefox 9+和Opera支持。
4.3.1 客户区坐标位置
1 var div = document.getElementById("myDiv");2 EventUtil.addHandler(div, "click", function(event){3 event = EventUtil.getEvent(event); //获取事件对象4 alert("Client coordinates : " + event.clientX + "," +event,clientY); //相对于浏览器窗口位置5 });
4.3.2 页面坐标位置
1 var div = document.getElementById("myDiv");2 EventUtil.addHandler(div, "click", function(event){3 event = EventUtil.getEvent(event);4 alert("Page coordation: "+event.pageX + "," + event.pageY);//相对文档坐标5 }
IE8之前不支持,因此要用clientX/Y 和 滚动信息计算出来。这个时候需要document.body(混杂模式)或documentElement(标准模式)中的scrollLeft和scrollTop属性。计算过程如下:
View Code
4.3.3 屏幕坐标位置
var div = document.getElementById("myDiv"); EventUtil.addHandler(div, "click", function(event){event = EventUtil.getEvent(event);alert("Screen coordation: "+event.screenX + "," + event.screenY);//相对电脑屏幕坐标}
4.3.4 修改键
虽热鼠标事件主要是使用鼠标来触发的,但在按下鼠标时键盘上的某些键的状态也是可以影响到所要采取的操作。这些修改键就是Shift、Ctrl、Alt和Meta(在window键盘中的Window键,在苹果机中的Cmd键),它们经常被用来修改鼠标事件的行为。DOM为此规定了4个属性,表示这些修改键的状态:shiftKey、ctrlKey、altKey和metaKey。这些属性包含的都是布尔值,如果相应的键被按下,则值为true,否则为false。当某个鼠标事件发生时,通过检测这几个属性就可以确定用户是否按下了其中的键。下面来举个例子:
View Code
4.3.5 鼠标滚轮事件
触发鼠标滚轮事件后,生成的事件对象有一个属性叫:wheelDelta,它是一个数值。在不同的浏览器不同的滚动方向有不同的数值,因此,我们还要去兼容它。
1 var eventUtil ={ 2 //获取鼠标滚轮属性值 3 getWheelDelta:function(event) { 4 if(event.wheelDelta) { 5 return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDalta); //针对Opera浏览器 6 }else{ 7 return -event.detail * 40; 8 } 9 }10 }
具体用法:
View Code
4.4 键盘和文本事件:用户在使用键盘时会触发键盘事件。
有3个键盘事件,简述如下:
keydown:当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件。
keypress:当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件。
keyup:当用户释放键盘上的键时触发。
只有一个文本事件:textInput。这个事件是对keypress的补充,用意是将文本显示给用户之前更容易拦截文本。在文本插入文本框之前会触发textInput事件。
在用户按了一个字符键时,首先触发keydown事件,然后紧跟着是keypress事件,最后触发keyup事件。其中,keydown和keypress都是在文本框发生变化之前被触发;而keyup事件则是在文本框已经发生变化之后被触发。
4.4.1 键码
在发生keydown和keyup事件时,event对象的keyCode属性中会包含一个代码,与键盘上一个特定的键对应。对数字字母字符键,keyCode属性的值与ASCII码中对应小写字母的编码相同——与Shift状态无关。DOM和IE的event对象都支持keyCode属性。
keyCode用法
4.4.2 字符编码
发生keypress事件意味着按下的键会影响到屏幕中文本的显示。在所有浏览器中,按下能够插入或删除字符的键都会触发keypress事件;按下其他键能否触发此事件因浏览器而异。IE9+、Firefox、Chrome和Safiri的event对象都支持一个charCode属性,这个属性只有发生在keypress事件时才包含值,而且这个值是按下的那个键所代表字符的ASCII编码。此时keyCode通常等于0或者也等于所按键的键码。IE8及之前版本和Opera则是在keyCode中保存字符的ASCII编码。想要以跨浏览器的方式取得字符编码,必须首先检测charCode属性是否可用,如果不可用则使用keyCode,如下:
1 var eventUtil = {2 //省略其他代码3 getCharCode: function(event) {4 if(typeof event.charCode == "number"){ //判断是否支持charCode属性5 return event.charCode;6 }else{7 return event.keyCode;8 },9 };
具体用法:
keyCode/charCode用法
附:有关键盘事件和键盘事件对象属性请参考——JS之keyCode、charCode、which对比.
4.4.3 textInput事件
“DOM3级事件”规范中引入了一个新事件,名叫textInput。根据规范,当用户在可编辑区域中输入字符时,就会触发这个事件。这个用于替代keypress的textInput事件的行为稍有不同。区别之一就是任何可以获得焦点的元素都可以触发keypress事件,但只有可编辑区域才能触发textInput事件。区别之二是textInput事件只会在用户按下能够输入实际字符的键时才会被触发,而keypress事件则在按下那些能够影响文本显示的键时也会触发(例如退格键)。该事件对象还有一个属性叫data。这个属性的值就是输入的字符本身的值。先触发该事件,才能显示该字符。
JS事件及其兼容用法相关推荐
- javascript基础——文字变大变小className的使用及JS浮动的兼容用法
文字变大变小,详情页比较常见的那种 <!DOCTYPE html> <html lang="en"> <head><meta charse ...
- js事件监听器用法实例详解
这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下 本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体 ...
- 滚轮y坐标html,web交互之js事件
前言 事件是用来实现js和html之间交互的,可以用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软件工程中被称为观察员模式的模型,支持页面的行为(js)与页面的外观(htm ...
- js触发php事件,JavaScript_代码触发js事件(click、change)示例应用,Chrome , Firfox 不支持fireEvent的方 - phpStudy...
代码触发js事件(click.change)示例应用 Chrome , Firfox 不支持fireEvent的方法 可以使用dispatchEvent的方法替代, 直接给一个兼容的Code. 触发c ...
- JS 事件 0331
1.复习 DOM操作,内容的设定 写入 标签对象.innerHTML = '内容' 支持解析标签 标签对象.innerText = '内容' 不支持,不解析标签 获取 var 变量 = 标签对象.in ...
- Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()
什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多 ...
- JS 事件冒泡和事件捕获
原文:https://www.cnblogs.com/qq9694526/p/5653728.html JS 事件冒泡和事件捕获 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jq ...
- JS事件流和事件委托
在上一篇<JS知识点大杂烩>中说到了事件流但没有详细的介绍,这篇文章就来介绍一下事件流. 事件流一共由三个阶段分别是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 复制代码 事件绑定大家都知 ...
- Javascript自定义事件功能与用法实例分析
原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...
最新文章
- 使用pytorch从零开始实现YOLO-V3目标检测算法 (二)
- 2014年湖北省TI杯大学生电子设计竞赛论文格式
- pip安装mysql模块_使用pip安装mysql模块for python
- python selenium对象怎么序列化_python selenium爬取斗鱼
- 项目管理平台(总结篇一)
- 内网访问已经启动的vue项目
- oracle erp 表结构
- 高物实验报告计算机模拟高分子,高分子物理实验课程改革的论文
- 通过深度学习股价截面数据分析和预测股票价格
- 使用PS旋转单个图层
- 吊炸天核心Java面试问题,一问一答题,一问多答题(建议学习)
- Java中的String为什么是不可变的?
- 学计算机买什么电脑性价比高,学生用什么笔记本电脑好 性价比高的学生笔记本电脑...
- 使用Alexnet实现CIFAR100数据集的训练
- 基于单片机的智能饮水机设计
- python计算机视觉 第四章照相机模型与增强现实
- 超香免费黑科技,用一次就爱上,功能强大的APP
- 【精华】PMP认证最全介绍!
- Windows系统组件漏洞
- k线符号图解大全_如何股票开户,麻烦朋友们介绍一个好点的证券公司?k线组合108式图解...
热门文章
- java反射效率对比_Java反射三种方式的效率对比
- java+spring+mysql配置_JAVA后台搭建(springboot+mybatis+mysql)项目搭建
- 池州天气预报软件测试,池州天气预报15天
- 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战
- java protobuf 例子_java使用protobuf例子
- java公路车 superma_SuperMac80
- c语言变长数组_2018级C语言大作业 - 祖玛
- mysql 排除另一表_MYSQL 两表 排除 重复记录
- dae怎么用草图大师打开_当 to C市场饱和,该怎么用场景化打开新市场?
- Flask常见错误与解决方法