第9章 jQuery Mobile

Web 2.0带来的丰富互联网技术让所有人都享受到了技术发展和用户体验进步的乐趣。作为下一代互联网标准—HTML 5自然也是备受期待和瞩目,HTML 5已成为互联网爱好者们茶余饭后的话题。那么HTML 5到底是什么,它有哪些特性,它未来的发展方向在哪里?

9.1 HTML 5简介

HTML 5的前身名为Web Applications 1.0。于2004年被WHATWG(WebHypertext Application Techonlogy Working Group, Web超文本应用技术工作组)提出,2007年被W3C采纳,并被转变为HTML 5规范的第一个草案。HTML 5已经得到大多数现代浏览器的支持。

谈到Web设计,我们经常把Web分为三个层:
(1)结构层;(2)表现层;(3)行为层。

它们对应的技术,分别是:
(1)HTML;(2)CSS;(3)JavaScript。

随着HTML 5的到来,这三层的内容已经发生变化。在结构层中,HTML 5添加了新的标记,例如:<header><article><footer>等。HTML 5还提供了媒体元素,例如:<audio><video><canvas>等。HTML 5中表单元素也得到了加强,新增了进度条、滑动条和颜色拾取器等,同时,表单验证方面也可以用浏览器内置的验证。

在行为层方面,HTML 5为每个新的元素规定了新的交互方式以及API。例如,我们可以自定义<video>元素,让其播放和暂停视频动画等。可以使用<canvas>绘制各种图形。而在HTML 5之前,想要直接在网页上进行直接绘图是不能轻易完成的,即使是最简单的几何图形也不可以,多数交互只是保存和点击。在HTML 5之前,如果希望能够跟图片进行更多的操作或者在浏览器当中画出图形,需要Flash这类插件来帮忙。

不仅是结构和行为发生变化,表现层也同样得到了改进。CSS 3新增了很多模块,比如,高级选择器、渐变、圆角还有动画等。而在HTML 5之前,这些工作需要编写脚本才能实现效果。

HTML 5的改变不仅仅是这些,在浏览器的JavaScript API方面也做了不少改进。以前我们可以用cookie和window之类的API,而新的JavaScript API增加了很多模块,比如Geolocation,Storage和WebSocket等。

HTML 5还有很多令人心动的特性和新功能,限于篇幅无法一一举出,但我对于HTML 5的前景还是非常看好的,毕竟丰富Web应用的大势已经掀起,让我们共同期待HTML 5的降临。

8.7 小结

本章将前7章讲解的知识点和效果进行整合,读者不仅可以学到jQuery中的一些理论,还能运用jQuery创建一个完整的网站。利用jQuery提供的方法和函数,相信读者已经可以编写出既实用又功能强大的脚本。虽然本书将大部分的jQuery 方法和函数都讲解了一遍,然而在实例中应用到的只有一部分,jQuery中还有很多方法和函数等待读者去更加深入地研究和发掘。

8.6 网站脚本(jQuery)

8.6.1 准备工作

开始编写jQuery代码之前,先确定应该完成哪些功能。在网站首页(index.html)上将完成如下功能。

  • 搜索框文字效果。
  • 网页换肤。
  • 导航效果。
  • 左侧商品分类热销效果。
  • 中间大屏广告效果。
  • 右侧最新动态模块内容添加超链接提示。
  • 右侧下部品牌活动横向滚动效果。
  • 右侧下部鼠标滑过产品列表效果。

在详细页(detail.html)上将完成如下功能。

  • 产品图片放大镜效果。
  • 产品图片遮罩层效果。
  • 单击产品小图片切换大图。
  • 产品属性介绍之类的选项卡。
  • 右侧产品颜色切换。
  • 右侧产品尺寸切换。
  • 右侧产品数量和价格联动。
  • 右侧给产品评分的效果。
  • 右侧放入购物车。

接下来就用jQuery逐步地完成这些效果。

注意:为了使js文件代码更加清晰,每个页面上引用了很多js文件,实际开发过程中,可以合并成一个js文件。

8.6.2 首页(index.html)上的功能

1.搜索框文字效果(input.js)

搜索框默认会有提示文字,如“请输入商品名称”,当光标定位在搜索框上时,需要将提示文字去掉,当光标移开时,如果用户未填写任何内容,需要把提示文字恢复。在第3章已经实现过类似的效果,不过我们还需要在此基础上添加回车提交的效果,jQuery代码如下:

[插图]

2.网页换肤(changeSkin.js)

该效果在第5章已经介绍过,需要引入jquery.cookie.js插件,然后将第5章的切换皮肤的jQuery代码引入,最后修改样式路径即可,代码如下:

[插图]

将以上代码放到一个名为changeSkin.js的文件里,然后在index.html页面中引用,代码如下:

[插图]

引入后,就可以为网站切换皮肤了。例如把网站皮肤切换为红色,并且在关闭浏览器后,再次打开网站时,皮肤依旧是刚才所选择的样式,即红色,如图8-10所示。

[插图]

图8-10 切换皮肤成功

3.导航效果(nav.js)

jQuery代码如下:

[插图]

在上面代码中,使用$(“#nav li”)来选择id为nav里面的<li>元素,然后为它们添加hover事件。在hover事件的第1个函数内,使用$(this).find(“.jnNav”)找到<li>元素内部class为“jnNav”的元素,然后用“show()”方法使二级菜单显示出来。在第2个函数内,用“hide()”方法使二级菜单隐藏起来。显示效果如图8-11所示。

[插图]

图8-11 导航效果

4.左侧商品分类热销效果(addhot.js)

为了完成这个效果,可以先用Firebug工具查看模块的DOM结构,如图8-12所示。

[插图]

图8-12 模块的DOM结构

在结构中,发现需要添加热销效果的元素上会包含一个“promoted”的类,通过这个“钩子”,我们就能完成热销效果了,jQuery代码如下:

[插图]

此时,热销效果如图8-13所示。

[插图]

图8-13 热销效果

5.右侧上部产品广告效果(ad.js)

在实现这个效果之前,先分析下如何来完成这个效果。

在产品广告下方有5个缩略文字介绍,它们分别代表5张广告图,如图8-14所示。

[插图]

图8-14 广告效果图

当光标滑过文字1时,需要显示第1张图片;当光标滑过文字2时,需要显示第2张图片;依此类推。因此,如果能正确获取到当前滑过的文字的索引值,那么完成该效果就非常简单了。完成这个效果的大概结构代码如下:

[插图]

在上面代码中,定义了一个showImg()函数,然后给函数传递了一个参数index,index代表当前要显示图片的索引。获取当前滑过的<a>元素在所有<a>元素中的索引可以使用jQuery的index()方法来获取。其中.eq(0).mouseover()部分是用来初始化的,让第1个文字高亮并显示第1个图片。你也可以修改eq()方法中的数字来让页面默认显示任意一个广告。代码如下:

[插图]

接下来完成showImg()函数,showImg()函数代码如下:

[插图]

在上段代码中,首先用获取当前滑过的链接的href值,然后将值设置给大图外面的超链接。接下来,我们获取所有的大图,然后根据传入的参数index来显示相应的图片,并且将相邻的图片隐藏起来。你可以使用show()或者hide()完成这个效果,但为了让图片能够更加平滑的过渡,我们使用了fadeIn()和fadeOut()的动画效果。在使用这些效果之前,使用stop(true,true)方法将未执行完的动画队列清空,同时将正在执行的动画跳转到末状态。最后使用addClass(“chos”).和removeClass(“chos”)来给当前的文字添加高亮样式,同时为其设置不透明度。

现在,当光标在广告下方的文字上滑过时,广告就会有平滑过渡切换的效果。但如果不去碰它,那么广告始终不会动。因此接下来需要为广告添加自动执行效果。代码如下所示:

[插图]

在setInterval()方法的第1个参数中,需要实现以下功能。

  • 调用showImg(index)来显示广告效果。
  • 每调用一次,给index加1。
  • 如果index的大小已经等于广告展示的总数量,那么把index设置为0,让广告效果又重新开始。

根据以上分析,可以写出如下代码:

[插图]

此时,广告还是不会自动切换,因为我们并没有在用户进入页面时,触发hover方法。前面介绍过,hover()方法的含义是鼠标滑入滑出,它对应着2个事件,即mouseenter和mouseleave。因此可以通过trigger(“mouseleave”)函数来触发hover事件的第2个函数。最终完整的代码如下:

[插图]

运行代码后,当光标滑入广告文字时,会显示不同的广告图片;当光标不碰它时,广告也会自动滚动切换。

6.右侧最新动态模块内容添加超链接提示(tooltip.js)

该效果在第3章的最后一个例子中已经介绍过,只需要将相应的内容引入即可。先引入相应的CSS样式,代码如下:

[插图]

然后为超链接元素添加class=”tooltip”和title属性,代码如下:

[插图]

最后引入jQuery代码,代码如下:

[插图]

运行代码后,最新动态模块内的超链接元素已经有了自制的提示效果,效果如图8-15所示。

[插图]

图8-15 提示效果

7.右侧下部品牌活动横向滚动效果(imgSlide.js)

在第4章的案例中,已经对类似效果进行了介绍,因此并不需要花太多功夫就可以写出如下代码:

[插图]

当单击品牌活动右上角的分类链接时,产品就会以横向滚动的方式显示相应内容。

8.右侧下部光标滑过产品列表效果(imgHover.js)

如果还想为产品列表添加光标滑过的效果,其效果如图8-16所示。

[插图]

图8-16 光标滑过图片的效果

为了完成这个效果,可以为产品列表中的每个产品都创建一个<span>元素,它们的高度和宽度都与产品图片相同,然后为它们设置定位方式、上边距和左边距,使之刚好处于图片上方,代码如下:

[插图]

接下来的工作就是通过控制class来达到显示光标滑过的效果。首先在CSS中添加一组样式,代码如下:

[插图]

当光标滑入class为“imageMask”的元素时,为它添加imageOver样式来使产品图片出现放大镜效果;当光标滑出元素时,移除imageOver样式。代码如下:

[插图]

此时,当光标滑入图片上时,就可以出现放大镜了。

注意,这里使用的是live()方法绑定事件,而不是使用bind()方法。由于“imageMask”元素是被页面加载完后动态创建的,如果用普通的方式绑定事件,那么不会生效。而 live()方法有个特性就是即使是后面创建的元素,用它绑定的事件一直会生效。

另外,也可以使用 delegate()方法,通过这种事件委派的方式,也能达到预期的效果,jQuery代码如下:

[插图]

至此,首页(index.html)的交互功能就完成了。

8.6.3 详细页(detail.html)上的功能

1.产品图片放大镜效果(jquery.zoom.js + use_ jqzoom.js)

首先来看一下最终要实现的效果,如图8-17所示。

[插图]

图8-17 产品图片放大镜效果

如果要亲自动手实现这个效果,或许不是件容易的事情。不过,可以借助于插件,插件也是jQuery的特色之一。因此可以去官方网站查找一下,看是否有类似的插件。在本例中,使用的是名为jqzoom的插件,它很适合此时的需求。

首先把它引入到网页中,代码如下:

[插图]

查看官方网站的API使用说明,可以使用如下代码调用jqzoom:

[插图]

将上面的代码放入名为use_jqzoom.js的文件里,然后引入。

接下来在相应的HTML代码中添加属性,为<a>元素添加href属性,它的值指向产品对应的放大图,同时为它自定义的rel属性,它是小图片切换为大图片的“钩子”,后面将会讲解它。代码如下:

[插图]

最后不要忘记添加jqzoom所提供的样式。

此时,运行代码后,产品图片的放大效果就显示出来了。

2.产品图片遮罩层效果(jquery.thickbox.js)

当单击“观看清晰图片”按钮时,需要显示图8-18所示的遮罩效果。

[插图]

图8-18 产品遮罩效果

同样,在官方网站也有一款非常适合的插件,名为thickbox。按照官方网站的API说明,引入相应的jQuery和CSS文件,代码如下:

[插图]

然后为需要应用该效果的超链接元素添加class=”thickbox”和title属性,它的href值代表着需要弹出的图片。代码如下:

[插图]

此时,当单击“观看清晰图片”按钮时,就能出现遮罩层效果了。

在上面的两个效果中,并没有花太多的时间就做出来了,可见,合理地利用成熟的jQuery插件能极大的提高开发效率。

3.单击产品小图片切换大图(switchImg.js)

当单击产品小图片时,上面对应的大图片需要切换,并且大图片的放大镜效果和遮罩效果也必须同时切换。

首先来实现第一个效果:单击小图切换大图。

在前面的jqzoom的例子中,我们自定义了一个rel属性,它的值是“gal1”,它是小图切换大图的“钩子”,HTML代码如下:

[插图]

在上面代码中,我们为超链接元素定义了rel属性,它的值又定义了3个属性,分别是“gallery”、“smallimage”和“largeimage”,作用就是点击小图时,首先通过“gallery”来找到相应的元素,然后为元素设置“smallimage”和“largeimage”。

此时,点击小图可以切换大图,但单击“观看清晰图片”弹出的大图并未更新。接下来就来实现这个效果。

实现这个效果并不难,但为了使程序更加简单,需要为图片使用基于某种规则的命名。例如为小图片命名为“blue_one_small.jpg”,为大图片命名为“blue_one_big.jpg”,这样就可以很容易地根据单击的图片(blue_one.jpg)来获取相应的大图片和小图片。代码如下:

[插图]

通过lastIndexOf()方法,获取到图片文件名中最后一个“.”的位置,然后在substring()方法中使用该位置来分割文件名,得到“blue_one”和“.jpg”两部分,最后通过拼接 “_big”来得到相应的大图片,将它们赋给id为“thickImg”的元素。

应用代码后,当单击产品小图片时,不仅图片能正常切换,而且它们所对应的放大镜效果和遮罩层效果都能正常显示出当前显示的产品的图片。

4.产品属性介绍之类的选项卡(tab.js)

在第5章中已经做过一个选项卡的例子,因此可以把代码不加修改而直接使用,代码如下:

[插图]

5.右侧产品颜色切换(switchColor.js)

与单击左侧产品小图片切换为大图片类似,不过还需要多做几步,即显示当前所选中的颜色和显示相应产品列表。代码如下:

[插图]

运行效果后,产品颜色可以正常切换了,但发现一个问题,如果不手动去单击缩略图,那么放大镜效果显示的图片还是原来的图片。解决方法很简单,只要触发获取的元素的单击事件即可:

[插图]

6.右侧产品尺寸切换(sizeAndprice.js)

在实现该功能之前,先看一下它的DOM结构,在Firebug工具中显示如图8-19所示的效果。

[插图]

图8-19 产品尺寸的DOM结构

通过观察产品尺寸的DOM结构,可以非常清晰地知道元素之间的各种关系,然后利用jQuery强大的DOM操作功能,可以写出如下代码:

[插图]

这样,用户就可以通过单击尺寸来进行实时产品尺寸的选择。

7.右侧产品数量和价格联动(sizeAndprice.js)

该功能非常简单,只要能正确获取单价和数量,然后取它们的积,最后把积赋值给相应的元素即可。需要注意的是,为了防止表单元素刷新后依旧保持原来的值而引起的价格没有联动问题,需要在页面刚加载时,为元素绑定change事件之后立即触发change事件。代码如下:

[插图]

8.右侧给产品评分的效果(star.js)

在开始实现该效果之前,先看一下静态的HTML效果,如果使用如下HTML代码:

[插图]

那么会显示图8-20所示的效果。

[插图]

图8-20 样式为nostar时的效果

如果使用如下HTML代码:

[插图]

那么会显示图8-21所示的效果。

[插图]

图8-21 样式为onestar时的效果

由此可以看出,通过改变<ul>元素的class 属性,就能实现评分效果了。

根据这个原理,可以写出如下代码:

[插图]

这样,当用户单击不同的五角星图片时,就可以动态的进行评分了。

9.右侧放入购物车(finish.js)

这一步只需要将用户选择产品的名称、尺寸、颜色、数量和总价告诉用户,以便用户进行确认是否选择正确,代码如下:

[插图]

当出现图8-22所示的效果时,那么网站所需的所有效果都已经完成了。

[插图]

图8-22 alert()方式

如果你觉得以alert()方式去显示内容不太合适的话,那么可以使用第7章的学习的SimpleModal插件来显示内容。最终购买效果图如图8-23所示

[插图]

图8-23 SimpleModal方式

现在,可以放心地将这个购物网站交给后台程序员去处理了。该购物网站已经具备了一个很时尚的形象。在制作网站的过程中使用合法且语义清晰的XHTML文档来表示网站的结构内容,还用到一些外部CSS样式表为这个网站实现了特色的视觉效果。最后,利用jQuery所提供的强大功能改善了网站的行为和可用性,使用户更容易接受这个网站。

8.4 网站的(X)HTML

在开始编写CSS之前,应该把整个网站的(X)HTML代码全部写出来,然后把(X)HTML代码放到 http://validator.w3.org/网站上去验证,看是否符合规范,如果验证成功,我们就可以开始编写网站的CSS样式了。下面是(X)HTML验证一些常见的错误:

[插图]

8.5 网站样式(CSS)

8.5.1 将CSS文件分门别类

现在,不仅有了一个基本的XHTML模板,而且有了设计好的网站视觉效果。接下来的任务就是让它以网页形式呈现出来。为了达到目的,需要为模板编写CSS代码。我们把所有的CSS代码都写在同一个文件里,这样只需要在页面的<head>标签内部插入一个<link>标签就可以了,代码如下:

[插图]

8.5.2 编写CSS

对于 CSS的编写,每个人的思路和写法都不同。笔者推荐先编写全局样式,然后编写可大范围内重用的样式,最后编写细节方面的样式。这样,根据 CSS的最近优先原则,可以很容易地对网站进行从整体到细节样式的定义。

1.编写全局样式

首先编写reset.css样式表,该样式表主要用来编写一些全局的样式。CSS代码如下:

[插图]

(1)首先使用元素标签将每个元素的margin和padding属性都设置为零。这样做的好处是,可以让页面不受到不同浏览器默认设置的页边距和字边距的影响。
(2)设置<body>元素的字体颜色,字号大小等,这样可以规范整个网站的样式风格。
(3)设置其他元素的特定样式。读者可自行查阅CSS手册。

注意:关于重置样式,读者也可以参考Eric Meyer的重置样式和YUI的重置样式。

2.编写重用的样式

网站的两个页面(index.html和detail.html)都拥有头部和商品推荐部分。因此,头部和商品推荐部分的两个样式表是可以重用的。

首先我们观察一下头部的HTML结构,代码如下:

[插图]

头部主要有四块内容,Logo、搜索框、皮肤切换和导航菜单。

我们先为最外面的元素定义样式,CSS代码如下:

[插图]

上面代码把头部宽度定为990px,然后用“margin:0 auto;”使其能够居中显示。

接下来我们为Logo、搜索框、皮肤切换和导航菜单来定义样式。

  • Logo部分

Logo部分的HTML代码如下:

[插图]

通过设计图,我们知道要将Logo放在最左边,即左浮动,CSS代码如下:

[插图]

  • 搜索框

搜索部分的HTML代码如下:

[插图]

在前面定义头部样式,我们为”#header .contWidth”定义了”position: relative”,那么在它里面的元素,我们可以使用”position: absolute”来将它定义在头部的任何部分,CSS代码如下:

[插图]

  • 皮肤切换

和Logo部分一样,可以采用float浮动方式使它显示在规定的位置,不过此时,我们使用的是右浮动,CSS代码如下:

[插图]

接下来需要为ul元素内部的li元素添加样式,使之符合设计图的效果,代码如下:

[插图]

在上面的CSS 代码中,首先用“float:left;”语句使 li 元素横向排列,然后利用“text-indent:-9999px;”语句使文字显示到看不到的区域,然后给li元素添加背景图片。

注意:背景图片是预先合并好的,这样能节省网站的HTTP请求。

为了使不同的li元素显示不同的背景图,可以使用background-position属性来定位背景图。代码如下:

[插图]

  • 导航菜单

和搜索框部分一样,可以采用绝对定位方式使它显示在规定的位置,CSS代码如下:

[插图]

上面只是为一次菜单定义了样式,由于有的菜单有二级菜单,所以我们还需要做一些工作。同样,我们还是先观察菜单的HTML结构,代码如下:

[插图]

然后我们为二级菜单定义如下样式:

[插图]

和之前的原理类似,在二级菜单中,我们还是使用了position,float等传统方式。

现在,就可以看出网站头部的效果,如图8-4所示。

[插图]

图8-4 网站头部的效果

3.编写主体内容样式

(1)网站首页(index.html)主体布局

网站首页主体部分HTML结构为:

[插图]

可以使用float浮动方式来达到布局需求,CSS代码如下:

[插图]

接下来往主体结构里面放置 HTML 代码来充实网页,从而达到前面的设计图效果。首先从左边开始。在前面的设计图中,左侧有一个模块,即“商品分类”。“商品分类”的HTML 结构如下:

[插图]

接下来,为这个模块添加相应的样式,使之能达到需求。在”商品分类”模块中,有部分商品是热销产品,那么需要为这些元素添加高亮(hot)样式。CSS代码如下:

[插图]

应用样式后,页面呈现效果如图8-5所示。

[插图]

图8-5 左侧部分的布局

左侧完成后,接下来完成首页主体内容的右侧部分的布局。从前面的设计图中可以知道,右侧部分分为上下两个部分,而上面部分又分为左右两个部分。我们先来完成上面的部分,它们的HTML结构如下:

[插图]

在“大屏广告”部分,我们先为它设置固定的高度和宽度,然后使用overflow:hidden 来隐藏溢出的部分,接下来为它添加position:relative属性,然后为里面的img元素分别添加position:absolute属性。CSS代码如下:

[插图]

接下来,对“大屏广告”下方的缩略图设置样式。可以使用position:absolute和bottom:0的方式让缩略图处于最下方,然后使用float:left的方式让缩略图以水平方式排列。 CSS代码如下:

[插图]

应用样式后,网页呈现图8-6所示的效果。

[插图]

图8-6 大屏广告样式完成

“最新动态”部分由于也都是一些列表元素,所以布局可以借鉴之前模块的样式设计,CSS代码如下:

[插图]

应用样式后,网页呈现图8-7所示的效果。

[插图]

图8-7 最新动态布局

在首页还有最后一块内容,那就是“品牌活动”部分。它的HTML代码如下:

[插图]

从代码可知,“品牌活动”分为“jnBrandTab”和“jnBrandContent”两部分。“jnBrandTab”是品牌活动分类,而“jnBrandContent”则是品牌活动的内容。“jnBrandTab”部分的CSS代码如下:

[插图]

“jnBrandContent”的内容比较多,但宽度有限,所以可以使用overflow:hidden来隐藏多余的部分。在后面的内容里,我们将通过脚本来显示多余的部分。CSS代码如下:

[插图]

应用样式后,网页呈现图8-8所示的效果。

[插图]

图8-8 首页

(2)详细页(detail.html)主体布局

详细页的头部和左侧样式与首页(index.html)一样,因此只需要修改内容右侧即可。

根据前面设计的效果图可以把右侧结构分为左列和右列。在左列有一张大图片、几张小图片和一个选项卡。右列则是一些商品信息介绍,例如颜色、尺寸和价格等。

详细页主体布局的HTML结构代码如下:

[插图]

前面我们已经为为商品分类设置了样式,接下来只要为“jnProitem”和“jnDetails”设置样式即可,分别为左右两个模块设置float属性和width属性,从而达到布局目的。CSS代码如下:

[插图]

  • 产品大图和产品缩略图

和前面一样,使用float:left让缩略图以水平方式排列。CSS代码如下:

[插图]

  • 选项卡

在第5章中,我们已经实现了一个选项卡,所以需要将其样式移植过来即可,CSS代码如下:

[插图]

  • 颜色,尺寸和评分

这些元素的样式原理都跟前面的差不多,在这里就不再做过多的阐述了,读者可以在源代码中查看相关的CSS代码。

应用样式后,网页呈现如图8-9所示的效果。

[插图]

图8-9 详细页效果

此时,网站所需的两个页面都已经完成,与之前设计的效果图一致。接下来将用jQuery 脚本给网站添加一些交互效果。

第8章 用jQuery打造个性网站

在这一章里,将从零开始,创建一个网站并用jQuery来完善它。本章不仅讲解了jQuery如何应用在网站中,还介绍了开发一个网站时,前端开发工作者的一般工作流程。其中大量涉及HTML和CSS等内容。这也是为了提醒读者,作为一个出色的前端开发者,对HTML和CSS的理解同样重要,很多时候甚至比JavaScript更重要。

8.1 案例背景介绍

这是一个购物网站,网站的用途是向少男少女们提供时尚服装,首饰和玩具等。既然面向的客户群是年轻的一代,那么网站应该给人一种很时尚的感觉。因此,需要给网站增加一些与众不同的交互功能来吸引客户。

8.2 网站材料

假设已经准备好了搭建这个网站的基本素材,例如各种产品的种类,产品的介绍性文字,图片和价格等信息。现在的任务就是把这些素材合理利用,创建出一个给人一种舒适愉悦感觉的网站。

8.3 网站结构

8.3.1文件结构

每个网站或多或少都会用到图片、样式表和JavaScript脚本,因此在开始创建该网站之前,需要对文件夹结构进行以下设计。

  • images文件夹用来存放将要用到的图片。
  • styles文件夹用来存放CSS样式表。
  • scripts文件夹用来存放jQuery脚本。

本章示例功能为展示商品和针对商品的详细介绍,因此只要做两个页面,即首页和商品详细页即可。目录结构如图8-1所示。

[插图]

图8-1 目录结构

8.3.2 网页结构

购物网站基本可以分为下面几个部分。

  • 头部:相当于网站的品牌,可用于放置Logo标志和通往各个页面的链接等。
  • 内容:放置页面的主体内容。
  • 底部:放置页面其他链接和版权信息等。

该网站也不例外。首先把网站的主体结构用<div>标签表示出来,<div>的id 属性值分别为“header”、“content”和“footer”,HTML代码如下:

[插图]

这是一个通用的模板,网站首页(index.html)和产品详细页(detail.html)都可以使用该模板。有了这个基本的结构后,接下来的工作就是把相关的内容分别插入到各个页面。

8.3.3 界面设计

现在已经知道该网站每个页面的大概结构,再加上网站的原始素材,接下来就可以着手设计这些页面了。选用 Photoshop 图形设计工具来完成这项工作,两个页面的设计效果如图8-2和图8-3所示。

[插图]

图8-2 首页设计效果

[插图]

图8-3 详细页设计效果

页面最终效果确定下来之后,就可以进行网页的CSS代码的设计了。

7.7 小结

在本章中,首先介绍了几个常用且功能强大的jQuery插件,涵盖了表单验证、Ajax提交、模态窗口、Cookie和jQuery UI中的拖动排序。

下半部分主要讲解了如何自己动手编写jQuery插件,主要有3种类型的插件,包括设置和获取字体颜色的color插件、表格隔行变色插件、去掉左边空格和右边空格的ltrim和rtrim插件以及选择一定范围索引值的between选择器插件。通过对这些插件例子的学习,读者就可以编写出属于自己的jQuery插件了。

到这一章为止,对jQuery的讲解就结束了,从选择器、DOM操作、事件、动画、Ajax到插件,大家正在一步步成长,从某种意义上说,读者已经可以学成出师了。在第8章将利用jQuery创建出一个完整的网站,作为出师后的一次实战。

7.6 编写jQuery插件

在前面几个章节中,已经介绍了jQuery的大部分的基本应用,同时也看到了一些不错的插件。这一节将介绍如何编写一个插件。

7.6.1 插件的种类

编写插件的目的是给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率。

jQuery的插件主要分为3种类型。

1.封装对象方法的插件

这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery 对象进行操作,是最常见的一种插件。

据不完全统计,95%以上的jQuery 插件都是封装对象方法的插件。此类插件可以发挥出jQuery选择器的强大优势。有相当一部分的jQuery的方法,都是在 jQuery脚本库内部通过这种形式“插”在内核上的,例如parent()方法、appendTo()方法和addClass()方法等不少DOM操作方法。

有不少用户对jQuery没有提供color()方法而表示遗憾,不得不用css(“color”)来代替。在后面的例子中将会讲解如何编写一个color()方法的jQuery插件。

2.封装全局函数的插件

可以将独立的函数加到 jQuery 命名空间之下。例如第1 章提到的解决冲突用的jQuery. noConflict()方法、常用的jQuery.ajax()方法以及去除首位空格的jQuery.trim()方法等,都是 jQuery内部作为全局函数的插件附加到内核上去的。

3.选择器插件

个别情况下,会需要用到选择器插件。虽然 jQuery的选择器十分强大,但还是会需要扩充一些自己喜欢的选择器,例如用:color(red)来选择所有红色字的元素之类的想法。

7.6.2 插件的基本要点

  • jQuery插件的文件名推荐命名为jquery.[插件名].js,以免和其他JavaScript库插件混淆。例如命名为jquery.color.js。
  • 所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上。
  • 在插件内部,this指向的是当前通过选择器获取的jQuery对象,而不像一般的方法那样,例如click()方法,内部的this指向的是DOM元素。
  • 可以通过this.each来遍历所有元素。
  • 所有的方法或函数插件,都应当以分号结尾,否则压缩的时候可能出现问题。为了更稳妥些,甚至可以在插件头部先加上一个分号,以免他人的不规范代码给插件带来影响。具体方法可以参考后面的代码。
  • 插件应该返回一个jQuery对象,以保证插件的可链式操作。除非插件需要返回的是一些需要获取的量,例如字符串或者数组等。
  • 避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示。这样可以避免冲突。当然,也可以利用闭包这种技巧来回避这个问题,使插件内部继续使用$作为jQuery的别名。很多插件都是这么做的,本书也会利用这种形式。

7.6.3 插件中的闭包

关于闭包,ECMAScript 对其进行了简单的描述:允许使用内部函数(即函数定义和函数表达式位于另一个函数的函数体内),而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数,当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。即内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必须访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

利用闭包的特性,既可以避免内部临时变量影响全局空间,又可以在插件内部继续使用$作为jQuery的别名。常见的jQuery插件都是以下这种形式的:

[插图]

首先定义一个匿名函数function(){/这里置放代码/},然后用括号括起来,变成(function(){/这里置放代码/})这种形式,最后通过()这个运算符来执行。可以传递参数进去,以供内部函数使用。

[插图]

上段代码是一种常见的jQuery插件的结构。

接下来看下面这段jQuery代码:

[插图]

这里只是简单地介绍了闭包的概念,显然闭包不是几句话就能讲清楚的。但对于插件的制作来说读者只需要知道所有的插件代码必须放置在下面这两句代码内就可以了。

[插图]

如果需要获取更多关于闭包的知识,读者可以自行查阅相关资料。

7.6.4 jQuery插件的机制

jQuery提供了两个用于扩展jQuery功能的方法,即jQuery.fn.extend()方法和jQuery.extend()方法。前者用于扩展之前提到的3种类型插件中的第1种,后者用于扩展后两种插件。这两个方法都接受一个参数,类型为Object。Object 对象的“名/值对”分别代表“函数或方法名/函数主体”。具体内容将会在下面讲解。

jQuery.extend()方法除了可以用于扩展jQuery对象之外,还有一个很强大的功能,就是用于扩展已有的Object对象。

jQuery代码如下:

[插图]

用一个或多个其他对象来扩展一个对象,然后返回被扩展的对象。

例如合并settings对象和options对象,修改并返回settings对象。

[插图]

结果为:

[插图]

jQuery.extend()方法经常被用于设置插件方法的一系列默认参数,如下面的代码所示:

[插图]

如果用户调用foo()方法的时候,在传递的参数options对象中设置了相应的值,那么就使用设置的值,否则使用默认值。代码如下:

[插图]

通过使用jQuery.extend()方法,可以很方便地用传入的参数来覆盖默认值。此时,对方法的调用依旧保持一致,只不过要传入的是一个映射而不是一个参数列表。这种机制比传统的每个参数都去检测的方式不仅灵活而且更简洁。此外,使用命名参数意味着再添加新选项也不会影响过去编写的代码,从而使开发者使用起来更加直观明了。

7.6.5 编写jQuery插件

1.封装jQuery对象方法的插件

  • 编写设置和获取颜色的插件。

首先介绍如何编写一个color()插件。该插件用于实现以下两个功能。
(1)设置匹配元素的颜色。
(2)获取匹配的元素(元素集合中的第1个)的颜色。

首先将该插件按规范命名为jquery.color.js。

然后在JavaScript文件里搭好框架,代码如下:

[插图]

由于是对jQuery对象的方法扩展,因此采用扩展第1类插件的方法jQuery.fn.extend()来编写,代码如下:

[插图]

这里给这个方法提供一个参数value,如果调用方法的时候传递了value这个参数,那么就是用这个值来设置字体颜色;否则就是获取匹配元素的字体颜色的值。

首先实现第1个功能,设置字体的颜色。

只需要简单地调用jQuery提供的css()方法,直接写成this.css(“color”,value)即可。注意,插件内部的this指向的是jQuery对象,而非普通的DOM对象。接下来要注意的是,插件如果不需要返回字符串之类的特定值,应当使其具有可链接性。为此,直接返回这个this对象,由于.css()方法也会返回调用它的对象,即此处的this,因此可以将代码写成:

[插图]

接下来实现第2个功能。如果没有给方法传递参数,那么就是获取集合对象中第1个对象的color的值。由于 css()方法本身就具有返回第1个匹配元素的样式值的功能,因此此处无需通过eq()来获取第1个元素。只要将这两个功能结合起来,判断一下value是否是undefined即可。

jQuery代码如下:

[插图]

此时color()插件的功能已经全部实现了,通过该插件可以获取和设置元素的color值。实际上, css()方法内部已经有判断value是否为undefined的机制,所以才可以根据传递参数的不同而返回不同的值。因此,可以借助css()方法的这个特性来处理该问题。删除if()部分,最终剩余的代码实际上与先前那一段是一样的。jQuery代码如下:

[插图]

这样一来,插件也就编写完成了。现在来测试一下该插件。

构建如下代码,并放入插件以及测试代码。

[插图]

运行代码后可以看到图7-23和图7-24所示的效果。

[插图]

图7-23 获取第1个元素的color值

[插图]

图7-24 设置元素的color属性为红色

另外,如果要定义一组插件,可以使用如下所示写法:

[插图]

  • 表格隔行变色插件

这里将第5 章的表格隔行变色的代码制作成一个插件,以便于重复使用。表格隔行变色的jQuery代码如下:

[插图]

首先把插件方法取名为alterBgColor,然后为该插件方法搭好框架,jQuery代码如下:

[插图]

框架完成后,接下来就需要为options定义默认值。默认构建这样({odd: “odd”,even:” even”, selected:”selected”})一个 Object。这样就可以通过$(“#sometable”).alterBgColor({odd: “odd”, even:”even”,selected:”selected”})自定义奇偶行的样式类名以及选中后的样式类名。同时,直接使用$(“#sometable”).alterBgColor()就可以应用默认的样式类名。

jQuery代码如下:

[插图]

如果在后面的程序中需要使用options对象中的属性,可以使用如下方式来获得:

[插图]

接下来就需要把这些值放到程序中,来代替先前程序中的固定值。

最后就是匹配元素的问题了。显然不能直接用$('tbody>tr')选择表格行,这样会使页面中全部的<tr>元素都隔行变色。应该使用选择器选中某个表格,执行alterBgColor()方法后,将对应的表格内<tr>元素进行隔行变色。因此,需要把所有通过$('tbody>tr')选择的对象改写成$('tbody>tr',this),表示在匹配的元素内(当前表格内)查找,并应用上一步中的默认值。jQuery代码如下:

[插图]

在代码的最后,返回this,让这个插件具有可链性。

此时,插件就完成了。现在来测试这个插件。构造两个表格,id分别为table1和table2,然后使用其中一个<table>调用alterBgColor()方法,以便查看插件是否能独立工作,并且具有可链性。

jQuery代码如下:

[插图]

从图7-25可以看到,第1个表格没有变化,第2个表格不仅隔行变色,同时表格头部的<th>标签的字体颜色变为红色。

[插图]

图7-25 应用插件后的效果

需要注意的是,jQuery的选择符可能会匹配1个或多个元素。因此,在编写插件时必须考虑到这些情况。可以在插件内部调用each()方法来遍历匹配元素,然后执行相应的方法,this会依次引用每个DOM元素。如下jQuery代码所示:

[插图]

2.封装全局函数的插件

这类插件是在 jQuery 命名空间内部添加一个函数。这类插件很简单,只是普通的函数,没有特别需要注意的地方。

例如新增两个函数,用于去除左侧和右侧的空格。虽然jQuery已经提供了jQuery.trim()方法来去除两端空格,但在某些情况下,会只希望去除某一侧的空格。

去除左侧、右侧的空格的函数分别写成如下jQuery代码:

[插图]

  • (text || “”)部分是用于防止传递进来的text这个字符串变量处于未定义之类的特殊状态。如果text是undefined,则返回字符串””,否则返回字符串text。这个处理是为了保证接下来的字符串替换方法replace()方法不会出错。
  • 运用了正则表达式替换首末的空格。

函数写完之后,就可以放到jQuery命名空间之下。代码很简单,而且可以批量完成。

首先构建一个 Object 对象,把函数名和函数都放进去,其中的名/值对分别为函数名和函数主体,代码如下:

[插图]

然后,利用jQuery.extend()方法直接对jQuery对象进行扩展。

jQuery代码如下:

[插图]

现在,把代码放到HTML页面中看看有什么效果。代码如下:

[插图]

运行代码后,效果如图7-26所示。

[插图]

图7-26 运行效果

文本框中第1行的字符串左右两侧的空格都被删除。
第2行的字符串只有左侧的空格被删除。
第3行的字符串只有右侧的空格被删除。

到这里,第2 种类型的插件就编写完了。该插件只是给 jQuery对象加上两个简单的函数用于去除左侧或者右侧的空格。

3.自定义选择器

jQuery 以其强大的选择器著称,但这并不表示其选择器已经尽善尽美。有时候Web 开发者希望有一些更强大的选择器。

jQuery 提供了一套方法让用户可以通过制作选择器插件来使用自定义选择器,从而使 jQuery的选择器功能更加完善。

jQuery的选择符解析器首先会使用一组正则表达式来解析选择器,然后针对解析出的每个选择符执行一个函数,称为选择器函数。最后根据这个选择器函数的返回值为true还是 false 来决定是否保留这个元素。这样就可以找到匹配的元素节点。

下面是一个选择器例子:

[插图]

该选择器首先会获取所有的<div>元素,然后隐式遍历这些<div>元素,并逐个将这些<div>元素作为参数,连同括号里的“1”等一些参数(具体见下文)一起传递给gt对应的选择器函数进行判断。如果这个函数返回true,则这个<div>元素保留,如果返回false,则不保留这个<div>元素。这样得到的结果就是一个符合要求的<div>元素的集合。

:gt()选择器在jQuery源文件中的代码如下:

[插图]

其中,选择器的函数一共接受3个参数,代码如下:

[插图]

第1个参数为a,指向的是当前遍历到的DOM元素。
第2个参数为i,指的是当前遍历到的DOM元素的索引值,从0开始。
第3个参数m最为特别,它是由jQuery正则解析引擎进一步解析后的产物(用match匹配出来的),是一个数组。

  • m[0],以上面的$("div:gt(1)")这个例子来讲,是:gt(1)这部分。它是jQuery选择器进一步将要匹配的内容。
  • m[1],这里是选择器的引导符,匹配例子中的“:”,即冒号。并非只能使用":"后面跟上选择器,用户还可以自定义其他的选择器引导符。
  • m[2],即例子中的gt,确定究竟是调用哪个选择器函数。
  • m[3],即例子中括号里的数字“1”,它非常有用,是编写选择器函数最重要的一个参数。
  • m[4],上面的例子中没有体现出来,这个比较罕见。例如”div :l(ss(dd))”这样一个选择器中,m[4]就指向了(dd)这部分,注意是带括号的(dd),而不只是dd。同时要注意,此时的m[3]的值是ss(dd)而非ss。

jQuery已经提供了lt、gt和eq等选择器,但却没有提供l(e 小于等于)、g(e 大于等于)和between (两者之间)之类的选择器。

接下来,介绍如何编写一个 between 选择器。例如使用$("div:between(2,5)")能实现获取索引值为3、4元素的功能。

首先构建选择器函数。

jQuery代码如下:

[插图]

函数解释如下。

第1行,将传递进来的m[3]以逗号为分隔符,转成一个数组。m[3]此时的值应该是“2,5”,是一个字符串。随后放入临时变量tmp中待用。
第2行,直接将得到的2和5与i进行比较,i大于2并且小于5的元素都将得以保留。注意,此处用了一个小技巧,通过tmp[0]-0将本来的“2”这个字符串转换成了数字2,然后再与i进行比较。

接下来,将这个函数扩展成jQuery的选择器。

jQuery代码如下:

[插图]

这里再次利用 jQuery.extend()方法来对 jQuery 对象的一部分进行扩展。选择器仅仅是jQuery.expr[":"]对象的一部分,同时也是一个 Object 对象,因此可以直接利用 jQuery.extend()对其进行扩展。

最后就可以把选择器放入页面中来选取元素了,构建如下代码:

[插图]

显示图7-27和图7-28所示的界面。

[插图]

图7-27 执行前

[插图]

图7-28 执行后

在图7-28中,索引为3和4的行的背景颜色变成了白色,达到了预期的效果。

至此,选择器插件编写完了。

选择器插件中的函数属于运算密集型函数,对执行效率要求很高,读者在编写此类插件的时候,一定要秉承优化再优化的原则,千万不要随便写一个能实现功能的函数就草草了事。

7.5 jQuery UI插件

7.5.1 jQuery UI简介

jQuery UI(http://ui.jquery.com )源自于一个jQuery插件—Interface。Interface插件是由Stefan Petre创建的,Paul Bakaus也为该插件的开发做出了重大贡献。Interface插件最早版本为1.2,只支持jQuery 1.1.2的版本,后来在PaulBakaus等人领导下,将Interface的大部分代码基于jQuery 1.2的API进行重构,并统一了API。由于改进重大,因此版本号不是1.3而是直接跳到了1.5,并且改名为jQuery UI,同时也确立了jQuery UI官方插件的地位,并逐步走向完善。由于jQuery本身内核的逐渐完善,因此jQuery UI很有可能是jQuery今后发展的重点,也预示着jQuery未来的走向。

jQuery UI主要分为3个部分,交互、微件和效果库:

  • 交互。这里都是一些与鼠标交互相关的内容。包括拖动(Draggable)、置放(Droppable)、缩放(Resizable)、选择(Selectable)和排序(Sortable)等。微件(Widget)中有部分是基于这些交互组件来制作的。此库需要一个jQuery UI核心库—ui.core.js支持。
  • 微件。这里主要是一些界面的扩展。里边包括了手风琴导航(Accordion)、自动完成(Autocomplete)、取色器(Colorpicker)、对话框(Dialog)、滑块(Slider)、标签(Tabs)、日历(Datepicker)、放大镜(Magnifier)、进度条(Progressbar)和微调控制器(Spinner)等。在将来jQuery 1.7中还会有历史(History)、布局(Layout)、栅格(Grid)和菜单(Menu)等。此外,工具栏(Toolbar)和上传组件(Uploader)也正在讨论中。此库需要一个jQuery UI核心库ui.core.js的支持。
  • 效果库。此库用于提供丰富的动画效果,让动画不再局限于 animate()方法。效果库有自己的一套核心即effects.core.js,无需jQuery UI的核心库ui.core.js支持。

7.5.2 下载地址

jQuery UI插件的下载地址为:

http://ui.jquery.com/download

。在图7-17所示界面中,读者可以下载该插件。单击右上角区域的“build customdownload”链接,可以直接下载完整套件,包括源码、发行版和测试驱动等。

[插图]

图7-17 jQuery UI插件官网截图

或者直接访问网址:
http://jqueryui.com/download

如图7-18所示页面,可以挑选需要的组件,在右侧选择jQuery UI的版本等,然后单击左侧的“Download”按钮便可下载。

[插图]

图7-18 自助下载

7.5.3 快速上手

jQuery UI插件的大部分API已经统一了。以Draggables为例,有4个基本的API。

  • draggable(options):这是用来让一个DOM对象变成可拖动的对象的方法。其中的options可以设置各种不同的参数。
  • draggable(”disable”):让对应的DOM对象暂时禁用拖动。
  • draggable(”enable”):让对应的DOM对象重新启用拖动。
  • draggable(”destroy”):彻底移除拖动功能。

以上这些就是jQuery UI中大部分插件通用的用法。jQuery UI插件系列众多,鉴于文章篇幅有限,这里只挑选出其中一个实用的拖动排序组件Sortable来进行简单介绍和讲解,其他组件读者可以自行参考jQuery UI的官方网站。

图7-19是某个网站右侧的一些条目,这些条目允许用户更改它们的顺序,即个性化。利用jQuery UI中的Sortable插件,可以容易地实现这本来很复杂的一系列操作。

[插图]

图7-19 某网站右侧条目

首先构建一个简单的HTML结构并且引入Sortable库,以及其依赖的ui.core.js,完整程序代码如下:

[插图]

运行上面的代码,列表元素就可以拖动排序了,如图7-20所示。

上面的代码中,引入的脚本都是sortable插件所必需的,没有引用多余的脚本,如果你对 ui 插件的依赖关系不是太了解,并对脚本的大小不是太关注的话,那么可以使用jQuery UI提供的custom包,它包含了jQuery UI的所有扩展,是一个通用包。

[插图]

图7-20 拖动排序

[插图]

7.5.4 与单击事件冲突

在某些特殊情况下会因为拖动事件抢在单击事件之前而导致单击事件失效。如果出现这种情况,可以设置参数delay延时1毫秒,即改为:

[插图]

jQuery调用代码为:

[插图]

7.5.5 与后台结合

如果要把Sortable插件与后台结合,需要完成两件事情,首先是查找触发排序后的回调函数,然后取得排列的顺序并通过Ajax发送给后台。

首先解决回调函数。通过查找API,知道最符合要求的回调函数是stop,因此把前面的jQuery代码修改为:

[插图]

当拖动列表完成后,将会出现图7-21的提示效果。

[插图]

图7-21 拖动完成后触发

接下来就需要得到列表元素拖动后的顺序,可以通过sortable(‘serialize’)方法直接获取元素排列的顺序。但是排列要求 id 符合特定的命名规范,虽然可以自定义规则,但为了简化起见,这里还是将id修改为“name_value”的形式。例如,这里的<li>都改成如下代码:

[插图]

然后,使用$(‘#myList’).sortable(‘serialize’)方法就能得到以下形式的数据:

[插图]

最后,可以利用Ajax方法把这组数据传递到后台,后台得到一个名为myList的数组。这里使用POST方式把数据提交给后台,代码如下:

[插图]

正确发送请求后,sortable.php 就可以获取相应的顺序,并且写入数据库,以便保存用户的个性化数据。在这里并不讨论后台如何保存,因为这已经超出了本书介绍的范围。因此在这里的后台程序中只是简单处理一下获取的数组,并且按顺序将它们返回给前台,以表示后台已成功接受到数据并返回。代码如下:

[插图]

运行代码后,效果如图7-22所示。

[插图]

图7-22 排序后的值

7.4 管理Cookie的插件—Cookie

7.4.1 Cookie插件简介

Cookie是网站设计者放置在客户端的小文本文件。Cookie能为用户提供很多的便利,例如购物网站存储用户曾经浏览过的产品列表,或者门户网站记住用户喜欢选择浏览哪类新闻。在用户允许的情况下,还可以存储用户的登录信息,使得用户在访问网站时不必每次都键入这些信息。

jQuery提供了一个十分简单的插件来管理网站的Cookie,该插件的名称也是Cookie。Carhartl设计了该插件。

7.4.2 下载地址

jQuery Cookie插件的下载地址为:
https://github.com/carhartl/jquery-cookie

在图7-13所示的界面中,读者可以下载该插件、访问cookie插件的主页等。

[插图]

图7-13 Cookie插件页面截图

7.4.3 快速上手

Cookie插件是极其轻量级的插件,使用起来也比较简单。看下面的例子:

[插图]

当在用户名字段填写用户名后,单击下面的“记住用户名”复选框,使之处于选中状态,此时用户名的值已经被计入Cookie中,如图7-14所示。接下来,读者可以关闭浏览器,然后重新打开这个页面,发现用户名字段上已经被自动赋值。如图7-15和图7-16所示。

[插图]

图7-14 初始化页面

[插图]

图7-15 关闭浏览器之前

[插图]

图7-16 重新打开浏览器

7.4.4 API

  • 写入Cookie。

[插图]

说明:“the_cookie”为待写入的Cookie名,“the_value”为待写入的值。
  • 读取Cookie。

[插图]

说明:“the_cookie”为待读取的Cookie名。
  • 删除Cookie。

[插图]

说明:“the_cookie”为Cookie名,设置为null即删除此Cookie。必须使用与之前设置时相同的路径(path)和域名(domain),才可以正确删除Cookie。
  • 其他可选参数。

[插图]

说明: - expires:(Number|Date)有效期。可以设置一个整数作为有效期(单位:天),也可以直接设置一个日期对象作为Cookie的过期日期。如果指定日期为负数,例如已经过去的日子,那么此 Cookie 将被删除;如果不设置或者设置为null,那么此 Cookie 将被当作 Session Cookie处理,并且在浏览器关闭后删除。 - path:(String)cookie的路径属性。默认是创建该Cookie的页面路径。 - domain:(String)cookie的域名属性。默认是创建该Cookie的页面域名。 - secure:(Boolean)如果设为true,那么此 Cookie的传输会要求一个安全协议,例如HTTPS。

7.3 模态窗口插件—SimpleModal

7.3.1 SimpleModal插件简介

SimpleModal是一个轻量级的jQuery插件,它为模态窗口的开发提供了一个强有力的接口,可以把它当作模态窗口的框架。SimpleModal非常的灵活,可以创建你能够想像到的任何东西,并且你还不需要考虑UI开发中的跨浏览器相关问题。

Eric Martin设计了SimpleModal插件,并一直在进行改善和维护。

7.3.2 下载地址

jQuery SimpleModal插件的下载地址为:
http://www.ericmmartin.com/projects/simplemodal/

在图7-11所示界面中,读者可以下载该插件、查看英文文档和版本更新说明等。

[插图]

图7-11 SimpleModal插件页面截图

7.3.3 快速上手

SimpleModal提供了两种简单方法来调用模态窗口。

第一种方法是作为一个链式的jQuery函数。你可以在一个用jQuery获取的元素上调用modal()函数,之后用这个元素的内容来显示一个模态窗口。比如:

[插图]

第二种方法是作为一个单独函数使用。通过传递一个jQuery对象,DOM元素或纯文本(可以包含HTML)来创建一个模态窗口。比如:

[插图]

以上的两种方法都可以接受一个可选参数,比如:

[插图]

因为SimpleModal不仅仅是一个模态窗口框架,以上的两个例子只是创建非常基本的没有样式模态窗口。你也可以通过外部CSS,选项对象或两个一起来应用样式。modal overlay、container和data元素的CSS选项分别是:overlayCss、containerCss和dataCss,它们都是键值对(Key/Value)属性。SimpleModal为显示一个模态窗口设置了必要的CSS,另外它动态地把模态窗口置于屏幕中间,除非预先使用了position参数。

SimpleModal在内部定义了如下CSS 类:simplemodal-overlay,simplemodal-container,simplemodal-wrap(如果内容比container大,那么它将自动设置overflow为auto)和simplemodal-data。

SimpleModal的closeHTML参数默认声明一个用于关闭模态窗口的图片样式:modalcloseImg,因为它被定义在参数里面,不能通过参数来应用样式,所以一个外部CSS定义是必须的。

[插图]

如果IE6你也想用PNG图片的话,你可能要这么做:

[插图]

7.3.4 关闭模态窗口

SimpleModal自动为模态窗口内class是“simplemodal-close”的元素绑定了关闭函数。所以只要在HTML中添加如下代码就可以关闭窗口:

[插图]

此外,你也可以通过调用$.modal.close()的方式关闭当前打开的模态窗口。

如果你不想使用“simplemodal-close”作为默认的关闭接口,而是想自己定义,那么你可以修改全局参数,代码如下:

[插图]

以上代码将会为class为“modalClose”绑定关闭函数。

如果要修改多个默认参数,可以使用如下代码:

[插图]

7.3.5 实际应用

接下来我们使用SimpleModal来制作模态提示框和模态的iframe。

首先我们在页面中插入将要弹出的内容,并把样式设置好:

[插图]

然后我们就可以利用下面的代码调用SimpleModal:

[插图]

弹出效果如图7-12所示。

[插图]

图7-12 弹出效果

同样,如果要弹出一个iframe页面,那么使用方式也类似。

首先还是在页面中新建一段HTML代码,代码如下:

[插图]

此时iframe的src是没有指向地址,我们可以在调用SimpleModal的时候,给它赋一个值,代码如下:

[插图]

这样,我们就能把 iframe 页面以模态窗口的方式显示出来了。在以上代码中,在调用SimpleModal 时,设置了 3个参数。”opacity”是用来设置遮罩层的不透明度的。”overlayClose”设置为true,代表着单击遮罩层也能关闭模态窗口。”containerId”是一个非常有用的参数,它用来设置模态窗口容器的ID(默认值为simplemodal-container),通过这个钩子,我们能为容器定义各种规则。比如本例中,容器的ID被设置为ifr-dialog-content,在CSS样式中,为它设置的样式如下:

[插图]

7.3.6 API

SimpleModal插件的官方API地址为:
http://www.ericmmartin.com/projects/simplemodal/

关于SimpleModal插件的API内容,读者可以参考附录F的介绍。