事件是脚本编程的灵魂,本篇来介绍jQuery中的事件处理及事件对象.

事件与事件对象

首先,我们来看一下经常使用的添加事件的方式:

<input type="button" id="btn" value="click me!" onclick="showMsg();" />
<script type="text/javascript">
function showMsg() {
alert("msg is showing!");
}
</script>

我们最常用的是为元素添加onclick元素属性的方式来添加事件.现在,我们来看另一种添加事件的方式,通过修改dom属性的方式来添加事件:

<input type="button" id="btn2" value="click me!" />
<script type="text/javascript">
function showMsg() {
alert("msg is showing!");
} $(function () {
document.getElementById("btn2").onclick=showMsg;
});
</script>

添加元素属性和修改dom属性这两种方法的效果相同,但不等效.

$(function () {
//等效于<input type="button" id="btn2" value="click me!" onclick="alert('msg is showing!')" />
document.getElementById("btn2").onclick = showMsg;
}); //相当于:
// document.getElementById("btn").onclick=function(){
// alert("msg is showing!");
// }
<input type="button" id="btn" value="click me!" onclick="showMsg();" />

这两种方式的弊端是:

  1. 只能为一个事件添加一个事件处理函数.使用赋值符会将前面的函数冲掉.
  2. 在事件处理函数中,获取事件对象的方式不同.
  3. 添加多播委托的函数在不同浏览器中不同.

多播委托指:在ie中通过dom.attachEvent,在firefox中通过dom.addEventListener方式来添加事件.

所以,我们应该摒弃在通过修改元素属性和通过对Dom属性修改的方式添加事件,而应该使用多播事件的委托方式添加事件处理函数.

jQuery中的事件

使用jQuery事件处理函数的好处是:

1.添加的是多播事件委托

我们可以为dom的click事件添加一个函数后,再次添加一个函数.

2.统一了事件名称

添加多播委托时,ie在事件名称前加了"on",而firefox则直接使用事件名称

3.可以将对象行为全部用脚本控制

使用脚本控制元素行为,使用HTML标签控制元素内容,用CSS控制元素样式,从而达到了元素的行为、内容、样式分离的状态.

下面是基础的jQuery事件处理函数:

函数名 说明 例子
bind(type,[data],fn) 为匹配元素的指定事件添加事件处理函数
data为可选参数,data为数组
function secondClick() {
alert("second click!");
}
$("#dv1").bind("click", secondClick);
one(type,[data],fn) 为匹配元素的指定事件添加一次性事件处理函数
通过fn函数的参数的data属性可获取值
//数据通过fn的参数传递过去
// 例如fn的参数是e,则在fn内部可以通过e.data获取设定的参数
$("#dv1").one("click", { name: "zzz", age: 20 }, function (e) {
alert(e.data.name);
});
trigger(event,[data]) 在匹配的元素上触发某类事件
此函数会导致浏览器同名的默认行为被执行
data为可选参数,data为数组
见下例
triggerHandler(event,[data]) 触发指定的事件类型上所绑定的处理函数
不会执行浏览器默认行为
见下例
unbind(type,fn) 为匹配的元素解除指定事件的处理函数
//如果没有参数,则解除匹配元素的所有事件处理函数
$("#dv1").unbind(); //如果提够了事件类型参数,则只删除该事件类型的处理函数
$("#dv1").unbind("click"); //如果把绑定时传递的处理函数作为第二个参数传递,则只删除该处理函数
$("#dv1").unbind("click", secondClick);

注意:

我们可以为同一个事件绑定多个事件处理函数,代码如下:

$("#dv1").bind("click", function () { alert("first click!"); })
.bind("click", function () { alert("second click!"); }); 

trigger和triggerHandler函数举例:

<script type="text/javascript">
$(function () {
//客户端:
// alert("client clicked!");
//服务器端:
// 返回from server
$("#button").click(function () {
alert("client clicked!");
}); //trigger触发了id为button的客户端事件,并使其提交
$("#trigger").click(function () {
$("#button").trigger("click");
}); //triggerHandler触发了id为button的客户端处理函数,但并不使其提交,触发服务器端事件.
//即,triggerHandler只触发了id为button的click事件处理函数
// function () {
// $("#button").triggerHandler("click");
// }
$("#triggerHandler").click(function () {
$("#button").triggerHandler("click");
});
});
</script>
<form id="form1" runat="server">
<input type="button" id="trigger" value="trigger" />
<input type="button" id="triggerHandler" value="triggerHandler" />
<asp:Button runat="server" ID="button" Text="click me!" onclick="button_Click" />
</form>

那么在使用trigger和triggerHandler函数时,如何传递参数呢?

$(function () {
//click快捷事件绑定的参数的第一个参数为事件对象
// 第二个参数为数据
$("#button").click(function (event, msg) {
alert(msg);
}); $("#trigger").click(function () {
$("#button").trigger("click", ["client!"]);
}); $("#triggerHandler").click(function () {
$("#button").triggerHandler("click", ["client!"]);
});
});

快捷事件

我们可以使用事件处理函数完成对象事件的几乎所有操作,但jQuery提供了更加简单的办法来封装事件.

在jQuery中,单击事件对应着的两个方法是click()和click(fn),分别用来触发单击事件和设置单击事件.

//设置click事件
$("#dv1").click(function () { alert("click!"); });
//click(fn)方法等效于
$("#dv1").bind("click", function () { alert("click!"); }) //触发click事件
//$("#dv1").click();
//click()方法等效于
// 注意此处:等效于trigger,而不是triggerHandler
$("#dv1").trigger("click");

jQuery有许多快捷事件,具体参见帮助.

事件委派

1、live(type,fn)

说明:

给所有当前以及将来可能匹配的元素绑定一个事件处理函数

与bind方法的区别:

用live来绑定事件会给当前以及未来可能匹配的元素绑定事件处理函数.而bind只为当前匹配的元素绑定事件处理函数.

2、die([type],[fn])

说明:

移除使用live函数绑定的事件.

如果指定了type和fn参数,则移除指定type的fn事件处理函数

如果指定了type参数,则移除指定type的所有事件处理函数

如果没有指定函数,则移除匹配元素的所有事件处理函数

例子:

$(function () {
//为所有的段落添加一个click事件
$("p").live("click", function () {
alert(this.innerHTML);
}); //添加一个段落
$("#add").click(function(){
$("<p/>").html(new Date().getTime()).insertAfter($("p:last"));
}); //删除段落的click事件处理函数
$("#remove").click(function(){
$("p").die();
});
});

事件切换

事件切换方法有以下两个:

函数名 说明
hover(over,out) 一个模仿悬停事件的方法.
over:鼠标移到元素上要触发的函数
out:鼠标移出元素要触发的函数
toggle(fn,fn) 每次点击后,依次触发函数
如果点击了一个匹配的元素后,则执行指定的第一个事件处理函数;
当再次点击该元素时,会执行下一个事件处理函数;
如果有更多函数,则依次触发,直到最后一个,然后循环调用.

hover(over,out)函数举例:

$("#menu").hover(function () { $("#submenu").css("display", "block"); },
function () { $("#submenu").css("display", "none"); }
);

toggle(fn,fn)函数举例:

$("#menu").toggle(function () { $("#menu").css("color", "red"); },
function () { $("#menu").css("color", "green"); },
function () { $("#menu").css("color", "blue"); }
);

使用jQuery事件对象

jQuery统一了事件对象,当绑定事件处理函数时,会将jQuery格式化后的事件对象作为唯一参数传入:

$("#dv1").bind("click", { foo: "ooo" }, function (e) {
alert(e.data.foo)
}); 

在上例中,{foo:"ooo"}是通过e.data传递进事件处理函数内部的.现在我们来看看e有哪些常用的属性和方法.

jQuery事件对象的属性,属性是随着事件类型而变化的,例如对于click事件,则么有currentTarget属性,而对于mouseover事件,则拥有该参数.下表仅列了部分属性:

属性名 说明
currentTarget 冒泡前的当前事件的Dom对象,等同于this
data 事件调用时传递的数据
result 上一个事件处理函数返回的值
target 获取事件触发者的Dom对象
timeStamp 事件发生的时间戳
type 事件类型

下图列了大部分常用的属性,可大致了解,随用随看.

jQuery事件对象的函数:

函数名 说明 例子
preventDefault() 取消元素事件的默认动作
例如:
对于超级链接a来说,有href属性,那么在点击a的时候就会导航至href所指向位置.我们再a的click事件中,调用本方法,就不会导航到指定位置
//取消事件默认动作
$("a").bind("click", function (e) {
e.preventDefault();
});
isDefaultPrevented() 是否调用过preventDefault()方法
e.isDefaultPrevented()
stopPropagation() 取消事件冒泡
e.stopPropgation();
isPropagationStopped() 是否调用过stopPropagation()方法
e.isPropagationStopped()
stopImmediatePropagation() 取消执行该元素该事件处理函数的后续事件处理函数,
并取消事件冒泡
$("a").bind("click", function (e) {
e.stopImmediatePropagation();
}); //不会被执行到
$("a").click(function () {
alert("我被点击了");
});
isImmediatePropagationStopped() 是否调用过stopImmediatePropagation()方法
$("a").bind("click", function (e) {
e.stopImmediatePropagation();
alert(e.isImmediatePropagationStopped());
});

--选自《从零开始学习jQuery》

jQuery事件与事件对象的更多相关文章

  1. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  2. jQuery入门(3)事件与事件对象

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  3. python 全栈开发,Day55(jQuery的位置信息,JS的事件流的概念(重点),事件对象,jQuery的事件绑定和解绑,事件委托(事件代理))

    一.jQuery的位置信息 jQuery的位置信息跟JS的client系列.offset系列.scroll系列封装好的一些简便api. 一.宽度和高度 获取宽度 .width() 描述:为匹配的元素集 ...

  4. jQuery:自学笔记(4)——事件与事件对象

    jQuery:自学笔记(4)——事件与事件对象 jQuery中的事件 什么是事件 所谓事件,就是被对象识别的操作,即操作对象队环境变化的感知和反应,例如单击按钮或者敲击键盘上的按键. 所谓事件流,是指 ...

  5. jQuery中的事件对象(八)

    Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 一.事件对象基本认识 1. 什么时候会产生Event 对象呢?  例如: 当用户单击某个元素的时 ...

  6. jQuery学习笔记(5)-事件与事件对象

    一.前言 主要讲解事件的绑定与触发 二.jQuery中添加事件 1.使用bind()方法绑定事件 <input id="btn" type="button" ...

  7. jQuery通过event获取点击事件的事件对象

    要想搞明白js的事件机制,必须搞清楚几个概念:事件对象,事件源,还有事件流 事件对象: 当事件发生时会产生事件对象,事件对象的作用是用来记录“事件发生是一些相关的信息.注意事件对象只有在事件发生时才会 ...

  8. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  9. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

随机推荐

  1. Html jquery实现根据 IOS和Android访问跳转

    <script src="js/jquery-1.7.1.min.js" type="text/javascript"></script> ...

  2. jQuery的map()与jQuery.map()总结

    请注意他们不是同一个函数.前者是jQuery对象的实例方法(即$.fn.map),后者是一个仅仅挂在jQuery对象下的静态方法(即$.map). 他们用法的异同:map()的返回值是包裹了一个Arr ...

  3. 破解tumblr背景音乐

    http://sex.tumblr.com/api/read/json?callback=streampadPlayerBlogV2.getAudioResponse&type=audio&a ...

  4. Centos+nginx+uwsgi+Python多站点环境搭建

    前言 新公司的第一个项目,服务器端打算用python作为restful api.所以需要在Centos上搭建nginx+fastcgi+python的开发环境,但后面网上很多言论都说uwsgi比fas ...

  5. 成功启动了Apache却没有启动apache服务器

    原因没有用管理员身份运行...

  6. 提取所有mtk机型的线刷包

    首先手机root且安装busybox和超级终端软件,这里不提供自己百度一大堆 一.制作scatter 示范 PRELOADER 0x0 { } MBR 0x600000 { } EBR1 0x6800 ...

  7. C++中对sprintf()函数的说明(转)

    在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出 ...

  8. 8.2.1.7 Use of Index Extensions 使用索引扩展

    8.2.1.7 Use of Index Extensions 使用索引扩展 InnoDB 自动扩展每个secondary index 通过添加primary key columns to it,考虑 ...

  9. 删除WIN7系统的共享文件

    运行里面输入fsmgmt.msc命令,点开共享目录,选定要取消共享的文件右键,停止共享.

  10. 微软在线测试题String reorder

    问题描述: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB DescriptionFor this question, yo ...