1. 事件处理

1.1. 绑定事件方式

1)行内绑定

语法: //最常用的使用方式

<元素 事件=”事件处理程序”>

2)动态绑定

//结构+样式+行为分离的页面(html+css+js事件)

语法:

对象.事件=事件处理程序

行内绑定和动态绑定的重要区别:

以上程序是不可用的,点击div时,执行test函数,这时,test中的this表示window对象

因为:

我们定义test函数,实际上相应于在window对象下定义了test属性

test(); —> 相当于 window.test();

所以test函数在执行时,里面的this指向window

“谁”调用了函数,this指向“谁”


  1. <html>
  2. <head>
  3. <script>
  4. window.onload=function(){
  5. document.getElementById('btnok').onclick=function(){
  6. alert('hello');
  7. };
  8. //2、动态绑定
  9. document.getElementById('div1').onclick=test;
  10. };
  11. </script>
  12. </head>
  13. <body>
  14. <input type='button' id='btnok' value='确定'>
  15. <script>
  16. function test(){
  17. this.style.color='red';
  18. }
  19. </script>
  20. <div id='div1'>javascript</div>
  21. </body>
  22. </html>

以上程序是可用的,对象.onclick 在执行test函数时,test函数指向div1元素

1.2 事件监听

我们能不能为一个dom对象的同一个事件指定多个事件处理程序?

例1:通过这题,我们发现,如果为一个对象的同一个事件指定多个事件处理程序,那么,后面指定的程序会覆盖前面的。

  1. <body>
  2. <script>
  3. function fn1(){
  4. alert('first');
  5. }
  6. function fn2(){
  7. alert('second');
  8. }
  9. window.onload=function(){
  10. document.getElementById('div1').onclick=fn1;
  11. document.getElementById('div1').onclick=fn2;
  12. };
  13. </script>
  14. <div id='div1'>test</div>
  15. </body>

如果我们想为一个对象的某个事件指定多个事件处理,可以考虑使用事件监听

事件监听语法:

  1. IE
  2. attachEvent(type,callback)
  3. type:事件名 如:onclickonsubmitonchange
  4. callback:事件处理程序
  5. 基于W3C模型:
  6. addEventListener(type,callback,capture)
  7. Type:事件名 ,没有“on”前缀 如:clicksubmitchange
  8. Callback:事件处理程序
  9. Capture:事件模型 (可选参数) (冒泡模型、捕捉模型) true:捕捉模型
  10. false:冒泡模型 (默认值)

代码示例:

  1. <body>
  2. <script>
  3. function fn1(){
  4. alert('first');
  5. }
  6. function fn2(){
  7. alert('second');
  8. }
  9. window.onload=function(){
  10. document.getElementById('div1').attachEvent('onclick',fn1);
  11. document.getElementById('div1').attachEvent('onclick',fn2);
  12. };
  13. </script>
  14. <div id='div1'>test</div>
  15. </body>

W3c:

  1. <body>
  2. <script>
  3. function fn1(){
  4. alert('first');
  5. }
  6. function fn2(){
  7. alert('second');
  8. }
  9. window.onload=function(){
  10. document.getElementById('div1').addEventListener('click',fn1);
  11. document.getElementById('div1').addEventListener('click',fn2);
  12. };
  13. </script>
  14. <div id='div1'>test</div>
  15. </body>
  1. 总结:

IE和W3C事件监听的不同:

  1. 监听方法不同:IE attachEvent 、W3C addEventListener
  2. 监听参数不同:IE 没有模型参数、W3C有模型参数
  3. 触发顺序:IE 8及以下的浏览器触发时是先绑定、后触发 W3C浏览器是先绑定、先触发
  4. 事件名称不同:IE事件需要”on”前缀,W3C不需要’on’前缀

解决事件监听的兼容性问题:

2. 事件流

2.1 事件模型

事件模型(事件的触发顺序)分为两种:Body嵌套div1,div1嵌套div2,div2嵌套div3

1)冒泡模型

2)捕捉模型

目前,IE只支持冒泡模型

冒泡模型

事件冒泡是指事件响应时会上水冒一样上升至最顶级元素

  1. <div>
  2. <div>
  3. <div>click</div>
  4. </div>
  5. <div>

  1. <style>
  2. #div1{width:400px;height:400px;background:red}
  3. #div2{width:300px;height:300px;background:green}
  4. #div3{width:200px;height:200px;background:blue}
  5. </style>
  6. </head>
  7. <body>
  8. <script language='javascript' src='public.js'></script>
  9. <script>
  10. window.onload=function(){
  11. document.getElementById('div1').onclick=function(){
  12. alert('div1');
  13. };
  14. document.getElementById('div2').onclick=function(event){
  15. alert('div2');
  16. stopBubble(event);
  17. };
  18. document.getElementById('div3').onclick=function(){
  19. alert('div3');
  20. };
  21. };
  22. </script>
  23. <div id='div1'>
  24. <div id='div2'>
  25. <div id='div3'>
  26. </div>
  27. </div>
  28. </div>
  29. </body>

大多数情况下,程序需要对事件冒泡进行取消?

取消事件冒泡

IE:

  1. window.event.cancelBubble=true;

W3C:

  1. function(event){
  2. event.stopPropagation();
  3. }

解决兼容性问题: public.js

3. 事件对象

1)什么是事件对象

事件对象就是事件发生时系统自动产生的对象,这个对象包含了这个事件发生时所有的信息

如:鼠标移动,那么,鼠标所在的横、纵坐标就保存到了这个事件对象中

2)如何获得事件对象

IE9及以上版本、W3C:

  • function(event){}

IE8及以下:

  • window.event

默认行为





有些html元素,有自己的行为,如,提交按钮、超链接

有些时候,我们需要对默认行为进行取消,如表单按钮点击时,用户资料添写不完整,我们这时需要将按钮的默认行为取消。

代码示例:

解决兼容性:

-4. 事件类型

Web 浏览器中可能发生的事件有很多类型,常用的事件流

  • onLoad :页面加载完毕后 一般用于body元素
  • onUnload :页面关闭后 一般用于body元素
  • onBlur :失去焦点
  • onFocus :获得焦点
  • onClick :点击
  • onMouseOver :当鼠标经过时
  • onMouseOut :当鼠标离开时
  • onMouseDown :当鼠标按下时
  • onMouseUp :当鼠标抬起时
  • onMouseMove :当鼠标移动时
  • onChange :当内容改变时
  • onSelect :当内容被选中时
  • onkeypress :当键盘点击时
  • onkeydown :当键盘按下时
  • onkeyup :当键盘抬起时
    • 触发顺序:onkeydown、onkeypress、onkeyup
    • Onkeypress事件无法捕获功能键
  • onSubmit :当表单提交时
  • onReset :当表单重置时
    1. 事件委托(事件代理)

对“事件处理程序过多”问题的解决方案就是事件委托。事件委托利用了事件冒泡,只指定一个事

件处理程序,就可以管理某一类型的所有事件。例如,click 事件会一直冒泡到document 层次。也就

是说,我们可以为整个页面指定一个onclick 事件处理程序,而不必给每个可单击的元素分别添加事

件处理程序。以下面的HTML 代码为例。

  1. <ul id="myLinks">
  2. <li id="goSomewhere">Go somewhere</li>
  3. <li id="doSomething">Do something</li>
  4. <li id="sayHi">Say hi</li>
  5. </ul>

其中包含3 个被单击后会执行操作的列表项。按照传统的做法,需要像下面这样为它们添加3 个事

件处理程序。

  1. var item1 = document.getElementById("goSomewhere");
  2. var item2 = document.getElementById("doSomething");
  3. var item3 = document.getElementById("sayHi");
  4. EventUtil.addHandler(item1, "click", function(event){
  5. location.href = "http://www.wrox.com";
  6. });
  7. EventUtil.addHandler(item2, "click", function(event){
  8. document.title = "I changed the document's title";
  9. });
  10. EventUtil.addHandler(item3, "click", function(event){
  11. alert("hi");
  12. });

如果在一个复杂的Web 应用程序中,对所有可单击的元素都采用这种方式,那么结果就会有数不清的代码用于添加事件处理程序。此时,可以利用事件委托技术解决这个问题。使用事件委托,只需在DOM 树中尽量最高的层次上添加一个事件处理程序,如下面的例子所示。

  1. var list = document.getElementById("myLinks");
  2. EventUtil.addHandler(list, "click", function(event){
  3. event = EventUtil.getEvent(event);
  4. var target = EventUtil.getTarget(event);
  5. switch(target.id){
  6. case "doSomething":
  7. document.title = "I changed the document's title";
  8. break;
  9. case "goSomewhere":
  10. location.href = "http://www.wrox.com";
  11. break;
  12. case "sayHi":
  13. alert("hi");
  14. break;
  15. }
  16. });

如果可行的话,也可以考虑为document 对象添加一个事件处理程序,用以处理页面上发生的某种特定类型的事件。

版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226

javascript 事件编程之事件(流,处理,对象,类型)的更多相关文章

  1. JavaScript总体的介绍【JavaScript介绍、定义函数方式、对象类型、变量类型】

    什么是JavaScript? 我们可以从几个方面去说JavaScript是什么: 基于对象 javaScript中内置了许多对象供我们使用[String.Date.Array]等等 javaScrip ...

  2. JavaScript进阶内容笔记1:各种对象类型判断

    该文章主要用来介绍JavaScript中常用的一些对象检测判断方法,整理资源来自书本和网络,如有错误或说明不详之处,望评论提出,本菜定提名感谢……(本文章知识比较基础,大牛请提些意见再绕道,三克油^_ ...

  3. 大数据计算引擎之Flink Flink CEP复杂事件编程

    原文地址: 大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并 ...

  4. JavaScript 函数式编程读书笔记2

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

  5. JavaScript的事件概述以及事件对象,事件流

    事件处理程序 JavaScript 事件对象是由访问 Web 页面的用户引起的一系列操作,例如:用户点击页面上的某个按钮或者鼠标移动到页面的某个图片上而产生一系列的互动的反馈. 我们通过为指定事件绑定 ...

  6. Javascript高级编程学习笔记(59)—— 事件(3)事件对象

    事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...

  7. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  8. JavaScript的BOM编程,事件-第4章

    目标 BOM编程 window和document对象 window对象的属性和方法 document对象的属性和方法 JavaScript中对象的分类 浏览器对象:window对象 window对象, ...

  9. JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获

    先看下面的示例代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Jav ...

随机推荐

  1. 【编程练习】kmp算法代码

    代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...

  2. Jenkins hash

    最早,Bob Jenkins提出了多个基于字符串通用Hash算法(搜Jenkins Hash就知道了),而Thomas Wang在Jenkins的基础上,针对固定整数输入做了相应的Hash算法.其64 ...

  3. HBase 二级索引与Join

    二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...

  4. ruby中如何直接编译运行C代码

    我们知道ruby通过C EXT可以很方便的运行C代码,其实只要是C接口的语言都可以,比如汇编语言也可以哦.但是一些简单的函数难道还得费劲用C扩展的方式吗?其实ruby gem里有RubyInline包 ...

  5. (function(){xxx})(); 写法解释

    常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿 ...

  6. Linux/Windows远程桌面

    WINDOWS远程连接LINUX配置(LINUX VNC Server配置):   1.查看本机是否有安装vnc(centOS5默认有安装vnc) rpm -q vnc vnc-server 如果显示 ...

  7. BAT面试技巧

    很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...

  8. Oracle VM VirtualBox(一) 快速拷贝一个新的虚拟机

    快速拷贝一个新的虚拟机 一 找到虚拟机vdi文件,复制一份并重命名. 二 修改新虚拟机的UUID 注:不修改创建不了虚拟机,会抛出Oracle VM VirtualBox UUID already e ...

  9. Cython入门Demo(Linux)

    众所周知,Python语言是非常简单易用的,但是python程序在运行速度上还是有一些缺陷.于是,Cython就应运而生了,Cython作为Python的C扩展,保留了Python的语法特点,集成C语 ...

  10. Ubuntu16+pinpoint环境搭建

    最近研究了pinpoint,稍后放上环境搭建教程,建议想学习搭建的同学记得参考pinpointGitHub