Javascript中的事件都是与对象相关联的,而不是语言本身所有,当Javascript在浏览器中运行的时候,事件与每个浏览器实现的DOM模型有关。事件本身相当直观,常用的有:

事件 描述
abort 图片被阻止而不能加载
blur,focus 失去焦点,获得焦点
change 适用于表单元素,当元素使其焦点的时候判断是否发生改变
click,dblclick 单击,双击
keydown,keyup,keypress 按下键,键离开,按下键的时候触发,注意keypress只对数字字母键有效
load 加载图片或者页面的时候
mousedown,mouseup 按下键,放开键
mouseover,mouseout over是当鼠标进入的时候出发,out是离开的时候触发
mousemove 鼠标移动
reset,submit 重置和提交表单

以上仅仅是常用的事件的列表,完整具体的列表可以查找相关手册。

1. 0级DOM上的事件处理

0级DOM上的事件处理方法是比较早的,目前也广泛应用,从IE4.0开始就支持这类方法。

1.1 事件注册

下面主要介绍如何添加响应事件,也就是为事件添加处理程序。

(1)内联注册(inline registration)

这是最简单的一种,将事件响应程序作为html标签的一个属性来设置,如下例,可以是代码,当然更多情况下是一个函数调用。事件的句柄一般就是事件的名称加上前缀on。

<html>
<head>
<title>event sample</title>
<style type="text/css">
#adiv{width:200px;height:200px;background-color:#00aa00;
}
</style></head>
<body>
<div id="adiv" onmouseover="this.innerHTML+='OK'"   >
a
</div>
</body>
</html>

这种方法很简单,任何浏览器都支持,缺点是将Javascript代码和HTML代码混杂在一起,而且不能动态添加事件响应程序,也不能添加多个响应程序。

(2)传统模式(traditional registration)

这种模式将事件作为对象的属性进行添加。例如:

<script type="text/javascript">function helloWorld() {alert("Hello World");var d = document.getElementById("adiv");d.onmouseout = function() {this.innerHTML += 'Bye';}}window.onload = helloWorld;
</script>

1.2 事件的参数(Event对象)

有些事件处理程序需要一些关于事件更多的信息,比如click事件发生的位置等。这些信息是通过事件参数传给事件处理程序的。IE事件模型和W3C事件模型对此的实现是不同的。

IE把event对象作为window对象的一个属性,而W3C把event对象作为处理程序的一个参数。下面以click事件为例,分别写一个程序用于IE和支持W3C标准的浏览器。

<html>
<head>
<title>event sample</title>
<style type="text/css">
#adiv{width:200px;height:200px;background-color:#00aa00;
}
</style>
<script type="text/javascript">function IEClick() {var res = document.getElementById("result");var s;for (var p in window.event) {s += p.toString() + ":" + window.event[p] + "<br/>";}res.innerHTML = s;}function W3CClick(args) {var res = document.getElementById("result");var s;for (var p in args) {s += p.toString() + ":" + args[p] + "<br/>";}res.innerHTML = s;}
</script>
</head>
<body>
<div id="adiv"  onclick="W3CClick(event)" >a </div>
<div id="result" style="font-size:small; font-family:Verdana">
</div>
</body>
</html>

这一段页面代码可以把click事件对象的所有属性都展示出来。上面的例子是W3C的浏览器所用的方法,要在IE下使用,只要改成οnclick=”IEClick()”.注意,W3CClick中的参数名,只能是event。打印出来的属性很多,我分别用FF3.5,Chrome3,IE8(标准模式和兼容模式)运行,他们共有的属性并不多,其实也就这些共有的属性才有意义,他们是:

altKey,shiftKey,ctrlKey:是否按下alt,shift,ctrl键

clientX,clientY:客户区坐标(浏览器窗口),screenX,screenY:屏幕区坐标

type:事件类型

虽然事件的参数的传递方式有点不同,但是对于写跨浏览器的代码也没有造成太多的麻烦,只需要在函数一开始判断下window.event有没有定义即可。

function BothClick(args) {var evnt = window.event ? window.event : args;alert(evnt.clientX);
}
注册句柄为:
<div id="adiv"  onclick="BothClick(event)" >a</div>

如果采用第二种方式注册句柄,则不需要什么特别处理。

1.3 事件的浮升

页面上的对象通常是重叠的,比如一个div中可以包括若干div或者其他元素。当某一事件触发的时候,同时有多个元素受影响,并且它们都有相应的事件处理程序,那么这些事件处理程序执行哪些?以何种顺序执行?这就是本节要讨论的问题。通常情况下,一个事件被多个句柄捕获的情形并不多见。先看一个例子(CSS省略):

<script type="text/javascript">
function body_click(){var dis=document.getElementById("res");dis.innerHTML+="Body Click <br/>";
}
function out_click(){var dis=document.getElementById("res");dis.innerHTML+="Outer Click <br/>";
}
function inner_click(){var dis=document.getElementById("res");dis.innerHTML+="Inner Click <br/>";
}
</script>
</head>
<body onclick="body_click()">
<div id="out" onclick="out_click()">
Outer Div<div id="innerdiv" onclick="inner_click()" >Inner Div</div>
</div>
<div id="res">
</div>
</body>

在body,外层div和内层div都响应了click事件,结果如下:

可见,事件是由内向外层的元素依次触发的。(一般教材上的说法是向上浮升,bubbling,我觉得这个向上是有歧义的,我一开始就误认为内层的元素是上面的,因为它能覆盖外层的元素)用0级DOM注册的事件,它的浮升方法无论是IE还是W3C都是统一的

1.4 浮升的取消

有时候我们需要在响应了一个事件之后,就不需要外层的元素再响应了,可以取消事件的浮升。取消的方法IE和W3C是不一致的。IE是通过设置事件对象的cancelBubble属性来实现,W3C则是调用事件对象的stopPropagation方法。

例如上面的例子改为:

function inner_click(arg){var evnt=window.event?window.event:arg;var dis=document.getElementById("res");dis.innerHTML+="Inner Click <br/>";     if(evnt.stopPropagation){evnt.stopPropagation();}else{evnt.cancelBubble=true;}
}
<div id="innerdiv" onclick="inner_click(event)" >

其他不变,这样就只能看到一行输出。

1.5 事件处理函数中的this

这个this指向的是触发事件的对象。

转载于:https://www.cnblogs.com/yinzixin/archive/2010/01/24/1655408.html

Javascript浏览器事件(上)相关推荐

  1. 监听当点击微信等app的返回按钮或者浏览器的上一页或后退按钮的事件

    在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包 ...

  2. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  3. Javascript Event事件-总结

    一.事件类型 例如:mouseover鼠标移动到.keydown键盘按下 二.事件目标 是发生的事件或与之相关的对象,window.document和Element对象是最常见的事件目标 三.事件对象 ...

  4. 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解

    <javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = {// ...

  5. Javascript知识——事件

    O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...

  6. javascript原生事件句柄、BOM、DOM对象属性方法总结

    javascript原生事件句柄.BOM.DOM对象属性方法总结 JS事件句柄 事件句柄 类型 说明 onabort 事件句柄 图像加载被中断 onblur 事件句柄 元素失去焦点 onfocus 事 ...

  7. html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...

    本文实例总结了Javascript DOM事件操作.分享给大家供大家参考,具体如下: 使用JavaScript可以对HTML页面上的各种事件进行监听,如鼠标点击/释放,鼠标悬停/离开,等等. 效果图: ...

  8. JavaScript触发事件大全--能力工场

    1.onabort:当用户终止正在打开的网页时产生该事件. 2.onblur:某元素失去活动焦点时产生该事件.例如鼠标在文本框中点击后又在文本框外点击时就会产生. 3.onchange:当网页上某元素 ...

  9. 在别人网页上运行js脚本_初始JavaScript,世界上最流行的语言之一

    1.JavaScript 是什么? JavaScript 是世界上最流行的语言之一,是一种运行在客户端的脚本语言 (Script 是脚本的意思) 脚本语言:不需要编译,运行过程中由 js 解释器( j ...

  10. 初始JavaScript,世界上最流行的语言之一!

    1.JavaScript 是什么? JavaScript 是世界上最流行的语言之一,是一种运行在客户端的脚本语言 (Script 是脚本的意思) 脚本语言:不需要编译,运行过程中由 js 解释器( j ...

最新文章

  1. Word中项目符号和编号用法详解
  2. live555 源码分析:MediaSever
  3. 实现.Net程序中OpenTracing采样和上报配置的自动更新
  4. nginx 配置php版本号,隐藏Apache、nginx和PHP的版本号的配置方法
  5. html5登录界面源代码_最新版本尤娜博客已更新源代码(速拿!!!)
  6. 从零实现GPT-2,瞎写笑傲江湖外传,金庸直呼内行
  7. 多所985、211高校教授被通报!国自然发布处理决定!
  8. 支付行业常用名词解释
  9. Epub基础知识介绍
  10. tensorflow系列之_pspnet网络
  11. Windows 10 专业版安装Docker Desktop
  12. 深度学习-22:信息论和信息熵
  13. 二叉树的遍历(前序遍历,中序遍历,后序遍历)
  14. 孔子的“治学三境界”
  15. 某公司服务器故障导致数据库文件丢失的恢复过程
  16. Windows Azure 解决方案系列: Real World Windows Azure: 与CloudBerry Lab 商业开发副总经理,Pavel Bondarchuk的访谈...
  17. SketchUp Ruby二次开发
  18. NOKIA诺基亚手机显示屏通用表(转)
  19. 解决“磁盘碎片整理程序检测到chkdsk计划在卷”问题
  20. python之PyAutoGui教你做个自动脚本计算器

热门文章

  1. OWASP 创始人:关注首要问题,开源库也可以放心使用
  2. wordpress向一个页面POST数据,出现404页面访问不了
  3. ORACLE 随机数 dbms_random
  4. 给浪费时间找种方法?
  5. MySQL日志(一条sql更新语句是如何执行的)
  6. Java内存溢出的情况
  7. Java 并发和多线程(一) Java并发性和多线程介绍[转]
  8. Java变量的默认值和初始化
  9. 用Redis实现分布式锁 与 实现任务队列【转载】
  10. MySQL老是提示视图没有主键