jQuery中的事件
【加载DOM】
在常规的JavaScript代码中,通常使用window.onload方法,在jQuery中,使用的是$(document).ready()方法。极大地提高了web应用程序的响应速度。
执行时机
此方法在DOM完全就绪时就可以被调用。因此可能此时元素的关联文件未下载完。由此可以使用jQuery中另一个关于页面加载的load()方法。load()方法会在元素onload事件中绑定一个处理函数。如果函数绑定给window对象,则会在所有内容加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。
$(window).load(function(){
//编写代码
})
多次使用:JavaScript的onload事件只能保存对一个函数的引用,它会自动用后面的函数覆盖前面的函数。而jQuery的$(document).ready()方法能很好的处理这些情况。
简写方式:$(document).ready(function(){])可以简写为$(function(){})。而且$(document)可以简写为$(),当$()不带参数时,默认参数是document,因此可以简写为$().ready(function(){})。
【事件绑定】
可以使用bind()方法来对匹配元素进行特定事件的绑定,其调用格式为:bind(type[,data],fn);
bind()方法有三个参数:第一个是事件类型;第二个是可选参数,作为event.data属性值传递给事件对象的额外数据对象;第三个是用来绑定的处理函数。
基本效果
<div id="pane1">
<h5 class="head">什么是jQuery?</h5>
<div class="content">
jQuery就是jQuery啊,要想知道,自己百度去。
</div>
</div>
再加上它的jQuery代码:
$(function(){
$("#pane1 h5.head").bind("click",fuction(){
$(this).next().show(); //$(this).next():获取“内容”元素
})
})
加强效果:单击标题链接,内容出现,再击,内容消失。jQuery代码如下
$(function(){
$("pane1 h5.heaf").bind("click",function(){
var $content=$(this).next();
if($content.is(":visible")){ //如果“内容”显示
$content.hide();
}else{
$concent.show();
}
})
})
改变绑定事件的类型:把事件类型从click换成mouseover和mouseout。即当光标滑过时,就触发事件。jQuery代码如下
$(function(){
$("pane1 h5.heaf").bind("mouseover",function(){
$(this).next().show();
}).bind("mouseout",function(){
$(this).next().hide();
})
})
简写绑定事件:如上代码改写成使用简写绑定事件的方式
$(function(){
$("pane1 h5.heaf").mouseover(function(){
$(this).next().show();
}).mouseout(function(){
$(this).next().hide();
})
});
【合成事件】
jQuery有两个合成事件——hover()方法和toggle()方法,都属于jQuery自定义的方法。
hover()方法:语法结构为hover(enter,leave);用于模拟光标悬停事件,当光标移动到元素上时,会触发指定的第一个函数(enter);当光标移出这个元素时,会触发指定的第二个函数(leave)。
toggle()方法:语法结构为toggle(fn1,fn2,...fnN);用于模拟鼠标连续单击事件,第一次单击,触发第一个;第二次,触发第二个;依次触发。直到最后一个,随后的每次单击都重复对这几个函数的轮番调用。
toggle()方法在jQuery中还有一个作用:切换元素的可见状态。如果元素是可见的,单击切换后则为隐藏,反之则可见。具体的在《锋利的jQuery》的P107页。
【事件冒泡】
事件冒泡引发的问题:有可能会引发意料之外的效果,因此,有必要对事件的作用范围进行限制。
事件对象:在程序中使用事件对象,只需为函数添加一个参数即可。jQuery代码如下:
$("element").bind("click",function(event){ //event:事件对象
//......
});
当单击“element”元素时,事件对象就被创建了。这个事件对象只有事件处理函数才能访问到。事件处理函数执行完毕后,事件对象就销毁了。
停止事件冒泡:可以阻止事件中其他对象的事件处理函数被执行。在jQuery中提供了stopPropagation()方法来停止事件冒泡。
$('span').bind("click",function(event){
var txt=$('#msg').html()+"<p>内层span元素被单击</p>";
$('#msg').html(txt);
event.stopPropagation(); //停止事件冒泡
});
当单击<span>元素时,只会触发<span>元素上的click事件,而不会触发<div>元素和<body>元素的click事件。
阻止默认行为:preventDefault()方法。如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返回false。这是在对事件对象上同时调用stopPropagation()方法和preventDefault()方法的一种简写方式。
事件捕获:事件捕获和事件冒泡是刚好相反的两个过程,事件捕获是从最顶端往下开始触发。
并非所有主流浏览器都支持事件捕获,并且这个缺陷无法通过JavaScript来修复。jQuery不支持事件捕获。
【事件对象的属性】
event.type:可以获取到事件的类型。
event.preventDefault()方法:阻止默认的事件行为。JavaScript中符合W3C规范的该方法在IE浏览器中无效,jQuery对其进行了封装,使之能够兼容各种浏览器。
event.stopPropagation()方法:阻止事件的冒泡。JavaScript中符合W3C规范的该方法在IE浏览器中无效,jQuery对其进行了封装,使之能够兼容各种浏览器。
event.target:获取到触发事件的元素。
event.relatedTarget:
event.pageX和event.pageY:获取到光标相对于页面的x坐标和y坐标。
event.which:在鼠标单击事件中获取到鼠标的左、中、右键;在键盘事件中获取键盘的按键。
event.metaKey:为键盘事件中获取<ctrl>按键。
【移除事件】
移除按钮元素上以前注册的事件:unbind()方法。语法结构为:unbind([type],[data]);第一个参数是事件类型,第二个参数是将要移除的函数。说明如下:
(1)如果没有参数,则删除所有绑定的事件;
(2)如果提供了事件类型作为参数,则只删除该类型的绑定事件;
(3)如果把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除。
移除<button>元素的其中一个事件:需要为这些匿名处理函数指定一个变量。
one()方法可以为元素绑定处理函数。语法结构为:one(type.[data],fn);
one()方法为<button>元素绑定单击事件后,只在用户第一次单击按钮时,处理函数才执行,之后的单击毫无作用。
【模拟操作】
常用模拟:在jQuery中,可以使用trigger()方法完成模拟操作。如下可以来触发id为btn的按钮的click事件:
$('btn').trigger("click"); 也可以直接用简化写法click():$('#btn').click();
触发自定义事件:trigger()方法还可以触发自定义名称的事件。
传递数据:trigger(type,[data])方法有两个参数,第一个是要触发的事件类型,第二个是要传递给事件处理函数的附加数据,以数组形式传递。
执行默认操作:
//不仅会触发为<input>元素绑定的focus事件,也会使<input>元素本身得到焦点
$("input").trigger("focus");
triggerHandler()方法:只想触发绑定的focus事件,而不像执行浏览器默认操作。
//会触发<input>元素上绑定的特定事件,同时取消浏览器对此事件的默认操作,即文本框只触发绑定的focus事件
$("input").triggerHandler("focus");