`
yeshaoting
  • 浏览: 684125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[随记]锋利的jQuery 第四章 jQuery中的动画和事件

 
阅读更多


 


4.1 jQuery中的事件


4.1.1 加载DOM

1. 执行时机

在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用的是$(document).ready()方法。$(document).ready()方法是事件模块中重要的一个函数,可以极大地提高Web应用程序的响应速度。jQuery就是用$(document).ready()方法来代替传统JavaScript的window.onload方法的。通过使用该方法,可以在DOM载入就绪时就对其进行操纵并调用执行它所绑定的函数。


window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行,即JavaScript此时才可以访问网页中的任何元素。而通过jQuery中的$(document).ready()方法注册的事件处理程序,在DOM完全就绪时就可以被调用。此时,网页的所有元素对jQuery而言都是可以访问的,但是,这并不意味着这些元素关联的文件都已经下载完毕。

例如:

为网页中所有图片添加单击后隐藏或显示行为,使用window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行,即JavaScript此时才可以访问网页中的任何元素。而通过jQuery中的$(document).ready()方法注册的事件处理程序,在DOM完全就绪时就可以调用。此时,网页的所有元素对jQuery而言都是可以访问的,但是,这并不意味着这些元素关联的文件都已经下载完毕。


优点:window.onload需要所有文件加载完毕后才可以进行操作,而$(document).ready()则只要DOM就绪就可以操作。很显然,把网页解析为DOM树的速度比把页面中的所有关联文件加载完毕的速度快得多。


缺点:图片还未加载完毕,所有图片的高度和宽度这样的属性些时不一定有效,若对其进行操作则无效,甚至出错。


解决这个问题,可以使用jQuery页面加载的方法load()方法。load()方法会在元素的onload事件中绑定一个处理函数。如果处理函数绑定给window对象,则会在所有内容(包括窗口、框架、对象和图像等)加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。

例如:

$(window).load(function()

{

//编写代码

})


等价于JavaScript中的以下代码:

window.onload = function()

{

//编写代码

}


2. 多次执行

JavaScript的onload事件一次只能保存对一个函数的引用,它会自动用后面的函数覆盖前面的函数,因此不能在现有的行为上添加新的行为。而jQuery的$(document).ready()方法能够被多次调用,每次调用该方法都会在现有的行为上追加新的行为,这些行为函数会根据注册的顺序依次执行。


3. 简写方式

$(document).ready(function()

{

//编写代码

})


等价于以下的代码:

$(function()

{

//编写代码

})


由于$(document)也可以简写为$()。当$()不带参数时,默认参数就是"document",因此上面的代码也可以简写为:

$().ready(function()

{

//编写代码

})


4.1.2 事件绑定

在文档装载完成后,如果打算为元素绑定事件来完成某些操作,则可以使用bind()方法来对匹配元素进行特定事件的绑定。调用格式:bind(type[,data],fn);

第1个参数是事件类型,包括:blur、focus、load、mouseover等,也只可以是自定义名称。

第2个参数为可选参数,作为event.data属性值传递给事件对象的额外数据对象。

第3个参数则是用来绑定的处理函数。


注:jQuery中的事件绑定类型比普通的JavaScript事件绑定类型少了"on"。


简写绑定事件:像click、mouseover、mouseout这类事件,在程序中经常会使用到,jQuery为此也提供了一套简写的方法。简写方法和bind()方法的使用类似,实现的效果也相同,惟一的区别是能够减少代码量。


4.1.3 合成事件

jQuery有两个合成事件——hover()方法和toggle()方法。


1. hover()方法用于模拟光标悬停事件。当光标移动到元素上时,会触发指定的第1个函数(enter);当光标移出这个元素时,会触发指定的第2个函数(leave)。


1)CSS中有伪类选择符,例如::hover,当用户光标悬停在元素上时,会改变元素的外观。在大多数符合规范的浏览器中,伪类选择符可以用于任何元素。然而在IE 6浏览器中,伪类选择符仅可用于超链接元素。对于其他元素,可以使用jQuery的hover()方法。

2)hover()方法准确来说是替代jQuery中的bind("mouseleave")和bind("mouseenter"),而不是替代bind("mouseleave")和bind("mouseenter")。因此当需要触发hover()方法的第2个函数时,需要trigger("mouseleave")来触发,而不是trigger("mouseout")。



2. toggle()方法用来模拟鼠标单击事件。

toggle()方法在jQuery中还有另一个作用:切换元素的可见状态。如果元素是可见的,单击切换后则为隐藏;如果元素是隐藏的,单击切换后则为可见的。


4.1.4 事件冒泡

<body>

<div id="content">

外层div元素

<span>内层span元素</span>

外层div元素

</div>

</boyd>

如果<body>、<div>和<span>都绑定了click事件时,将单击<span>,会依次触发<span>单击事件、<div>单击事件、<body>单击事件。

在单击<span>元素的同时,也单击了包含<span>元素的元素<div>和包含<div>元素的元素<body>,并且每一个元素都会按照特定的顺序响应click事件。这就会引发问题:只想触发元素本身的单击事件,包含该元素的元素单击事件依次被触发。


之所以称为冒泡,是因为事件会按照DOM的层次结构像水泡一样不断向上直至顶端。


1)事件对象

由于IE-DOM和标准DOM实现事件对象的方法各不相同,导致在不同浏览器中获取事件对象变得比较困难。针对这个问题,jQuery进行了必要的扩展和封装,从而使得在任何浏览器中都能轻松地获取事件对象以及事件的一些属性。


2)停止事件冒泡可以阻止事件中其他对象的事件处理函数被执行。在jQuery中提供了stopPropagation()方法停止事件冒泡。

例如:

$("span").click(function(event) //event是事件对象

{

$("#msg").html($("#msg").html() + "<b>span<b>被单击!<br/>");

event.stopPropagation();

});



3)阻止默认行为

网页中的元素有自己默认的行为,例如,单击超链接后会跳转、单击"提交"按钮后表单会提交,有时需要阻止元素的默认行为。

在jQuery中,提供了preventDefault()来阻止元素的默认行为。


如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返回false。这是对在事件对象上同时调用stopPropagation()方法和preventDefault()方法的一种简写方式。


4)事件捕获和事件冒泡是刚好相反的两个过程,事件捕获是从最顶端往下开始触发。很显然,事件捕获是从最外层元素开始,然后再到最里层元素。遗憾的是,并非所有主流浏览器都支持事件捕获,并且这个缺陷无法通过JavaScript来修复。jQuery不支持事件捕获


4.1.5 事件对象的属性

jQuery在遵循W3C规范的情况下,对事件对象的常用属性进行了封装,使得事件处理在各大浏览器下都可以正常运行而不需要进行浏览器类型判断。


1)event.type属性

该属性的作用是可以获取到事件的类型。


2)event.preventDefault()方法

该方法的作用是阻止默认的事件行为。


3)event.stopPropagation()方法

该方法的作用是阻止事件的冒泡。JavaScript中符合W3C规范的stopPropagation()方法在IE浏览器中却无效。jQuery对其进行了封装,使之能兼容各种浏览器。


4)event.target属性

该属性的作用是获取到触发事件的元素。jQuery对其封装后,避免了W3C、IE和safari浏览器不同标准的差异。


例如:获取事件发生的元素的标签名,代码如下,

alert(event.target.tagName);


5)event.relatedTarget()方法

在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target()方法来访问,相关元素是通过event.relatedTarget()方法来访问的。event.relatedTarget()方法在mouseover中相当于IE浏览器的event.fromElement()方法,在mouseout中相当于IE浏览器的event.toElement()方法,jQuery对其进行了封装,使之能兼容各种浏览器。


6)event.pageX属性和event.pageY属性

该方法的作用是获取到光标相对于页面的x坐标和y坐标。如果没有使用jQuery时,那么IE浏览器是用event.x,event.y属性,而在Firefox浏览器中是用event.pageX,event.pageY属性。如果页面上有滚动条,则还要加上滚动条的宽度或高度。在IE浏览器中还应该减去默认的2px的边框。

例如:

<script type="text/javascript">

$(bootstrap);


function bootstrap()

{

$("body").mousemove(getLocation);

}


function getLocation(event)

{

var text = $("#msg").html() + "<br/>X:" + event.pageX + "\tY:" + event.pageY;

$("#msg").html(text);

}

</script>



7)event.which属性

该方法的作用是在鼠标单击事件中获取到鼠标左、中、右键;在键盘事件中获取键盘的按键。


例如:

$(function()

{

$("body").mousedown(function(e)

{

//1=鼠标左键;2=鼠标中键;3=鼠标右键

alert(e.which);

});

});


8)event.metaKey()方法

针对不同浏览器对键盘中的<ctrl>按键解释不同,jQuery也进行了封闭,并规定event.metaKey()方法为键盘事件中获取<ctrl>按键。


9)event.originalEvent()方法

该方法的作用是指向原始的事件对象。



4.1.6 移除事件

jQuery提供unbind()方法移除绑定事件。


移除元素的click事件:

$("#btn").unbind("click");

$("#btn").unbind("click",fn1); //移除函数1

$("#btn").unbind("click",fn2); //移除函数2


元素绑定的都是是click事件,所以不写参数也可以达到同样的目的:

$("#btn").unbind();



对于只需要触发一次,随后就要立即解除绑定的情况,jQuery提供了一种简写方法——one()方法。One()方法可以为元素绑定处理函数。当处理函数触发一次后,立即被删除。即在每个对象上,事件处理函数只会被执行一次。

One()方法的结构与bind()方法类似,使用方法也与bind()方法相同。


4.1.7 模拟操作

1. 常用模拟

在jQuery中,可以使用trigger()方法完成模拟操作。

例如:

$("#btn").trigger("click");

也可以直接用简化写法click():

$("#btn").click();


2. 触发自定义事件

trigger()方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。


3. 传递数据

trigger(type,[,data)方法有两个参数。

第2个参数是要传递给事件处理函数的附加数据,以数组形式传递。通常可以通过传递一个参数给回调函数来区别这次事件是代码触发的还是用户触发的。


4. 执行默认操作

trigger()方法不仅触发元素绑定的事件,还会执行浏览器默认操作。例如:

$("input").trigger("focus")不仅会触发元素得到焦点的事件,还会使得元素本身得到焦点。


triggerHandler()方法则只会触发元素绑定的事件,而不会执行浏览器默认操作。



4.2 jQuery中的动画


4.2.1 show()方法和hide()方法

在HTML文档里,为一个元素调用hide()方法,会将该元素的display样式改为"none"。

当把元素隐藏后,可以使用show()方法将元素的display样式设置为先前的显示状态("block"或"inline"或其他除了"none"之外的值)。

在jQuery做动画效果要求要在标准模式下,否则可能会引起动画抖动。标准模式即要求文件头部包含如下的DTD定义:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


为show()或者hide()添加一个速度参数,使得元素隐藏或显示出现动画。

例如:

hide(600)方法会同时减少内容的高度、宽度和不透明度,直到这3个属性的值为0,最后设置该元素的CSS规则为"display:none"。show(600)同理。


4.2.2 fadeIn()方法和fadeOut()方法

与show()方法和hide()不同的是,fadeIn()方法和FadeOut()方法只改变元素的不透明度。


4.2.3 slideUp()方法和slideDown()方法

slideUp()方法和slideDown()方法只会改变元素的高度。


4.2.4 自定义动画方法animate()

在jQuery中,可以使用animate()方法来自定义动画,格式:

animate(params, speed, callback);


累加、累减动画

{left,"+=50px"}


元素透明度设置:

css("opacity","0.5");

{opacity,"0.5"};


4.2.5 动画回调函数

css()方法并不会加入到动画队列中,而是立即执行。可以使用回调函数(callback)对非动画方法实现排队。只要把css()方法写在最后一个动画的回调函数里即可。




4.2.6 停止动画和判断是否处于动画状态

stop停止匹配元素正在进行的动画。格式如下:

stop([clearQueue][,gotoEnd]);

参数clearQueue和gotoEnd都是可选的参数。clearQueue代表是否要清空未执行完的动画队列,gotoEnd代表是否直接将正在执行的动画跳转到末状态。

如果直接使用stop()方法,则会立即停止当前正在进行的动画,如果接下来还有动画等待继续进行,则以当前状态开始接下来的动画。

对于光标移入移出得过快导致动画效果与光标动作不一致的情况,只要在光标的移入、移出动画之前加入stop()方法,就能解决这个问题。


判断元素是否处于动画状态:is(":animated")

如果元素正处于动画状态,则添加新动画;否则不添加。


4.2.7 其他动画方法

toggle可以切换元素的可见性。

slideToggle()方法通过高度变化来切换匹配元素的可见性。这个动画效果只调整元素的高度。

fadeTo()方法可以把元素的不透明度以渐进方式调整到指定的值。这个动画只调整元素的不透明度,即匹配的元素的高度和宽度不会发生变化。


4.2.8 动画方法概括

animate()方法可以用来替代其他所有的动画方法。



 

1. 一组元素上的动画效果

1)当在一个animate()方法中应用多个属性时,动画是同时发生的。

2)当以链式的写法应用动画方法时,动画是按照顺序发生的。


2. 多组元素上的动画效果

1)默认情况下,动画都是同时发生的。

2)当以回调的形式应用动画方式时,动画是按照回调顺序发生的。


另外,在动画方法中,要注意其他非动画方法会插队,例如css()方法要使非动画方法也按照顺序执行,需要把这些方法写在动画方法的回调函数中。

 

 

  • 大小: 51.8 KB
分享到:
评论

相关推荐

    一些有关哈希函数的随记

    这篇随记将探讨哈希函数的基本概念、性质以及在实际应用中的重要性。 哈希函数,也称为散列函数,是一种特殊的算法,它将任意长度的输入(也称为预映射或消息)转化为固定长度的输出,这个输出通常被称为哈希值或...

    NativeJS随记 - 浅析JavaScript Events

    7. **事件工具**:在提供的标签“工具”中,可能涉及到一些库或框架对事件处理的封装,如jQuery的`.on()`和`.off()`,Vue.js的`v-on`指令,React的事件处理等。这些工具简化了事件处理的语法,提供了更强大的功能,...

    随记_电气_

    【标题】:“随记_电气_”提示我们这是一份关于...通过阅读这份“随记”,读者可以期待获取到一个电气工程师在日常学习和实践中积累的宝贵经验。然而,由于是个人笔记,其深度和准确性可能因作者的个人理解和经验而异。

    网络原理随记.pdf

    计算机网络原理随记 在本资源中,我们将讨论计算机网络的基本概念、发展历程、网络架构、协议栈、数据传输、网络互通、安全性等方面的知识点。 计算机网络的基本概念 计算机网络是指将多个计算机设备连接起来,以...

    c++随记.docx

    ### C++ 随记知识点总结 #### 一、内存管理与 new/delete 操作符 在 C++ 中,`new` 和 `delete` 是用于动态内存分配的关键字。`new` 用于在堆区分配内存,`delete` 用于释放之前通过 `new` 分配的内存。使用 `new`...

    随记app,微博与博客整合

    随记App是一款集成微博与博客功能的毕业设计项目,旨在为用户提供一个统一的平台来管理和分享他们的日常思考和生活点滴。这个项目分为客户端和服务端两部分,分别实现了用户交互界面和后台数据处理。 在Android...

    linux net 管理随记

    linux net 管理随记,留着个人备忘

    互联网公司实习日记随记参考.pdf

    互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf

    2015年8月整理笔记本随记.ppt

    这篇随记内容涵盖了多个教育和德育相关的知识点,深入探讨了教育的本质、电子智慧教育的定义、学生文化的理解以及班主任的角色。以下是对这些知识点的详细解释: 1. **教育理念**: - "精准,精减,精彩":这强调...

    EHCache的使用随记

    4. **缓存元素(Cache Entry)**:缓存中的数据单元,由键(Key)和值(Value)组成,还有可能包含过期策略和其它元数据。 5. **缓存策略**:包括缓存加载策略(如懒加载)、更新策略(如写时复制、写后更新等)、...

    git随记 git

    git随记 git

    JSP PDF打印 随记 复杂模板设计

    本篇随记主要探讨的是如何在JSP环境中进行PDF打印,并涉及复杂的模板设计。PDF(Portable Document Format)是一种通用的文件格式,常用于生成保持原始文档格式不变的静态文档,适用于打印和共享。 首先,我们需要...

    随记:flex发送XML到servlet

    标题“随记:flex发送XML到servlet”指的是在Flex应用程序中向Java Servlet发送XML数据的过程,这通常涉及到客户端与服务器端的交互。Flex是一种基于Adobe AIR或Flash Player运行时的开发框架,常用于创建富互联网...

    面试随记???随时更新

    面试随记???随时更新

    2021-2022年收藏的精品资料辛辛那提1000维修随记.doc

    这篇随记详细记录了从1950年代早期的数控机床发展到A2100系统的过程,以及在实际使用中遇到的问题和解决方案。 1. 数控系统历史: - 辛辛那提·米拉克龙公司与麻省理工学院合作,于1950年代开发了世界上最早的数控...

    活动随记一次“出色”的朗诵会.pdf

    如果文件内容确实如描述中所示,全为“活动随记一次‘出色’的朗诵会.pdf”和一些不明确的符号,那么我将无法从空白或无关的信息中提取知识点。请提供实际的文字内容,以便我进行分析并创作出丰富的内容。

    c#随记.docx

    C#是专为.NET框架设计的,因此在.NET环境中具有极高的兼容性和可操作性。.NET Framework包含了公共语言运行时(CLR)和框架类库集(FCL)。CLR是程序执行的基础,它负责管理程序的运行,而FCL则提供了丰富的类库供...

    随记统一响应结果和全局异常类

    个人练习使用idea编写的项目后,总结的东西

    随记小时光设计书1

    在"随记小时光设计书1"中,我们主要讨论的是用户信息和手账信息的设计,特别是在数据库方面的应用。这个设计涉及到用户信息的多个关键组成部分,包括昵称、用户名、密码、邮箱、手机号以及权限和加密key的管理。下面...

    重点小学生寒假记随记大全.doc

    重点小学生寒假记随记大全.doc

Global site tag (gtag.js) - Google Analytics