3.6.2 操作动画队列

当在jQuery对象上调用动画方法时,如果该对象正在执行某个动画效果,那么新调用的动画方法就会被添加到动画队列中,jQuery会按顺序依次执行动画队列中的每个动画。

jQuery对象提供的操作动画队列的方法

jQuery对象提供了以下几种方法来操作动画队列。

stop方法

方法 描述
stop([clearQueue],[gotoEnd]) 停止当前jQuery对象里每个DOM元素上正在执行的动画

如果该jQuery对象上绑定了动画队列,且clearQueue没有指定为true,则执行该方法后将立即执行当前动画的下一个动画,
可以对该函数的clearQueuegotoEnd两个可选的布尔类型的参数进行指定,

  • 其中clearQueue指定是否删除jQuery对象上的动画队列;
  • 如果将gotoEnd 设置为true,则当前动画立即跳到最后一帧结束,否则当前动画将停在当前帧而结束。

queue方法

queue有如下几种形式:

方法 描述
queue([queueName]) 返回当前jQuery对象里第一个DOM元素上的动画函数队列。
queue([queueName,] callback) callback动画函数添加到当前jQuery对象里所有DOM元素的动画函数队列的尾部
queue([queueName,] newQueue) newQueue动画函数队列代替当前jQuery对象里所有DOM元素的动画函数队列。

queueName用于为动画队列指定一个名称,如果省略该参数,jQuery默认使用标准的动画队列名:fx

dequeue方法

方法 描述
dequeue() 执行动画函数队列头的第一个动画函数,并将该动画函数移出队列。

clearQueue方法

方法 描述
clearQueue([queueName]) 清空动画函数队列中的所有动画函数。

程序示例

下面的程序代码示范了如何访问默认动画队列的属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 动画队列 </title>
<style>
div {
width: 60px;
height: 60px;
position: absolute;
top: 60px;
background: #f0f;
display: none;
}
</style>
</head>

<body>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<p>动画队列的长度是:
<span></span>
</p>
<div></div>
<script type="text/javascript">
var $div = $("div");

function runIt() {
// 第1个动画:显示出来
$div.show("slow");
// 第2个动画:自动动画,水平左移300px,延迟2000毫秒
$div.animate({ left: '+=300' }, 2000);
// 第3个动画:卷起来
$div.slideToggle(1000);
// 第4个动画:放下来
$div.slideToggle("fast");
// 第5个动画:自动动画,水平右移300px
$div.animate({ left: '-=300' }, 1500);
// 第6个动画:隐藏出来
$div.hide("slow");
// 第7个动画:显示出来
$div.show(1200);
// 第8个动画:卷起来,动画完成后回调runIt
$div.slideUp("normal", runIt);
}
// 控制每0.1秒调用一次该方法,该方法用于显示动画队列的长度
function showIt() {

var n = $div.queue();
$("span").text(n.length);
setTimeout(showIt, 100);
}
runIt();
showIt();
</script>
</body>

</html>

该程序中的粗体字代码为指定<div>元素依次调用了8个动画函数,这意味着jQuery将会把它们添加到动画队列中,然后该元素将会依次执行这个动画队列中的8个动画。每执行完一个动画效果,动画队列的长度减1。

jQuery命名空间下的queue和dequeue方法

除此之外,jQuery命名空间下也提供了jQuery.queue(element[,queueName])jQuery.dequeue(element [,queueName])两个方法,这两个方法的功能与jQuery对象的queue方法和dequeue方法的功能相同,只是需要为它们传入element参数,用于指定操作哪个元素上的动画队列。

3.6 动画效果相关的方法

jQuery 还提供了一些动画效果相关的方法,通过使用这些方法,可以开发出更加友好的UI界面,例如可以实现各种”渐变”动画。

3.6.1 简单动画和复杂动画

简单动画

jQuery提供的简单动画效果相关的方法如下。

显示和隐藏方法

方法 描述
show([duration] [,easing] [,callback]) jQuery对象里包含的隐藏的DOM元素以动画方式显示出来
hide([duration] [,easing] [,callback]) jQuery对象里包含的显示的DOM元素以动画方式隐藏起来
toggle([duration] [,easing] [,callback]) 该方法是showhide两个方法的综合版本。
toggle(showOrHide) 向该方法传入的参数控制显示或隐藏jQuery对象包含的DOM元素。

以动画方式增加或减少高度

方法 描述
slideDown([duration] [,easing] [,callback]) 该方法将会不断增加当前jQuery对象所匹配DOM元素的高度,直至这些DOM元素完全显示出来。
slideUp([duration] [,easing] [,callback]) 该方法将会不断减小当前jQuery对象所匹配DOM元素的高度,直至这些DOM元素完全隐藏起来。
slideToggle([duration] [,easing] [,callback]) 该方法是slideDownslideUp两个方法的综合版本。如果当前jQuery 匹配的元素处于隐藏状态,就使用”卷帘”动画将其显示出来;如果它们处于显示状态,就使用”卷帘”动画将其隐藏起来。

不断增加或减少透明度

方法 描述
fadeIn([duration] [,easing] [,callback]) jQuery对象匹配的DOM元素以”渐显”的方式显示出来(也就是不断调整透明度)。
fadeOut([duration] [,easing] [,callback]) jQuery对象匹配的DOM元素以”渐隐”的方式隐藏起来(也就是不断调整透明度)。
fadeTo(duration,opacity [,easing] [,callback]) jQuery对象匹配的DOM元素的透明度调整到opacity值(opacity是一个0到1的浮点数)。
fadeToggle([duration] [,easing] [,callback]) 该方法是fadeIn([duration] [,easing] [,callback])fadeOut([duration] [,easing] [,callback])两个方法的综合版本。如果当前jQuery 匹配的元素处于隐藏状态,就使用”渐入”动画将其显示出来;如果它们处于显示状态,就使用”渐出”动画将它们隐藏起来。

上述方法支持的参数

上面这些方法都可以使用如下三个参数。

方法 描述
duration 指定该动画的持续时间,可以是”slow"、”normal"或”fast"三个字符串其中之一,也可以是表示动画持续时长的毫秒数,如1000。
easing 指定该动画所使用擦除效果的名称(需要插件支持),jQuery默认只支持”linear"和 “swing"两个值。
callback 指定在动画完成时激发的函数。

程序示例

上面这些方法都可以完成一些简单常用的动画效果。下面的程序示范了这些方法的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 动画效果相关的方法 </title>
<style type="text/css">
div {
background-color: #cccccc;
border: 2px solid black;
width: 200px;
height: 120px;
}
</style>
</head>

<body>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<input type="button" value="toggle" onclick="$('#test1').toggle(1000);" />
<br />
<div id="test1">使用toggle控制的元素</div>

<input type="button" value="slide down" onclick="$('#test2').slideDown(1000);" />
<input type="button" value="slide up" onclick="$('#test2').slideUp(1000);" />
<br />
<div id="test2">使用Slide动画控制的元素</div>

<input type="button" value="fade in" onclick="$('#test3').fadeIn(1000);" />
<input type="button" value="fade out" onclick="$('#test3').fadeOut(1000);" />
<br />
<div id="test3">使用Fade动画控制的元素</div>
</body>

</html>

在浏览器中运行上述页面,即可看到toggleslideUpslideDownfadeInfadeOut等几种动画效果。使用上面的函数,开发者可以非常方便地实现与用户交互的动画。

复杂动画

除了上面几个实现简单动画的方法之外,还有以下几个更复杂的方法,通过它们可以进行更复杂的控制。

方法 描述
animate(params[,duration[,easing]][,callback]) 该函数用于创建自定义动画。其中**params一个形如{prop1:endValue1,prop:endValue2...}JavaScript对象,用于指定当前jQuery对象包含的DOM对象在动画结束后的状态**;duration用于指定动画持续时间;easing用于指定动画所使用擦除效果的名称(需要插件支持);jQuery 默认只支持”linear" 和”swing"两个值。callback指定动画结束后激发的回调函数。

animate方法的第2种形式

方法 描述
animate(params,options) 该函数是前一个函数的另一种形式。其中params与前一个函数的该参数完全相同;options是一个用于指定复杂选项的JavaScript对象。

animate方法第2种形式的options参数说明

  • duration:指定该动画的持续时间,可以是”slow"、”normal"或”fast"三个字符串其中之一,也可以是表示动画持续时长的毫秒数,如1000。
  • easing:指定该动画所使用擦除效果的名称(需要插件支持),jQuery 默认只支持”linear" 和 “swing"两个值。
    • linear的效果是:整个动画以一个不变的速度行进
    • swing的效果是:行进速度在动画开始和结束时比在动画中间时稍慢
  • complete:指定在动画完成时激发的函数。
  • step:动画效果每改变一次将导致所指定的函数执行一次。
  • queue:指定是否将该动画函数放入该对象的动画函数队列之后。

程序示例

下面的程序示范了如何使用animate()方法创建自定义动画。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 复杂动画效果 </title>
<style type="text/css">
div {
background-color: #cccccc;
border: 2px solid black;
width: 200px;
height: 120px;
}
</style>
</head>

<body>
<script type="text/javascript" src="../jquery-3.1.1.js"></script>
<input id="bn1" type="button" value="执行动画" />
<br />
<div id="test1">自定义动画控制的元素</div>

<script type="text/javascript">
// 为id为bn1的按钮绑定事件处理函数
$("#bn1").click(function () {
// 为id为test1的元素指定自定义动画
$("#test1").animate(
// 下面JavaScript对象指定动画结束时目标元素的状态
{
// 字体大小
fontSize: "24pt",
// 宽度
width: "400px",
// 不透明度
opacity: 0.5
},
// 下面对象指定动画详细选项
{
// 延迟2秒
duration: 2000,
// 动画行进的开始和结尾比中间慢
easing: "swing",
// 动画介绍是调用函数
complete: function () {
alert('动画执行完成!');
}
}
)
}
);
</script>
</body>

</html>

该程序中的粗体字代码使用animate函数创建了一个自定义动画。
使用animate函数创建自定义动画时有两点需要注意:

  • options中每个属性名都应该采用”驼峰“写法,即fontsize应该写成fontSize
  • options中每个属性都应该是可以渐变的样式属性,如”height"、”top"或”opacity"等,如果指定一个fontWeight属性,那就不行了。

动画效果全局属性

jQuery为动画效果提供了如下两个全局属性。

方法 描述
jQuery.fx.interval 该属性设置jQuery的两次动画之间的时间间隔(单位是毫秒(ms))。比如设置为50,则表明jQuery动画每秒变化20次。
jQuery.fx.off 如果将该属性设为true,则表明停止所有的jQuery动画效果。在资源比较紧张的设备中使用jQuery时,可以考虑关闭所有jQuery动画来提升性能。

3.5.3 事件对象

原生JavaScript编程中获取事假对象的方式

如果使用原生JavaScript编程,则在不同浏览器中获取事件对象的方法并不相同。例如:

  • IE浏览器中,可通过隐式的全局event对象来获取事件;
  • FirefoxOpera等浏览器中,则通过事件处理函数的第一个参数来获取事件。

jQuery中获取事件对象的方式

jQuery消除了不同浏览器上的事件差异。jQuery中,事件对象总是作为参数被传入事件处理函数,不仅如此,原生事件的大量属性也会被复制到jQuery的事件中

jQuery事件对象的属性和方法

jQuery事件大致包含了以下几种属性和方法。

事件对象的属性

方法 描述
currentTarget 表示在事件冒泡阶段中事件对象所处的DOM元素。
data 表示通过bind()on()delegate()等方法绑定事件处理函数时传入的data参数。
delegateTarget 返回在jQuery中绑定事件处理函数的对象。
pageX 返回鼠标指针距离文档左边界的距离。
pageY 返回鼠标指针距离文档上边界的距离。
relatedTarget 返回参与该事件的所有其他DOM元素。
result 返回该事件触发的事件处理函数执行后的返回值。
target 返回触发该事件的初始事件源。
timeStamp 返回1970-01-01到浏览器创建该事件时的时间差,以毫秒(ms)为单位。
type 返回事件的类型。
which 对于鼠标、键盘事件,该属性返回激发该事件的鼠标键或键盘键。

事件对象的方法

方法 描述
isDefaultPrevented() 判断是否调用了事件对象的preventDefault()方法,即是否阻止了默认行为
isImmediatePropagationStopped() 判断是否调用了事件对象的stopImmediatePropagation()方法,即是否立即停止事件传播
isPropagationStopped() 判断是否调用了事件对象的stopPropagation()方法,即是否阻止事件传播
preventDefault() 调用该方法阻止事件的默认行为。
stopImmediatePropagation() 调用该方法立即停止事件传播。
stopPropagation() 调用该方法停止事件传播。

程序示例

下面是一个用键盘控制”飞机移动”的小例子,为了让键盘控制飞机移动,需要根据激发键盘事件的按键进行相应处理。下面是该示例的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 访问jQuery事件对象 </title>
</head>

<body>
<div style="position:absolute;">
<img src="plane.png" alt="飞机" />
</div>

<script type="text/javascript" src="../jquery-3.1.1.js"></script>
<script type="text/javascript">
// 指定页面加载完成后执行该函数
$(function () {
// 获取页面上包含飞机图片的div元素
var target = $("body>div:first");
// 为body元素的keydown事件绑定事件处理函数
$("body").keydown(function (event) {
switch (event.which) {
// 按下向左键
case 37:
target.offset({
// 向左移动
left: target.offset().left - 4,
// 高度不变
top: target.offset().top
});
break;
// 按下向上键
case 38:
target.offset({
left: target.offset().left
, top: target.offset().top - 4
});
break;
// 按下向右键
case 39:
target.offset({
left: target.offset().left + 4
, top: target.offset().top
});
break;
// 按下向下键
case 40:
target.offset({
left: target.offset().left
, top: target.offset().top + 4
});
break;
}
});
})
</script>
</body>

</html>

在浏览器中浏览该页面,并单击键盘上的”上、下、左、右”按键,即可控制屏幕上飞机的移动。

除此之外,JavaScript原生事件的下列属性也会被复制到jQuery事件中:altKeybubblesbuttoncancelablecharCodeclientXclientYctrlKeycurrentTargetdatadetaileventPhasemetaKeyoffsetXoffsetYoriginalTargetpageXpageYprevValuerelatedTargetscreenXscreenYshiftKeytargetviewwhich。当然,由于并不是所有事件都具备上面列出的全部属性,因此使用jQuery事件对象来访问上面属性时也可能返回undefined

3.5.2 特定事件相关的方法

除了上面介绍的通用的绑定事件处理函数之外,jQuery 还提供了大量与特定事件相关的函数,如表3.1所示。

特定设备 绑定事件处理函数
鼠标 click()dblclick()hover(),
mousedown(),mouseup(),
mouseenter(),mouseleave(),mousemove(),mouseout(),mouseover(),
focusin(),focusout()
键盘 focusin(),focusout(),keydown(),keypress(),keyup()
表单 blur(),change(),focus(),select(),submit()
HTML文档 load(),ready(),unload()
浏览器 resize(),scroll()

绑定事件处理函数的语法都遵循.xxx([eventData],handler(eventObject))的格式。

程序示例

下面的程序示范了如何为特定事件绑定事件处理函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 具体事件相关的方法 </title>
</head>

<body>
<input id="test1" type="button" value="单击我" />
<br />
<div id="test2">
鼠标悬停、移除将触发指定函数
</div>

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

$("#test1").click(function (event) {
console.log("id为test1的按钮被单击" + event)
}).click();


$("#test2").css("border", "1px solid black")
.css("background-color", "#cccccc")
.width(200)
.height(80)
// 使用hover为id为test2的元素绑定2个事件处理函数
// 当鼠标移入该元素时触发第一个函数,移出该元素时触发第二个函数
.hover(function (event) {
console.log("鼠标移入该元素之内!");
},
function () {
console.log("鼠标移出该元素!");
});
</script>
</body>

</html>

事件处理方法的两种调用形式

调用jQuery 提供的clickblurchangedblclick等这些方法时,

  • 如果传入的参数是一个函数,则表示注册该事件的事件处理函数,
  • 如果没有传入参数,则表示触发该事件

3.5 jQuery事件相关方法

jQueryJavaScript事件模型进行了简化,提供了一致的事件模型,从而允许开发者以更简洁的方式进行事件编程。

3.5.1 绑定事件处理函数

jQuery为事件编程提供了如下方法。

事件处理方法介绍

ready方法

方法 描述
ready(function()) 指定当jQuery所对应的DOM对象装载完成时执行function()函数。在function函数中可以为jQuery函数起个别名,这样可避免多个JavaScript库并存时的命名冲突。

这个函数一个常见的使用场景是$(document).ready(function(){...});,这行代码指定在页面装载完成时立即执行ready()方法里指定的函数

  • 值得指出的是,一定要保证在<body>元素中没有指定onload属性,否则不会触发$(document).ready()里指定的函数。
  • 同一个页面中可以无限次地调用$(document).ready()方法,多次注册的函数会按照(代码中的)先后顺序依次执行。

on方法

方法 描述
on(events [,selector] [,data],function(eventObject)) 为当前jQuery对象中匹配selector的所有子元素的一个或多个事件**绑定事件处理函数handler**。

其中事假处理函数handler是一个形如function(event){}的函数,其中event 表示触发该函数的事件;data 是个可选参数,它是个形如{key1:value1,key2:value2...}的对象。函数function可通过event.data来访问data对象,通过指定data,可以向事件处理函数传入更多数据。

对于on方法的时间处理函数handler,

  • 如果该函数想同时阻止事件的默认行为和事件冒泡,则让该函数返回false 即可;
  • 如果只想取消默认行为,则调用eventpreventDefault()方法即可;
  • 如果只想阻止冒泡,则调用eventstopPropagation()方法即可。

off方法

方法 描述
off(events [,selector] [,handler(eventObject)]) 这是on()方法的反向操作,它用于从当前jQuery对象包含的DOM元素中删除绑定的事件处理函数。该函数的selectorhandler两个参数都是可选的,如果没有指定任何参数,则删除jQuery对象中所有DOM元素上的事件处理函数;如果指定了selector,则只删除匹配selectorDOM元素上的事件处理函数;如果指定了handler,则只删除该事件处理函数。

unbind方法

unbind()方法能够移除所有的或被选的事件处理程序,或者当事件发生时终止指定函数的运行。ubind()适用于任何通过jQuery附加的事件处理程序。

没有参数的情况

如果没有规定参数,unbind() 方法会删除指定元素的所有事件处理程序。
代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("p").click(function(){
$(this).slideToggle();
});
$("button").click(function(){
// 移除p元素上的所有事件处理程序
$("p").unbind();
});
});
</script>
</head>
<body>
<p>这是一个段落。</p>
<p>这是另一个段落。</p>
<p>点击任何段落可以令其消失。包括本段落。</p>
<button>删除 p 元素的事件处理器</button>
</body>
</html>

两个参数的情况

方法 描述
$(selector).unbind(event,functionName) event参数是可选的,event参数规定删除元素的一个或多个事件,由空格分隔多个事件值。如果只规定了该参数,则会删除绑定到指定事件的所有函数。functionName可选。规定从元素的指定事件取消绑定的函数名。
代码实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
function alertMe()
{
alert("Hello World!");
}

$(document).ready(function(){
//给p元素设置一个点击事件处理程序
$("p").click(alertMe);
$("button").click(function(){
$("p").unbind("click",alertMe);
});
});
</script>
</head>
<body>
<p>这是一个段落。</p>
<p>这是另一个段落。</p>
<p>点击任何段落可以触发一个提示框。包括本段落。</p>
<button>从 p 元素的 click 事件删除提示框函数</button>
</body>
</html>

Event对象来作为参数的情况

方法 描述
$(selector).unbind(eventObject) 这个eventObject参数是一个Event对象,一般来自事件绑定函数,该方法用于对自身内部的事件取消绑定(比如当事件已被触发一定次数之后,删除事件处理程序)
程序示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var x=0;
$("p").click(function(e){
$("p").animate({fontSize:"+=5px"});
x++;
if (x>=2)
{
$(this).unbind(e);
}
});
});
</script>
</head>
<body>
<p style="font-size:20px;">点击这个段落可以增加其大小。只能增加两次。</p>
</body>
</html>

注意
jQuery 3.0删除了bind()方法、delegate()方法,使用on()方法来代替这两个方法,删除了unbind()方法、undelegate()方法,使用off()方法来代替这两个方法。

one方法

方法 描述
one(type,data,function) 该方法与bind()方法的作用基本一致。与bind的区别是,无论如何,one绑定的事件处理函数只会执行一次。也就是说,使用one()绑定的事件处理函数被激发一次后,jQuery将会解除one()方法绑定的事件处理函数。

trigger方法

方法 描述
trigger(type,[data]) 以编程方式触发当前jQuery对象包含的所有DOM对象上的type事件,该方法可以触发由bind()绑定的自定义事件。除此之外,该函数也会导致DOM元素执行同名的事件动作。

例如我们使用trigger()触发一个表单的submit 事件,则该表单将会被提交(如果要阻止这种默认行为,可让事件处理函数返回false)。data是一个可选的数组类型的参数,可以将该参数传给绑定在DOM对象上的事件处理函数。

triggerHandler方法

方法 描述
triggerHandler(type,[data]) 该方法与trigger的作用基本相似,只是调用该方法来触发type事件时,不会导致DOM元素执行同名的事件动作。

hover方法

方法 描述
hover(over,out) 该方法为当前jQuery对象包含的每个DOM 元素的**onmouseoveronmouseout事件**绑定事件处理函数。其中overout都是函数,分别绑定到onmouseoveronmouseout事件上作为事件处理函数。

toggle方法

方法 描述
toggle([speed],[easing],[function]) 切换jQuery对象包含的DOM 元素的显示/隐藏状态。其中speed参数指定”隐藏/显示”动画效果的速度,默认是0ms,可能的值包括slownormalfast;easing参数指定切换效果,默认是swing字符串,也可指定为linear字符串。function为在动画完成时执行的函数,每个元素的动画完成后执行一次function函数。此外,该方法还支持传入一个boolean参数值,用于控制元素的显示、隐藏,其中true表示显示,false表示隐藏。

程序示例

下面的程序示范了以上几个绑定事件处理函数的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 事件编程相关的方法 </title>
</head>

<body>
<input id="test1" type="button" value="单击我" />
<br />
<input id="test2" type="button" value="切换右边复选框的勾选状态" />
<input id="check" type="checkbox" value="" />
<br />
<input id="test3" type="button" value="激发toggle" />
<br />
<div id="tg" style="width:300px;height:120px;background-color:gray;">
</div>

<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 指定页面加载完成时执行指定函数
$(document).ready(function () {
alert("页面加载完成!");
});

// 为id为test1的元素的click事件绑定事件处理函数
$("#test1").on("click", { book: "疯狂前端开发讲义" }
, function (event) {
alert("id为test1的按钮被单击!\n" +
"事件为:" + event +
"\n事件上data的book属性为:" + event.data.book);
});

// 为id为test2的元素的click事件绑定事件处理函数
$("#test2").on("click", function (event) {
// 使用代码触发id为check的元素的单击事件,而且执行默认行为
$("#check").trigger("click");
});

// 使用toggle为id为test3的元素绑定3个事件处理函数。
$("#test3").on("click", function (event) {
// 切换id为tg的元素的显示/隐藏状态
$("#tg").toggle("slow", "linear", function () {
console.log("动画完成!")
});
});
</script>
</body>

</html>

3.4.6 操作DOM节点的相关方法

DOM操作中最常见的操作就是对节点的操作,包括创建节点复制节点插入节点删除节点等,而jQuery也提供了大量相关方法来简化对DOM节点的操作。

1.在指定节点内插入新节点

插入新节点的方法

以下方法都用于在指定节点内插入新节点。

在当前jQuery内部插入其他元素

方法 描述
append(content) jQuery对象包含的所有DOM节点内的尾部插入content内容。其中content既可以是HTML字符串,也可以是DOM元素,还可以是jQuery对象。
append(function(index,html)) 使用function(index,html)函数迭代处理jQuery所包含的每个节点,在每个节点的尾部依次插入function(index,html)函数的返回值function(index,html)函数中的indexhtml参数表示当前正在被迭代处理的DOM节点的索引DOM节点内容。
prepend(content) jQuery对象包含的所有DOM节点内的顶部插入content内容,其中content既可以是HTML字符串,也可以是DOM元素,还可以是jQuery对象。
prepend(function(index,html)) 使用function(index,html)函数迭代处理jQuery所包含的每个节点,在每个节点的顶部依次插入function(index,html)函数的返回值。function(index,html)函数中的indexhtml参数表示当前正在被迭代处理的DOM节点的索引和DOM节点内容。

把当前jQuery对象插入其他元素内部

方法 描述
appendTo(selector) 将当前jQuery对象包含的DOM元素添加到与selector匹配的所有DOM内部的尾端。
prependTo(selector) 将当前jQuery对象包含的DOM元素添加到与selector匹配的所有DOM的内部的顶端。

append方法和appendTo方法的区别

  • append()方法是在当前jQuery对象内部插入其他元素;
  • appendTo()方法是将当前jQuery 对象插入到其他元素内部A.append(B)的作用与B.appendTo(A)的作用类似。

程序示例

下面的程序示范了这些方法的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 添加HTML节点 </title>
</head>

<body>
<div id="test1">&nbsp;test1&nbsp;</div>
<div id="test2" style="border:1px solid black;">id为test2的元素</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 直接将一段HTML字符串添加到id为test1的元素的内部的尾端
$("#test1").append("<b>疯狂XML讲义</b>");
// 创建一个<span.../>元素
var span = document.createElement("span");
span.innerHTML = "疯狂Java讲义"
// 将一个DOM元素添加到id为test1的元素的内部的顶端
$("#test1").prepend(span);

// 将id为test1的元素添加到id为test2的元素内部的尾端
$("#test1").appendTo("#test2");
</script>
</body>

</html>

如果使用append(function(index,html))prepend(function(index,html))方法则可以为不同元素添加不同的内容,例如下面的页面代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 添加HTML节点 </title>
</head>

<body>
<div>1.</div>
<div>2.</div>
<div>3.</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 定义一个数组
var books = [
{ name: "疯狂Java讲义", price: 109 },
{ name: "轻量级Java EE企业应用实战", price: 89 },
{ name: "疯狂Android讲义", price: 89 }]
// 使用函数为不同div元素动态添加不同的内容
$("body>div").append(function (i) {
// i代表jQuery对象中正在迭代处理的元素的索引,因此为0、1、2...
return "<b>书名是《" + books[i].name
+ "》,价格是:" + books[i].price;
});
</script>
</body>

</html>

2.在指定节点外添加节点

以下方法用于在目标节点的前后添加新节点。

把新节点插入到当前jQuery对象的前后

方法 描述
after(content) 在该jQuery对象包含的所有DOM**节点之后添加content**内容。其中content既可以是HTML字符串,也可以是DOM对象,还可以是jQuery对象。
after(function(index)) 使用function(index)函数迭代处理jQuery所包含的每个节点,**在每个节点的后面依次添加function(index)函数的返回值**。function(index)函数中的index参数表示当前正在被迭代处理的DOM节点的索引。
before(content) 在该jQuery对象包含的所有DOM**节点之前添加content**内容。其中content既可以是HTML字符串,也可以是DOM对象,还可以是jQuery对象。
before(function(index)) 使用function(index)函数迭代处理jQuery 所包含的每个节点,**在每个节点的前面依次添加function(index)函数的返回值**。function(index)函数中的index参数表示当前正在被迭代处理的DOM节点的索引。

把jQuery对象插入到其他元素的前后

方法 描述
insertAfter(selector) 当前jQuery对象包含的所有DOM节点插入到与selector匹配的所有节点之后。
insertBefore(selector) 将当前jQuery对象包含的所有DOM节点插入到与selector匹配的所有节点之前。

程序示例

下面的程序示范了以上几个插入方法的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 插入HTML节点 </title>
</head>

<body>
<div id="test1" style="border:1px dotted black;">id为test1的元素</div>
<br />
<div id="test2" style="border:1px solid black;">id为test2的元素</div>
<hr />
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 直接将一段HTML字符串插入到id为test1的元素的的前面
$("#test1").before("<b>疯狂前端开发讲义</b>");

// 直接将一段HTML字符串插入到id为test1的元素的的后面
$("#test1").after("<b>疯狂XML讲义</b>");

// 将id为test2的元素插入hr元素之后
$("#test2").insertAfter("hr");

// 使用函数在不同节点前添加不同内容
$("body>div").before(function (i) {
return "<div style='font-size:14pt'>" + i + "</div>";
});
</script>
</body>

</html>

3.包裹

下面的方法可以将当前jQuery对象里包含的DOM节点包裹起来,也就是在这些DOM节点之前插入开始标签,在其之后插入结束标签。

每个元素都包裹一次

方法 描述
wrap(wrappingElement) jQuery对象里的每个DOM元素都进行包裹,jQuery对象里有几个元素就包裹几次。其中node既可以是有开始标签和结束标签的HTML字符串,例如<div></div>;也可以是这些标签所对应的DOM元素。
wrap(function(index)) 使用function(index)函数迭代处理jQuery所包含的每个节点。依次使用function(index)函数的返回值来包裹jQuery对象包含的每个节点function(index)函数中的index参数表示当前正在被迭代处理的DOM节点的索引。

所有的元素当成一个成体包裹一次

方法 描述
wrapAll(wrappingElement) jQuery对象里的所有DOM元素当成一个整体进行包裹,不管jQuery 对象里有多少个DOM元素都只包裹一次

包裹节点内部的一部分

方法 描述
wrapInner(wrappingElement) **包裹节点内部的一部分**。
wrapInner(function(index)) 使用function(index)函数迭代处理jQuery所包含的每个节点。依次使用function(index)函数的返回值来包裹jQuery对象包含的每个节点的内部成分(不是包裹节点的全部,而是仅包裹节点内部的部分)。function(index)函数中的**index参数表示当前正在被迭代处理的DOM节点的索引**。

解除包裹

方法 描述
unwrap() 该方法是wrap方法的逆向操作,它会去除jQuery对象中所有DOM节点的父元素。

程序示例

下面的页面代码示范了包裹相关方法的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 包裹HTML节点 </title>
</head>

<body>
<span id="test1">id为test1的元素</span>
<br />
<span id="test2">id为test2的元素</span>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// // 将每个span元素之外再包裹一个带点线边框的div元素
$("span").wrap("<div style='border:1px dotted black'></div>");
// // 将每个span元素内部成分再包裹一个灰色背景的span元素
$("span").wrapInner("<span style='background-color:#ddd'></span>");
</script>
</body>

</html>

在浏览器中执行该页面代码可得到如下页面代码:

1
2
3
4
5
6
7
8
9
10
11
<div style="border:1px dotted black">
<span id="test1">
<span style="background-color:#ddd">id为test1的元素</span>
</span>
</div>
<br>
<div style="border:1px dotted black">
<span id="test2">
<span style="background-color:#ddd">id为test2的元素</span>
</span>
</div>

4.替换

下面的方法用于替换DOM节点。

方法 描述
replaceWith(newContent) 将当前jQuery对象包含的所有DOM对象替换成newContent。其中newContent既可以是HTML字符串,也可以是DOM对象,还可以是jQuery对象。
replaceWith(function(index)) 使用function(index)函数迭代处理jQuery所包含的每个节点,依次使用function(index)函数的返回值来替换jQuery对象包含的每个节点function(index)函数中的index参数表示当前正在被迭代处理的DOM节点的索引。
replaceAll(selector) 将当前jQuery对象包含的所有DOM对象替换成与selector匹配的元素。

5.删除

下面的方法用于删除指定的DOM节点。

方法 描述
empty() 删除当前jQuery对象包含的所有DOM节点里的内容(仅保留每个DOM节点的开始标签和结束标签)。
remove([selector]) 删除当前jQuery对象包含的所有DOM节点。如果指定了selector选择器,则只删除与selector选择器匹配的DOM节点。
detach([selector]) 该方法的功能与remove([selector])方法相似,区别只在于detach()方法会保留被删除元素上关联的jQuery数据,当需要在后面某个时刻重新插入该被删除元素时,则该方法会比较有用

6.复制

下面的方法用于复制DOM节点。

方法 描述
clone([withDataAndEvents]) 复制当前jQuery对象里包含的所有DOM 元素并且选中这些复制出来的副本。当需要把DOM 文档中元素的副本添加到其他位置时,这个函数非常有用。其中withDataAndEvents 参数是可选的,如果该参数为true,则会复制DOM元素上的事件处理函数。

删除和复制 程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 删除和复制HTML节点 </title>
</head>

<body>
<div>
<span id="test1">id为test1的元素</span>
Java
</div>
<span id="test2">id为test2的元素</span>

<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 将div元素内容全部清空
$("div").empty()
// 重新添加字符串
.append("重新添加");
// 删除所有id为test2的span元素
$("span").remove("#test2");
// 取得页面中div元素,并复制该元素
$("div").clone()
// 添加背景色
.css("background-color", "#cdcdcd")
// 添加到body元素尾部
.appendTo("body");
</script>
</body>

</html>

3.4.5 操作元素内容的相关方法

jQuery 还提供了以下方法来访问或设置DOM元素的内容,包括访问或设置这些DOM元素的innerHTML属性、文本内容和value属性。

获取或设置DOM元素的HTML内容

方法 描述
html() 返回jQuery对象包含的第一个匹配的DOM元素的HTML内容(也就是返回其innerHTML属性值)。不能在XML文档中使用该方法,可以在HTML文档中使用。
html(value) 设置jQuery对象包含的所有DOM元素的HTML内容(也就是同时设置它们的innerHTML属性值)。不能在XML文档中使用该方法,可以在HTML文档中使用。

获取或设置DOM元素的文本内容

方法 描述
text() 返回jQuery对象包含的所有DOM元素的文本内容(会剔除该DOM元素里所有的XMLHTML标签)。该方法对XML文档和HTML文档都有作用。
text(val) 设置jQuery对象包含的所有DOM元素的文本内容。该方法对XML文档和HTML文档都有作用。

获取或设置表单控件的value属性值

方法 描述
val() 返回jQuery对象包含的第一个匹配的DOM元素的value,实际上就是返回表单控件的value属性值。该方法可返回字符串和数组(例如多选框和允许多选的下拉列表框)。
val(value) jQuery对象包含的所有DOM元素设置单个value属性值,实际上就是设置表单控件的value属性值。
val(Array<String>) jQuery对象包含的所有DOM元素设置多个value属性值。主要用于操作复选框和允许多选的下拉列表框。

程序示例

下面的程序示范了操作元素内容的相关方法的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 操作HTML内容的工具方法 </title>
</head>

<body>
<div></div>
<div></div>
<input id="book" name="book" type="text" />
<br />
<input id="desc" name="desc" type="text" />
<br />
<select id="gender">
<option value="male">男人</option>
<option value="female">女人</option>
</select>
<br />
<select id="publish" multiple="multiple">
<option value="phei">电子工业出版社</option>
<option value="ptpress">人民邮电出版社</option>
</select>
<br />
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 设置body下的div元素的内容
$("body>div").html("疯狂前端开发讲义");

// 设置所有input元素的值
$(":input").val("疯狂XML讲义");

// // 为所有的<select.../>元素设置value值
$("select").val(["female", "ptpress", "phei"]);

// // 仅获取jQuery元素的text部分,下面将输出java:疯狂Java讲义
console.log($("<div>java:<span>疯狂Java讲义</span></div>").text());
</script>
</body>

</html>

3.4.4 操作CSS属性的相关方法

jQuery提供了以下操作DOM元素CSS样式的方法,包括:

  • 直接访问、修改DOM元素的class属性。
  • 另外,还提供了访问、修改DOM元素内联CSS属性的方法。
  • 并且还提供了大量直接访问、修改DOM元素大小和位置的方法。

jQuery提供的操作CSS属性的相关方法如下。

操作CSS属性的方法

操作DOM的class属性的方法

下面这些方法是可以操作DOM对象的class属性来控制样式.

方法 描述
addClass(class) 将指定的CSS定义添加到jQuery对象包含的所有DOM对象上。
hasClass(class) 判断该jQuery对象是否包含至少一个具有指定CSS定义的DOM对象。**只要该jQuery对象里有一个DOM对象具有该CSS定义,则返回true,否则返回false**。
removeClass(class) 删除jQuery对象所包含的所有DOM对象上的指定CSS定义。
toggleClass(class) 如果jQuery对象包含的所有DOM对象上具有指定的CSS定义,则删除该CSS定义,否则添加该CSS定义。

css方法

css方法是通过操作内联CSS样式来实现的

获取给定属性名称对应的属性值

方法 描述
css(name) 返回该jQuery对象包含的第一个匹配的DOM对象上名为nameCSS属性值(也就是返回该DOM对象的style.name属性值)。如果在jQuery对象里找到的第一个DOM对象具有style.name属性值,则返回该值,否则返回undefined

设置属性值

方法 描述
css(name,value) jQuery对象包含的所有DOM对象设置单个CSS属性(设置它们的内联CSS属性)。如target.css("border","1px solid black");。
css(properties) jQuery对象包含的所有DOM对象同时设置多个CSS属性(设置它们的内联CSS 属性)。properties 是一个形如{key1:value1,key2:value2…}的对象,如{border:"1px solid black"}

获取相对位置的方法

方法 描述
offset() 获取jQuery对象包含的第一个匹配的DOM对象**相对于该文档的位置**。该方法返回一个形如{left:n,top:m}的对象。
position() 获取jQuery对象包含的第一个匹配的DOM对象**相对于其父元素的位置**。该方法返回一个形如{left:n,top:m}的对象。

获取和设置垂直滚动条的方法

方法 描述
scrollTop() 获取jQuery对象包含的第一个匹配的DOM对象的scroll top值(该属性值会考虑垂直滚动条中滑块的位置)。
scrollTop(value) 设置jQuery对象里包含的所有DOM对象的scroll top值。

获取和设置水平滚动条的方法

方法 描述
scrollLeft() 获取jQuery对象包含的第一个匹配的DOM对象的scroll left值(该属性值会考虑水平滚动条中滑块的位置)。
scrollLeft(value) 设置jQuery对象里包含的所有DOM对象的scroll left值。

获取和设置当前元素的高度和宽度

方法 描述
height() 返回jQuery对象里第一个匹配的元素的当前高度(以px为单位)。
height(value) 设置jQuery对象里所有元素的高度,value的单位为px。
width() 返回jQuery对象里第一个匹配的元素的当前宽度(以px为单位)。
width(value) 设置jQuery对象里所有元素的宽度,val的单位为px。

获取和设置内部高度或外部高度的方法

方法 描述
innerHeight() 返回jQuery对象里第一个匹配的元素的内部高度(以px为单位)。内部高度就是该元素的高度减去边框宽度,再减去垂直padding的大小
innerWidth() 返回jQuery对象里第一个匹配的元素的内部宽度(以px为单位)。内部宽度就是该元素的宽度减去边框宽度,再减去水平padding的大小。
outerHeight([options]) 获取jQuery对象里第一个匹配元素的外部高度(包括边框宽度和默认的padding大小),该方法对隐藏元素同样有效。如果optionstrue,则元素的页边距也会算在外部高度之内。
outerWidth([options]) 获取jQuery对象里第一个匹配元素的外部宽度(包括边框宽度和默认的padding大小),该方法对隐藏元素同样有效。如果optionstrue,则元素的页边距也会算在外部宽度之内。

程序示例

这些操作DOM元素CSS属性的方法简单清晰,而且在前面的程序中也使用了部分操作CSS属性的方法,故此处的示例程序仅示范这里的部分方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 操作CSS属性的工具方法 </title>
<style type="text/css">
.test {
background-color: #ccccff;
border: 2px dotted red;
font-weight: bold;
}
</style>
</head>

<body>
<div id="test1">
整体添加CSS样式的元素
</div>
<br/>
<div id="test2">
采用css(properties)方法添加CSS样式的元素
</div>
<br/>
<div id="test3" style="position:absolute;">
可以自由移动的元素
</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 为id为test1的元素设置class="text"
$("#test1").addClass("test");

// 为id为test2的元素设置内联CSS样式
$("#test2").css({ border: "1px solid black", color: "#888" });

// 获取id为test3的元素
var target = $("#test3")
// 设置背景色
.css("background-color", "#cccccc")
.css("padding", 10)
// 设置宽度
.width(200)
// 设置高度
.height(80)
// 设置位置
.css("left", 40)
.css("top", 64);
// 获取target的位置
var posi = target.position();
console.log("target的X座标为:" + posi.left + "\n"
+ "target的Y座标为:" + posi.top);
</script>
</body>

</html>

创建自定义的CSS属性

jQuery命名空间下还提供了一个jQuery.cssHooks工具方法,该工具方法允许开发者自定义设置CSS样式的代码,从而开发者可以创建自定义的CSS属性。例如在CSS 3规范中允许用户自定义渐变背景,但不同浏览器对渐变背景的支持情况并不相同,此时就可通过jQuery.cssHooks来开发自定义的CSS属性。
jQuery.cssHooks工具方法的用法如下:

1
2
3
4
5
6
7
8
$.cssHooks["customCss"]={
get: function(elem, computed, extra){
//实现获取自定义CSS属性值的代码。
}
set: function(elem,value){
//实现设置自定义CSS属性的代码
}
}

在上面的语法格式中,customCss是自定义的CSS属性名,程序需要分别定义getset两个函数,分别用于获取自定义的CSS属性值和设置自定义的CSS属性值。

程序示例

下面的程序示范了如何自定义CSS属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 操作CSS属性的工具方法 </title>
</head>

<body>
<div>疯狂Java讲义</div>
<div>轻量级Java EE企业应用实战</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
(function ($) {
var _patterns =
{
"msie": "progid:DXImageTransform.Microsoft.Gradient(" +
"StartColorStr='{0}', EndColorStr='{1}', GradientType=0)",
"mozilla": "-moz-linear-gradient(top, {0} 0%, {1} 100%)",
"opera": "-o-linear-gradient(top, {0} 0%, {1} 100%)",
"webkit": "-webkit-linear-gradient(top, {0} 0%, {1} 100%)",
"unknown": "-ms-linear-gradient(top, {0} 0%, {1} 100%)"
};
// 定义一个获取浏览器名称的函数
var browserName = function () {
if (/firefox/.test(navigator.userAgent.toLowerCase()))
return "mozilla";
else if (/opera/.test(navigator.userAgent.toLowerCase()))
return "opera";
else if (/webkit/.test(navigator.userAgent.toLowerCase()))
return "webkit";
// 判断是否为早期版本的IE
else if (/msie/.test(navigator.userAgent.toLowerCase()))
return "msie"
else return "unknown";
}
// 定义函数,针对不同浏览器生成CSS属性值
var genCssString = function (colorStr, browser) {
// 获取不同浏览器对应的CSS属性值模板
var reStr = _patterns[browser];
if (!reStr) return null;
// 将colors按逗号分隔成两个字符串
var colors = colorStr.split(',');
if (colors.length != 2) return;
// 将{0}占位符替换成colors[0]
// 将{1}占位符替换成colors[1]
return reStr.replace(/\{0\}/, colors[0])
.replace(/\{1\}/, colors[1]);
};
// 注册自定义CSS
$.cssHooks["lineGradBackground"] =
{
get: function (elem, computed, extra) {
return elem.style.background;
},
set: function (elem, value) {
// 获取浏览器版本
var b = browserName();
// 根据不同浏览器设置不同的background属性值
// 对于早期版本的IE浏览器,应该使用filter属性
elem.style[b == "msie" ? "filter" : "background"]
= genCssString(value, b);
}
};
})(jQuery);
$("body>div").width(300)
.height(40)
.css("padding", 30);
// 使用自定义CSS
$("body>div:first").css("lineGradBackground", "#e2f, #efe");
$("body>div:last").css("lineGradBackground", "#fff, #111");
</script>
</body>

</html>

3.4.3 操作属性的相关方法

下面这组方法是操作DOM对象属性的通用方法,可以操作DOM对象的通用属性,例如titlealtsrc等。

操作Attribute属性的方法

获取Attribute属性的attr方法

方法 描述
attr(name) 访问jQuery 对象里第一个元素的name 属性。如果jQuery 对象里包含的DOM对象都没有name属性,则该方法返回undefinedname可以是titlealtsrchref等属性。

设置Attribute属性的attr方法

方法 描述
attr(map) 用于为jQuery对象里的所有DOM对象同时设置多个属性。其中map是一个形如{name1:value1,name2:value2...}的对象,例如{"src":"logo.jpg"}
attr(name,value) 用于为jQuery对象里的所有DOM 对象**设置单个属性**。其中name是需要设置的属性名,value是需要设置的属性值。
attr(key, function) 用于为jQuery对象里的所有DOM对象**设置单个属性**,但不是直接给定属性值,而是提供function函数,由function函数来计算各元素的属性值。function函数是一个形如function(index){}的函数,其中index代表各DOM元素在jQuery对象中的索引。

移除Attribute属性的方法

方法 描述
removeAttr(name) 删除jQuery对象里所有DOM对象里的name属性。

操作Property属性的方法

获取Property属性的prop方法

方法 描述
prop(propName) 访问jQuery对象里第一个元素的propName属性。如果jQuery对象里包含的DOM对象都没有propName属性,则返回undefinedname可以是titlealtsrchref等属性。

设置Property属性的prop方法

方法 描述
prop(properties) 用于为jQuery 对象里的所有DOM 对象同时设置多个属性。其中properties是一个形如{name1:value:,name2:value2...}的对象,例如{"src":"logo.jpg"}
prop(name,value) 用于为jQuery对象里的所有DOM对象设置单个属性。其中name是需要设置的属性名,value是需要设置的属性值。
prop(key, function) 用于为jQuery对象里的所有DOM对象设置单个属性,但不是直接给定属性值,而是提供function函数,function函数来计算各元素的属性值function函数是一个形如function(index){}的函数,其中index代表各DOM元素在jQuery对象中的索引。

删除Property属性的prop方法

方法 描述
removeProp(propName) 删除jQuery对象里所有DOM对象里的propName属性。

attr系列方法和prop系列方法的区别

attr()prop()系列方法的功能非常相似,在jQuery 1.6之前,attr()系列方法充当了prop()系列方法的功能;jQuery 1.6之后,attr()系列方法专门用于操作元素的Attribute属性。而prop()系列方法则专门用于操作Property属性

读者注:这两个系列的方法本书没有说清楚,我也看了网上的一些文章,没有说的很清楚,这两者的区别先放着,后面再更新。

下面是网上的说法,我没有验证:

两者区别

  • 对于HTML元素本身就带有的固有属性在处理时,使用prop方法
  • 对于HTML元素自己自定义DOM属性在处理时,使用attr方法

适用情况

什么时候使用attr(),什么时候使用prop()
1.添加属性名称该属性就会生效应该使用prop();
2.有true,false两个属性时使用prop();
3.其他则使用attr();

对于表单元素特有属性的操作时,应该使用prop方法。而对于其他属性操作,则基本靠attr方法就可以解决。

程序示例

下面的程序示范了动态改变页面中<img>元素src属性的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 操作属性的工具方法 </title>
</head>

<body>
<img/>
<img/>
<div>
<img/>
<img/>
<img/>
</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
// 获取body下的img元素,并为这些img元素设置src属性值
$("body>img").attr("src", "logo.jpg")
.attr("alt", "疯狂Java联盟");
// 获取div下的img元素,并为这些img元素设置src属性值
$("div>img").prop("src", function (index) {
return index + 1 + ".gif";
});
</script>
</body>

</html>

3.4.2 数据存储的相关方法

jQuery允许把jQuery对象当成一个临时的”数据存储中心”,开发者能以key:value对的形式将数据存储到jQuery对象里,并从jQuery对象里取出之前存储的数据,也可以删除之前存储的数据。存入jQuery对象里的数据既可以是基本类型值,也可以是数组、JavaScript对象等。

jQuery对象支持的数据存储相关方法

注意,下面介绍的方法是保存到jQurey对象中的.

data方法

data方法即可以将name:value对存入jQuery对象中,也可以从jQuery对象中取出数据

data方法存入数据到jQuery对象中

方法 描述
data(name,value) jQuery对象里存储name:value的数据对。
data(object) jQuery对象中一次存入多个name:value数据对。其中object是一个形如{name:value...}的对象。

data方法从jQuery对象中取出数据

方法 描述
data() 获取jQuery对象中存储的所有数据。该方法返回一个{name:value...}形式的对象。
data(name) 获取jQuery对象里存储的keyname的数据。

删除jQuery对象中的数据

方法 描述
removeData([name]) 删除jQuery对象里存储的keyname的数据。
removeData([list]) 删除list所列出的多个key对应的数据。list既可是多个key组成的数组,也可是空格隔开的多个key

jQuery命名空间下提供的数据存储相关的工具方法

上面介绍的data方法是把数据存储到jQuery对象中的,如果想把数据存储到其他对象中,jQuery命名空间下也提供了一些用于将数据存储到某个元素上的工具方法

jQuery命名空间下提供的方法类似Java中的静态方法,类似静态方法可以直接通过类名调用,而jQuery命名空间下的方法可以直接通过jQuery关键字调用。

存储键值对的方法

方法 描述
jQuery.data(element,key,value) 在第一个参数element元素中存储key:value数据对。

读取键值对的方法

方法 描述
jQuery.data(element,key) 获取第一个参数element元素中指定key对应的value值。
jQuery.data(element) 获取element元素中所有key:value对。

删除键值对的方法

方法 描述
jQuery.removeData(element [,key]) 删除element元素中指定key对应的数据项。

判断是否有数据

方法 描述
jQuery.hasData(element) 判断element元素中是否已存储数据。

程序示例

下面的代码示范了jQuery的数据存储相关方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html>

<head>
<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> 操作数据的工具方法 </title>
</head>

<body>
<div>
最有趣的人物是
<span></span>, 它的年龄是:
<span></span>
</div>
<script type="text/javascript" src="../jquery-3.1.1.js">
</script>
<script type="text/javascript">
var target = $("<div>java</div>");
// 向jQuery对象里添加book数据
target.data("book", "疯狂Java讲义");
// 访问jQuery对象里的book数据,将输出"疯狂Java讲义"
console.log(target.data("book"));
// 删除jQuery对象里的book数据
target.removeData("book");
// 再次访问jQuery对象里的book数据,将输出"undefined"
console.log(target.data("book"));


// 获取页面上第一个div元素
var div = $("body>div")[0];
// 向div元素上存储多个key:value对
$.data(div, "test", { name: "孙悟空", age: 500 });
// 访问div元素上存储的数据
$("span:first").text(jQuery.data(div, "test").name);
$("span:last").text(jQuery.data(div)["test"].age);
// 删除div元素上的数据
$.removeData(div);
// 判断div元素上是否有数据
console.log($.hasData(div));
</script>
</body>

</html>