jQuery学习笔记——流水账part2

来源:互联网 发布:百度人工智能世界第一 编辑:程序博客网 时间:2024/06/04 18:19

事件处理方法

继续优雅的链式调用

$("p").click(function (e) {         $(this).css("backgoundColor", "red");    });

这里设置单击任意p标签元素时,改变背景颜色为红色。
大多数的简单事件注册方法名和js原生的注册函数区别只在于一个on。
这里有两个特殊形式的方法hover() toggle()
前者传入两个参数可以给mouseenter和mouseleave注册处理程序
后者传入多个参数可以指定多个单击事件处理程序,按照传入参数的顺序来依次触发。

这些处理方法通常都具有一个唯一参数,即jQuery事件对象(这是jQuery自己定义的event对象,用来隐藏浏览器之间的实现差异)。但是如果使用tigger()方法来显式的触发事件,那么可以传入额外的参数

像这样的

$("#btn").click(function (e,a) {         alert(a);    });$("#btn").trigger("click", 213);

在页面载入的时候就会直接触发id为btn的元素的click方法,弹出一个213
这些处理方法如果返回一个false,那么该事件的默认行为以及接下来的冒泡都会被取消,等同于调用了event对象的preventDefault()和stopProragation()方法,也就是说,jQuery里面,要阻止元素冒泡和默认行为,就直接return一个false。

进一步,事件处理程序的高级注册

bind(type, [data], fn)
隐隐约约有点害怕这个词语了,不由得想起了MVVM里面的dataBinding。
可选的第二个参数,会被赋值给jQuery事件对象的data属性,然后可以在回调函数fn里面通过event.data来使用

function handler(event) {  alert(event.data.foo);}$("p").bind("click", {foo: "bar"}, handler);

另外,type参数接受空格分开的时间类型列表
所以 下面两种绑定方式是一个意思

$("a").hover(function (e) { } );  $("a").bind("mouseenter mouseleave", function (e) { });

除了上面提到的一个注册多个事件,bind还允许为注册的事件处理程序指定命名空间(namespace)。如下,给mouseenter添加了一个myMod的命名空间

$("a").bind("mouseenter.myMod", function (e) { });

添加命名空间能够方便后续触发或者卸载特定空间下的处理程序,在模块化编程里面经常看见。
在使用unbind卸载的时候也请传入带命名空间的处理程序,如果不传参数会默认卸载元素的所有事件处理程序(仅限通过jQuery方法绑定的事件),如果不传命名空间,会让其他在本模块上注册了不同事件处理程序的人困扰,当然也可以通过传入第二个参数(事件处理程序函数的一个引用)来指定卸载

$("a").unbind("mouseenter", f);

差点忘了一个one()方法,顾名思义,这种方法绑定的事件处理程序只能触发一次,触发之后会自动销毁

事件处理方法其实也是getter和setter的合体

不带参数调用事件处理方法的时候其实等同于手动触发该事件,这和前面的tigger方法一个意思,但是这种手动方式依旧会冒泡,除非注册事件处理程序的时候return false或者stopPropagation。

$("#div3").click(); $("#div3").trigger(“click”);

回忆上面的命名空间,在tigger方法里面,可以传入带命名空间的事件处理程序,如果只想触发没有命名空间的事件处理程序,在事件类型后面加一个感叹号即可。
triggerHandler只会触发事件处理程序,而不会冒泡和执行默认程序。

事件还有另外的要说………

bind可以给元素以任意字符串作为事件类型名称的事件,然后使用trigger来触发。

delegate()/undelegated()和bind()/unbind()可以做同样的事情,但是区别在于通过delegate注册的事件,可以处理在注册之后新创建的元素的事件
delegate(selector, [Type], [Data], fn)