jQuery Mobile 高级教程(全)
原文:Pro jQuery Mobile
协议:CC BY-NC-SA 4.0
零、简介
我们目前正在见证企业和个人构建和分发移动应用的方式的转变。最初的策略是为每个主要平台构建单独的原生应用。然而,团队很快意识到维护多个平台是不可持续的,因为移动团队失去了灵活性。可以一次构建并在明天发布到所有设备的移动团队将拥有竞争优势,jQuery Mobile 可以帮助您实现这一目标。
jQuery Mobile 是一个框架,用于交付具有统一接口的跨平台移动 web 应用。jQuery Mobile 将响应式布局与渐进式增强相结合,从单一代码库提供尽可能好的用户体验。通过 jQuery Mobile,我们将看到如何为 iOS、Android、Windows Phone、Blackberry 等创建可操作的、响应迅速的、具有本机外观的应用。我们将发现 jQuery Mobile 与其他移动 web 开发平台的不同之处,并且我们将浏览 jQuery Mobile 特性的实际例子,包括设计元素和事件处理。
你将学到什么
jQuery Mobile 的独特功能
jQuery Mobile 的核心特性,包括页面结构、导航、表单元素、列表和网格
如何创造主题化的设计
整个 jQuery Mobile API,包括数据属性、方法和事件
将 web 服务、Google 地图和地理定位集成到您的 jQuery Mobile 应用中
当您需要分发到应用商店或访问设备功能时,如何使用 PhoneGap 扩展 jQuery Mobile
如何将 jQuery Mobile 应用于具体案例,包括 iOS 和 Android 应用
这本书是给谁的
希望掌握 jQuery Mobile 并从单一代码库构建跨平台移动 web 应用的移动开发人员。
下载代码
读者可以在本书主页的源代码部分的[www.apress.com](http://www.apress.com)获得本书的源代码。请随意访问 Apress 网站并在那里下载代码。
一、为什么选择 jQuery Mobile?
jQuery Mobile 是一个简单易用的新 UI 框架,用于构建跨平台的移动 Web 应用。在几分钟内,您就可以创建移动应用(apps ),这些应用已经过优化,可以在目前可用的几乎所有手机、平板电脑、台式机和电子阅读器设备上运行。没错,通过单一的 jQuery Mobile 代码库,我们可以为几乎所有的消费者创造统一的体验。对于任何需要一个简单框架来创建丰富的移动 Web 体验的 Web 设计人员或开发人员来说,jQuery Mobile 是一个理想的框架。这种体验也超越了网络。jQuery Mobile 应用也可以用混合技术编译,在您喜欢的本地应用商店中发布。在开始我们的旅程时,让我们回顾一下使 jQuery Mobile 与众不同的重要特性。
普遍接入
所有带有浏览器的设备都可以访问 jQuery Mobile 应用。这是 jQuery Mobile 的分发模式的有利优势(参见 Figure 1–1)。几乎每个移动设备都带有浏览器。如果你的应用可以被广泛使用,这将是一个主要的竞争优势。下面是 jQuery Mobile 1.0 支持的设备的完整列表,包括大多数手机、平板电脑、桌面浏览器,甚至电子阅读器。
图 1–1。jQuery 1.0 手机浏览器覆盖
支持的设备:
手机/平板电脑
安卓 1.6 以上
黑莓 5+
iOS 3+
Windows Phone 7
WebOS 1.4 以上版本
塞班(诺基亚 S60)
火狐手机歌剧移动 11+
Opera Mini 5+
桌面浏览器
铬合金 11+
火狐 3.6 以上版本
Internet Explorer 7+
旅行队
电子书阅读器
点燃
角落
注:关于所有支持平台的最新列表,请参考 jQuery Mobile 的支持平台页面(参见jquerymobile.com/gbs/)。
相比之下,本地应用开发有一个非常严格的分布模型(参见 Figure 1–2)。本机应用仅在其本机操作系统上可用。例如,iPhone 应用只能通过 iOS 设备访问。如果你的目标是接触尽可能多的消费者,这种分销模式是有限的。幸运的是,jQuery Mobile 应用没有受到这种分布障碍的限制。
图 1–2。 原生 OS 覆盖范围
除了通用访问之外,jQuery Mobile 应用还可以利用我们在 Web 上已经习惯的即时部署功能。对于 jQuery Mobile 应用,在本地应用分发模型中要求的认证审查方面不存在任何障碍。移动 Web 应用可以即时更新并部署到您的生产用户。例如,我最近正在开发一个需要更新的本地企业应用,而重新认证流程花了一周时间才批准了这一更改。平心而论,本地应用商店可以选择提交紧急更新,但关键是你将依赖第三方来推送更新到他们的商店。移动网络的即时部署模式在这方面非常有利。
跨所有移动平台的统一 UI
jQuery Mobile 按照 HTML5 和 CSS3 标准设计,提供了统一的用户界面。移动用户希望他们的用户体验跨平台保持一致(参见图 1–3、图 1–4、图 1–5)。相反,比较 iPhone 和 Android 上的原生 Twitter 应用。体验不统一。jQuery Mobile 应用弥补了这种不一致性,提供了一种熟悉的、可预期的用户体验,而与平台无关。此外,无论最终用户平台如何,统一的用户界面都将提供一致的文档、屏幕截图和培训。例如,如果您的销售人员需要关于正在部署的新移动应用的培训,用户文档将包含适用于所有平台的一致屏幕截图。如果团队中一半人使用 iPhones,另一半人使用 Android 设备,那么所有用户的培训体验和文档都是一样的。
图 1-3。 iPhone
图 1–4。 Windows Phone
图 1-5。 Android
jQuery Mobile 还有助于消除对特定于设备的 UI 定制的需求。无需定制,单个 jQuery Mobile 代码库将在所有支持的平台上一致地呈现。与支持每个操作系统的本地代码库的组织相比,这是一个非常经济高效的解决方案。从支持和维护成本的角度来看,支持单一代码库更具成本效益(参见图 1–6)。
图 1–6。 通过移动技术叠加成本乘数
简化的标记驱动开发
jQuery Mobile 页面采用 HTML5 标记样式(参见清单 1–1)。).除了 HTML5 中引入的新的自定义数据属性之外,对于 Web 设计人员和开发人员来说,一切都应该非常熟悉。如果您已经熟悉 HTML5,那么迁移到 jQuery Mobile 应该是一个相对无缝的过渡。关于 JavaScript 和 CSS,默认情况下,jQuery Mobile 完成了所有繁重的工作。但是,在某些情况下,您可能需要依靠 JavaScript 来创建更动态或增强的页面体验。除了设计页面所需的简单标记外,它还允许用户界面的快速原型化。很快,我们可以创建一个功能页面、过渡和小部件的静态工作流,以帮助我们的客户用最少的努力看到真实的原型。
清单 1–1。 在此插入清单标题。
`
Title
Page Header
Hello jQuery Mobile!
Page Footer
`
渐进增强
jQuery Mobile 将为设备呈现最优雅的用户体验。例如,看看图 1–7 中的 jQuery Mobile switch 控件。这是 A 级浏览器上的开关控件。 1
A 级浏览器支持媒体查询,并将呈现 jQuery Mobile CSS3 风格的最佳体验。
图 1–7。 A 级体验
图 1–8。 C 级经验
jQuery Mobile 呈现应用了完整 CSS3 样式的控件。或者,Figure 1–8 是在更老的 C 级浏览器上呈现的相同开关控件。2C 级浏览器不渲染完整的 CSS3 样式。
重要提示:尽管 C 级体验不是最具视觉吸引力的,但它证明了优雅降级的有用性。随着用户升级到更新的设备,C 级浏览器市场最终将会缩小。在这种交叉发生之前,C 级浏览器在运行 jQuery Mobile 应用时仍将获得功能性用户体验。
本机应用并不总是优雅地降级。在大多数情况下,如果您的设备不支持本机应用功能,您甚至不允许下载该应用。例如,iOS 5 中的一个新功能是 iCloud persistence。这项新功能简化了多个设备之间的数据同步。为了兼容性,如果我们创建一个包含这一新功能的新 iOS 应用,我们将需要为我们的应用设置“最低允许的 SDK”为 5.0。现在,我们的应用将只对运行 iOS 5.0 或更高版本的用户可见。jQuery Mobile 应用在这方面更加灵活。
C 级浏览器不支持媒体查询,也不会从 jQuery Mobile 获得样式增强。
响应式设计
jQuery Mobile UI 将在不同的显示尺寸之间做出相应的呈现。例如,相同的用户界面将适当地显示在手机上(参见图 1–9)或更大的设备上,如平板电脑、台式机或电视(参见图 1–10)。
图 1–9。 手机显示
图 1–10。 平板电脑/台式机/电视显示器
一次构建,随处运行的神话
有没有可能构建一个对所有消费者(手机、台式机、平板电脑)通用的单一应用?是的,这是可能的。网络提供全球分销。jQuery Mobile 提供跨浏览器支持。有了 CSS 媒体查询,我们可以开始定制我们的用户界面,以最适合的形式因素。例如,在小型设备上,我们可以提供带有简短内容的小图像,而在大型设备上,我们可以提供带有详细内容的大图像。如今,大多数拥有移动设备的组织通常同时支持桌面网站和移动网站。你必须支持一个应用的多个发行版,这是浪费时间。组织拥抱移动存在的速度,加上他们避免浪费的需要,将推动“构建一次,随处运行”的神话成为现实。
响应式
在某些情况下,jQuery Mobile 会为您创建响应式设计。下图显示了 jQuery Mobile 的响应式设计在纵向和横向模式下应用于表单域定位的效果。例如,在纵向视图中(参见图 1–11),标签位于表单字段上方。或者,在横向重新定位设备时(参见图 1–12),表单域和标签并排出现。这种响应式设计基于可用于筛选房地产的设备提供了最有用的体验。jQuery Mobile 为您提供了许多这些好的 UX 原则,而无需您付出任何努力!
图 1–11。 响应式设计(人像)
图 1–12。 响应式设计(景观)
主题风格
jQuery Mobile 支持主题化设计,允许设计者快速地重新设计他们的 UI。默认情况下,jQuery Mobile 提供了五种主题设计,可以灵活地交换所有组件的主题,包括页面、页眉、内容和页脚组件。创建自定义主题最有用的工具是滚轮 3 。
重新设计一个用户界面需要最少的努力。例如,我可以快速获得一个默认主题的 jQuery Mobile 应用(参见 Figure 1–13),然后在几秒钟内用另一个内置主题重新设计它。在我修改主题的情况下(见图 1–14,我从列表中选择了一个替换主题。唯一需要的标记是添加一个数据主题属性。我们将在《??》第七章中更详细地讨论主题。
`
`
3 见[jqueryui.com/themeroller/](http://jqueryui.com/themeroller/)。ThemeRoller 是一个基于 web 的工具,可以自动生成新的基于 CSS 的主题。
图 1–13。 默认主题
图 1–14。 交替主题
可及
默认情况下,jQuery Mobile 应用符合 508 标准,这一特性对任何人都很有价值。 4
特别是,政府或国家机构要求他们的应用 100%可访问。此外,移动屏幕阅读器的使用正在上升。根据 WebAIM 5 的调查,66.7%的屏幕阅读器用户在他们的移动设备上使用屏幕阅读器。
4 508 合规性是一项联邦法律,要求残疾用户能够访问应用。移动网络上最常用的辅助技术是屏幕阅读器。
5 见[webaim.org/projects/screenreadersurvey3/#mobileusage](http://webaim.org/projects/screenreadersurvey3/#mobileusage)。
提示:有兴趣测试你的移动网站是否符合 508 标准吗?使用 WAVE 评估您的移动网站。 6
除了用 WAVE 测试你的移动应用的可访问性,用实际的辅助技术测试你的移动网络应用也是有价值的。例如,如果你有一个 iOS 设备,激活苹果的辅助工具,VoiceOver 7 并亲自体验该行为。
注意:如果您有兴趣查看现有的 jQuery Mobile 应用,可以使用在线 jQuery Mobile 图库获取想法和灵感(参见[www.jqmgallery.com/](http://www.jqmgallery.com/))。
总结
在本章中,我们回顾了使 jQuery Mobile 独一无二的重要特性:
jQuery Mobile 应用可以在所有带浏览器的设备上通用,并且已经过优化,可以在目前几乎所有的手机、平板电脑、台式机和电子阅读器设备上运行。
jQuery Mobile 应用可以利用我们在 Web 上已经习惯的即时部署功能。
无需定制,单个 jQuery Mobile 代码库将在所有支持的平台上一致地呈现。与为每个操作系统或客户端构建应用的替代方案相比,这是一个非常经济高效的解决方案。
jQuery Mobile 是一个简化的标记驱动框架,Web 设计人员和开发人员应该对此非常熟悉。您可能会感到非常惊讶和兴奋,因为您可以用 100%的标记构建 jQuery Mobile 应用!
jQuery Mobile 利用渐进式增强技术为所有 A 级设备提供非常丰富的体验,并为旧的 C 级浏览器提供可用的体验。
jQuery Mobile UI 将在各种大小的设备上响应性地呈现,包括手机、平板电脑、台式机或电视。
jQuery Mobile 支持主题化设计,允许设计者在全球范围内快速地重新设计他们的 UI。
所有 jQuery Mobile 应用都符合 508 标准。
6 见[wave.webaim.org/](http://wave.webaim.org/)。
7 见[www.apple.com/accessibility/iphone/vision.html](http://www.apple.com/accessibility/iphone/vision.html)。
二、jQuery Mobile 入门
在第一章中,我们回顾了 jQuery Mobile 的独特之处。现在,我们将回顾 jQuery Mobile 的基础知识,以便我们可以快速启动并运行它。我们将从 jQuery Mobile 页面模板的概述开始。实际上有两种页面模板可供选择,我们将讨论每种模板的优势。接下来,我们将深入了解 jQuery Mobile 如何将我们的语义标记增强为优化的移动体验。此外,我们将探索 jQuery Mobile 导航模型是如何工作的。尽管 jQuery Mobile 管理着整个导航体验,但是理解导航模型是如何工作的也很重要。最后,我们将向您展示如何让页面过渡真正“流行”急着出发吗?让我们从一个 jQuery Mobile 页面的例子开始。
jQuery Mobile 页面模板
一个 jQuery Mobile 页面模板显示在清单 2–1 中。在我们继续下一步之前,让我们开始吧。复制 HTML 模板(ch2/template.html),将其粘贴到桌面上,并从您喜欢的浏览器中启动它。您现在正在运行一个 jQuery Mobile 应用,无论您使用什么浏览器,它看起来都应该与图 2–1 一样!该模板是语义 HTML5,包含 jQuery Mobile 特定的属性和资产文件(CSS、js)。在清单 2–1 中突出显示并解释了每个特定的 jQuery Mobile 资产和属性。
清单 2–1。 jQuery 手机页面模板(ch2/template.html)
`
Title
**** 1
**** 2
**** 3
**** 4
**** 5
*
Page Header
Hello jQuery Mobile!
Page Footer
`
这是 jQuery Mobile 的推荐视口配置。device-width值表示我们希望内容缩放设备的整个宽度。initial-scale设置设定用于查看网页的初始比例或缩放系数。值 1 显示未缩放的文档。作为 jQuery Mobile 开发人员,您可以根据自己的应用需求定制视口设置。例如,如果你想禁用缩放,你可以添加user-scalable=no。但是,禁用缩放是一种您希望尽量避免的做法,因为它会破坏可访问性。
jQuery Mobile 的 CSS 将为所有 A 级和 B 级浏览器应用风格增强。您可以根据需要自定义或添加自己的 CSS。
jQuery 库是 jQuery Mobile 的核心依赖项,如果您的应用需要更动态的行为,强烈建议您在移动页面中利用 jQuery 的核心 API。
如果您需要覆盖 jQuery Mobile 的默认配置,可以在这里应用您的定制。有关定制 jQuery Mobile 默认配置的详细信息,请参考第八章,配置 jQuery Mobile。
jQuery Mobile JavaScript 库必须在 jQuery 和任何自定义脚本之后声明。jQuery Mobile 库是增强整个移动体验的核心。
data-role=“page”为 jQuery Mobile 页面定义页面容器。只有在构建多页面设计时才需要这个元素(参见清单 2–3)。
data-role="header"是如图图 2–1 所示的标题或标题栏。该属性是可选的。
data-role=“content”是内容体的包装容器。该属性是可选的。
data-role=“footer”包含如图图 2–1 所示的页脚条。该属性是可选的。
重要提示:CSS 和 JavaScript 文件的顺序必须按照清单 2–1 中列出的顺序出现。在 jQuery Mobile 引用依赖项之前,需要对依赖项进行排序以正确初始化。此外,建议从内容交付网络(CDN)下载这些文件。特别是,您可以从 jQuery Mobile CDN 下载它们。1cdn 中的文件经过高度优化,将为您的用户提供更灵敏的体验。它们被压缩、缓存、缩小,并且可以并行加载!
图 2–1。 你好 jQuery 手机
1 见【http://jquerymobile.com/download/】的。
提示:要将页脚定位在屏幕的最底部,向页脚元素添加data-position=“fixed”。默认页脚位于内容之后,而不是设备的底部。例如,如果你的内容只占设备高度的一半,页脚就会出现在屏幕的中间。
jQuery Mobile 页面增强功能
jQuery Mobile 如何增强标记以优化移动体验?有关目测,请参考图 2–2。
首先,jQuery Mobile 将加载语义 HTML 标记(参见清单 2–1)。
接下来,jQuery Mobile 将迭代每个页面组件,由它们的数据角色属性定义。随着 jQuery Mobile 迭代每个页面组件,它将增强标记,并为每个组件应用移动优化的 CSS3 增强。jQuery Mobile 最终将标记增强为一个页面,可以在所有移动平台上通用地呈现。
最后,在页面增强完成后,jQuery Mobile 将显示优化后的页面。请参见清单 2–2 查看由移动浏览器呈现的增强源代码。
图 2–2。 jQuery Mobile 页面增强示意图
清单 2–2。jQuery Mobile 增强版 DOM
`
** 1
2
Page Header
Hello jQuery Mobile!
Page Footer
loading
`
base 标签的@href指定了页面上所有链接的默认地址或默认目标。例如,jQuery Mobile 将在加载特定于页面的资产(图片、CSS、js 等)时利用@href。).
body 标签包含了header, content,和footer组件的增强样式。默认情况下,所有组件都使用了默认主题及其特定于移动设备的 CSS 增强功能。另外,由于增加了 WAI-ARIA 角色和级别,所有组件现在都支持可访问性。您可以免费获得所有这些增强功能!
到目前为止,您应该对设计一个基本的 jQuery Mobile 页面感到满意了。已经向您介绍了核心页面组件(page, header, content, footer),并且已经看到了增强的 jQuery Mobile 页面的 DOM 结果。接下来我们将探索 jQuery Mobile 的多页面模板。
多页模板
jQuery Mobile 支持在单个 HTML 文档中嵌入多个页面的能力,如清单 2–3 所示。这种策略可用于预先预取多个页面,并在加载子页时实现更快的响应时间。正如您在下面的示例中看到的,多页文档与我们之前看到的单页模板完全相同,只是在第一页之后附加了第二页。下面突出显示并讨论了多页的具体细节。
清单 2–3。ch2/multi-page.html多页模板
`
Multi Page Example
1
Welcome Home
Contact Us
Contact information...
`
多页文档中的每一页都必须包含唯一的id。一个页面可以有一个page或dialog的data-role。当最初显示多页文档时,仅增强并显示第一页。例如,当请求multi-page.html文档时,将显示带有id=“home”的页面,因为它是多页文档中列出的第一页。如果您想要请求带有id=“contact”的页面,您可以请求带有您想要显示的内部页面散列的多页文档(multi-page.html#contact)。当加载多页文档时,只会增强和显示初始页面。后续页面在被请求并缓存在 DOM 中时会得到增强。这种行为非常适合快速响应。要设置每个内部页面的标题,添加data-title属性。
当链接到内部页面时,您必须通过页面id引用它。例如,链接到联系人页面的 href 必须设置为href=“#contact”。
如果您想将脚本的范围限定在特定的页面上,它们必须放在页面容器中。这条规则也适用于通过 Ajax 加载的页面,我们将在下一节进一步讨论。例如,multi-page.html#home将无法访问任何在multi-page.html#contact上内部声明的 JavaScript。只能访问活动页面的脚本。然而,所有的脚本,包括 jQuery、jQuery Mobile 和您自己在父文档的 head 标签中声明的定制脚本,对于所有内部和 Ajax 加载的页面都是可用的。
设置内部页面的页面标题
需要注意的是,内部页面的标题将按照以下优先顺序设置:
如果存在一个data-ti2–tle值,它将被用作内部页面的标题。例如,“multi-page.html#home”的标题将被设置为“Home”。
如果不存在data-title值,页眉将被用作内页的标题。例如,如果"multi-page.html#home"没有data-title属性,那么标题将被设置为"Welcome Home",即它的header标签的值。
最后,如果内部页面上既没有data-title也没有标题,那么 head 标签中的 title 元素将被用作内部页面的标题。例如,如果"multi-page.html#home没有data-title属性和标题,那么标题将被设置为"Multi Page Example",即父文档标题标签的值。
重要提示:当链接到一个包含多个页面的页面时,必须将rel="external"添加到其链接中。
`
Home
Home`
这将执行整页刷新。这是必需的,因为 jQuery Mobile 不能将多页面文档加载到活动页面的 DOM 中。这将导致与 jQuery Mobile 如何利用 URL 哈希(#)的名称空间冲突。jQuery Mobile 利用哈希值来识别多页面文档中的内部页面。
此外,因为 jQuery Mobile 利用散列来识别 DOM 中的唯一页面,所以不可能利用锚标记书签特性(index.html#my-bookmark)。jQuery Mobile 将my-bookmark视为页面标识符,而不是书签。Ajax 驱动的导航将在下一节详细讨论。
单页文档与多页文档
您需要确定页面访问趋势,以确定从带宽和响应时间的角度来看哪种策略最有意义。多页文档在初始加载时会消耗更多的带宽,但它们只需要一个服务器请求,因此它们的子页面加载的响应时间非常快。单页文档每次请求消耗的带宽较少,但是每页需要一个服务器请求,这导致响应时间非常慢。
如果你有几个经常按顺序访问的页面,它们是在同一文档中预先加载的理想选择。最初的带宽命中率稍高,但我们在访问下一页时实现了即时响应。但是,如果用户访问两个页面的概率很低,那么您应该选择将文件分开,并在初始加载时达到较低的带宽。
有工具可以帮助您收集页面访问趋势和其他指标,以帮助优化您的页面访问策略。比如 Google Analytics2或者 Omniture 3 都是移动 Web 应用常见的分析解决方案。
2 见【http://www.google.com/analytics/】的。
3 见【http://www.omniture.com/】的。
提示:在大多数情况下,建议利用单页面模型,在后台将流行页面动态追加到 DOM 中。我们可以通过向任何想要动态加载的链接添加data-prefetch属性来实现这种行为:
这种混合方法允许我们选择性地选择我们想要加载和缓存的链接。同样,这种模式只推荐用于访问非常频繁的页面,因为这种行为会触发一个额外的 HTTP 请求来动态加载页面。
Ajax 驱动的导航
在上面的多页面示例中(参见清单 2–3),我们看到了 jQuery Mobile 如何从一个内部页面导航到另一个页面。当多页面文档初始化时,两个内部页面都已经添加到 DOM 中,因此从一个内部页面到另一个内部页面的页面转换速度非常快。当从一页导航到另一页时,我们可以配置要应用的过渡类型。默认情况下,框架会对所有过渡应用一个"slide"效果。我们将在本章的后面讨论过渡和可供选择的过渡类型。
`
Contact Us
`
当一个单页面过渡到另一个单页面时,导航模型是不同的。例如,我们可以将多页面中的联系页面提取到它自己的文件中(contact.html)。现在我们的主页(hijax.html)可以像普通 HTTP 链接引用一样访问联系人页面:
清单 2–4。【Ajax 导航(ch2/hijax.html )
`
`
当点击上面的“联系我们”链接时,jQuery Mobile 将按如下方式处理该请求:
jQuery Mobile will parse the href and load the page via an Ajax request (Hijax). For a visual, refer to Figure 2–3. If the page is loaded successfully, it will be added to the DOM of the current page.
图 2–3。 jQuery Mobile Hijax 请求
页面成功添加到 DOM 后,jQuery Mobile 将根据需要增强页面,更新base元素的@href,并设置data-url属性(如果没有显式设置的话)。
然后,框架将转换到新页面,并应用默认的“slide”转换。框架能够实现无缝的 CSS 转换,因为“from”和“to”页面同时存在于 DOM 中。过渡完成后,当前可见或活动的页面将被赋予“ui-page-active”CSS 类。
The resulting URL is also bookmarkable. For example, if you want to deep link to the contact page you may access it from its full path: [host:port/ch2/contact.html](http://
注意:作为一个额外的好处,基于 Ajax 的导航也将在支持 HTML5 的 pushState 的浏览器中产生干净的 URL。桌面 Safari、Chrome、Firefox 和 Opera 的最新版本都支持该功能。Android (2.2+)和 iOS5 也支持 pushState。在不支持此功能的浏览器中,将使用基于散列的 URL([host:port/hijax.html#contact.html](http://
如果任何页面在 jQuery Mobile 中加载失败,将会显示一个“加载页面错误”的小错误消息覆盖图并淡出(参见图 2–4)。
图 2–4。 错误加载屏幕
$.mobile.changePage()
changePage 函数处理从一个页面转换到另一个页面的所有细节。您可以切换到除同一页面之外的任何页面。可用过渡类型的完整列表如表 2–1 所示。
用法
$.mobile.changePage(“选项”)
论据
**toPage**(字符串或 jQuery 集合)。要转换到的页面。
toPage(字符串)。文件 URL ( "contact.html")或内部元素的 ID(#contact)。
toPage (jQuery 集合)。包含页面元素作为第一个参数的 jQuery 集合。
**options**(对象)。配置 changePage 请求的一组键/值对。所有设置都是可选的。
transition (字符串,默认:$ . mobile . default transition)。申请变更页面的过渡。默认过渡是"slide"。
reverse (布尔,默认:false)。以指示过渡应该向前还是向后。默认转换是向前。
changeHash (布尔,默认:true)。当页面更改完成时,将哈希更新为页面的 URL。
role (字符串,默认:"page")。显示页面时要使用的数据角色值。对于对话框,使用"dialog"。
pageContainer (jQuery 集合,默认:$.mobile.pageContainer)。指定页面加载后应包含的元素。
type (字符串,默认:"get")。指定发出页面请求时使用的方法(“get或“post”)。
data (字符串或对象,默认:未定义)。发送到 Ajax 页面请求的数据。
reloadPage (布尔,默认:false)。强制重新加载页面,即使它已经在页面容器的 DOM 中。
showLoadMsg (布尔,默认:true)。请求页面时显示加载消息。
fromHashChange (布尔,默认:false)。指示 changePage 是否来自 hashchange 事件。
例#1:
`//Transition to the "contact.html" page.
$.mobile.changePage( "contact.html" );
Contact Us`
例 2:
`// Go to an internal "#contact" page with a reverse "pop" transition.
$.mobile.changePage( '#contact', { transition: "pop", reverse: true } );
Contact
`
例 3:
`/* Dynamically create a new page and open it */
// Create page markup
var newPage = $("
HiHello Again!");
// Add page to page container
newPage.appendTo( $.mobile.pageContainer );
// Enhance and open new page
$.mobile.changePage( newPage );`
重要提示: Ajax 导航不会用于加载外部链接的情况:
`
在这些情况下,将进行正常的 HTTP 请求处理。此外,不会应用 CSS 过渡。如前所述,该框架能够通过将“from”和“to”页面动态加载到同一个 DOM 中,然后应用平滑的 CSS 过渡来实现平滑过渡。如果没有 Ajax 导航,转换将不会平滑,并且在转换过程中不会显示默认的加载消息($.mobile.loadingMessage)。
配置 Ajax 导航
Ajax 导航是全局启用的,但是如果 DOM 大小是一个问题,或者如果您需要支持不支持哈希历史更新的特定设备,您可以禁用这个特性(参见下面的注释)。默认情况下,jQuery Mobile 将为我们管理 DOM 大小或缓存,只将活动页面转换中涉及的“from”和“to”页面合并到 DOM 中。要禁用 Ajax 导航,请在绑定到 mobileinit 事件时设置$.mobile.ajaxEnabled = false。有关配置 jQuery Mobile 或管理 DOM 缓存的更多信息,请参考第八章。
注意: Ajax 导航已经在已知与哈希历史更新冲突的平台上被禁用。例如,jQuery Mobile 已经为黑莓 5、Opera Mini (5.0-6.0)、诺基亚 Symbian³ 和 Windows Phone 6.5 禁用了 Ajax 导航($.mobile.ajaxEnabled = false)。当使用常规 HTTP 和整页刷新浏览时,这些设备更有用。
过渡
jQuery Mobile 在页面之间转换时有六种基于 CSS 的转换效果可供选择。默认情况下,框架会对所有过渡应用一个"slide"效果。我们可以通过将data-transition属性添加到任何链接、按钮或表单来设置替代转换:
过渡效果的完整列表在表 2–1 中描述:
从页面到页面的转换过程按以下步骤进行:
用户点击按钮导航至下一页(参见图 2–5)。
框架将使用 Hijax 请求加载下一个页面,并将其添加到当前页面的 DOM 中。当两页基本并排时,平滑过渡就要开始了(见图 2–6)。
框架转换到下一页(见图 2–7)。此示例使用默认的“幻灯片”过渡。
显示下一页,过渡完成(参见图 2–8)。
图 2–5。 第一步:点击按钮导航到另一个页面
图 2–6。 第二步:框架并排加载下一页
图 2–7。 第三步:框架转换到下一页
图 2–8。 第四步:过渡完成
提示:你可以通过在链接中添加data-direction="reverse"来设置“向后”过渡。向前的"slide"转换将向左滑动,相反,反向的"slide"转换将向右滑动。例如,当转换回历史时,默认情况下会应用反向转换。但是,如果您的标题上有一个“主页”链接,您将需要应用 data-direction="reverse" 属性,否则将出现默认的“转发”效果:
对话框
对话框类似于页面,除了它们的边框是内嵌的,给它们一个模态对话框的外观。jQuery Mobile 在设计对话框样式方面非常灵活。我们可以创建确认对话框(见图 2–9)、警告对话框(见图 2–10),甚至行动单样式的对话框(见图 2–11、图 2–12)。
图 2–9。 确认对话框(ch2/dialog.html )
图 2–10。 警报对话框(ch2/alert.html )
我们可以在链接或页面组件上将页面转换成对话框。在一个链接上,添加如清单 2–5 所示的data-rel="dialog"属性。添加该属性将自动加载目标页面,并将其增强为模式对话框。
清单 2–5。 链路级转换
`
Terms and Conditions
Do you agree to these terms?
Disagree
Agree
`
我们还可以在页面容器中配置对话框。将data-role="dialog"属性添加到页面容器中,当组件加载时,它将被增强为一个模态对话框(参见清单 2–6)。
清单 2–6。ch2/dialog.html页面级转换
`
Terms and Conditions
Terms and Conditions
Do you agree to these terms?
Disagree
Agree
`
注意:任何带有data-rel="dialog"的链接或者任何带有data-role="dialog"的页面都不会出现在历史中,也不能被书签标记。例如,如果您导航到一个对话框,关闭该对话框,然后点击浏览器的前进按钮,您将不会前进到该对话框,因为它将不存在于历史中。
链接对比页面配置
有两个打开对话框的选项,我们应该选择哪一个?我更喜欢页面配置(data-role="dialog"),因为它允许我们在页面容器中配置一次对话框,导航到对话框的按钮不需要任何修改。例如,如果我们有三个按钮链接到我们的对话框,基于页面的配置只需要一个修改。而基于链接的配置需要三次更改,每个按钮一次。
jQuery Mobile dialog API 还公开了一个close方法,您可以在以编程方式处理对话框时利用它。例如,如果我们想以编程方式处理图 2–9 中“同意”按钮的处理,我们可以处理点击事件,处理任何必要的业务逻辑,并在完成时关闭对话框:
`function processAgreement(){
// Save the agreement...
// Close the dialog
$('.ui-dialog').dialog('close');
}`
行动表
除了传统的对话框,我们还可以将对话框设计成行动表(参见图 2–11 和图 2–12)。只需移除标题,添加小的样式更新(见清单 2–7),你的对话框就会显示为一个动作表。行动表通常用于征求用户的回应。为了获得最佳用户体验,建议对动作表使用slidedown过渡。方便的是,当对话框关闭时,它们会自动应用反向转换。例如,当您关闭此动作表时,将应用反向slideup转换。
图 2-11。 动作表#1 ( ch2/action-sheet1.html )
图 2–12。 动作表#2 ( ch2/action-sheet2.html )
清单 2–7。 动作单(ch2/action-sheet1.html )
`
Are you sure?
Yes, I'm Sure!
No Way!
`
这也是我们第一次接触到数据主题属性。我们可以简单地用这个属性为所有 jQuery Mobile 组件添加对比和样式。在我们的对话框例子中,我们可以设置背景和按钮的主题。当设计对话框按钮时,通常会对比取消和动作按钮的风格。jQuery Mobile 中的主题在第七章中有更深入的讨论。
对话框 UX 指南
设计 UI 组件时,一致性是最重要的设计目标。关于特定对话指南,苹果手机界面指南 4 中的一些提示包括:
提示:对话框的最大宽度默认设置为 500 像素。这将在较小的移动显示器上全屏显示,并在桌面和平板电脑屏幕上显示 500 像素宽。如果您需要覆盖默认宽度,请在您的主题中使用以下 CSS:
ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer { max-width: 100%; }
警报:
优先选择显示影响应用使用的重要信息的警告(参见图 2–10)。警报是而不是用户发起的。
警告按钮要么是浅色的,要么是深色的。对于单按钮警报,按钮总是浅色的。对于双按钮对话框,左按钮总是暗的,右按钮总是亮的(参见图 2–9)。
在一个双按钮对话框中,建议一个人们可能会选择的有利动作,取消该动作的按钮应该在左边,并且是深色的(参见 Figure 2–9)。
在两个按钮的对话框中,建议一个有潜在风险的操作(删除),取消操作的按钮应该在右边并且是浅色的。通常执行危险动作的按钮是红色的。
行动表:
优选行动表来收集对用户发起的任务的确认(参见图 2–11)。行动表也可用于为用户提供当前任务的选择范围(参见图 2–12)。
动作表总是包含至少两个按钮,允许用户选择如何完成他们的任务。
包括允许用户放弃任务的取消按钮。“取消”按钮位于操作表的底部,以鼓励用户在做出选择之前通读所有选项。“取消”按钮的颜色应该与背景的颜色相对应。
4 见developer . apple . com/library/IOs/documentation/user experience/conceptual/mobile hig/mobile hig . pdf。
有媒体查询的响应式布局
要使用 jQuery Mobile 创建响应式设计,建议利用 CSS3 媒体查询的强大功能。 5
`@media (orientation: portrait) {
/* Apply portrait orientation enhancements here... */
}
@media (orientation: landscape) {
/* apply landscape orientation enhancements here... */
}`
在某些情况下,jQuery Mobile 会为您创建响应式设计。下图显示了 jQuery Mobile 的响应式设计在纵向和横向模式下对表单字段定位的表现。例如,在纵向视图中(参见图 2–13),标签位于表单字段上方。或者,在横向重新定位设备时(参见图 2–14),表单域和标签并排出现。这种响应式设计基于设备可用的屏幕空间提供了最有用的体验。jQuery Mobile 为您提供了许多这些好的 UX 原则!
5 见www . w3 . org/tr/CSS 3-mediaquiries/。
图 2–13。 (肖像)
图 2–14。 (风景)有求必应
警告:如果你在 iOS 中启动图 2–14(ch2/responsive.html)并切换到横向,你可能已经注意到了移动 Safari 中的 iOS 缩放问题。 6 "当 meta viewport 标签设置为content="width=device-width, initial-scale=1"或任何允许用户缩放的值时,将设备更改为横向会导致页面缩放大于 1.0。因此,页面的一部分被从右边裁剪掉,用户必须双击(有时不止一次)才能让页面正确缩放到视图中。”
在 Mobile Safari 解决此问题之前,您有几个选项可以解决此问题:
您可以禁用缩放。尽管如此,禁用缩放是一种您希望尽量避免的做法,因为它会破坏可访问性。
当用户缩放时,您可以动态调整 meta 标签。 7
6 见【http://filamentgroup.com/examples/iosScaleBug/】的。
7 见adaptio . com/journal/4470/。
在上面的例子中(参见图 2–13),jQuery Mobile 能够通过利用最小-最大宽度媒体特性来应用响应式设计。例如,当浏览器支持大于 450 像素的宽度时,表单元素浮动在其标签旁边。支持文本输入行为的 CSS 如下所示:
`label.ui-input-text {
display: block;
}
@media all and (min-width: 450px){
label.ui-input-text { display: inline-block; }
}`
重要提示:Windows Phone 7(Internet Explorer 8 及以下版本)不支持媒体查询。如果你想在不支持媒体查询的浏览器上支持响应式设计,建议利用 respond . js .8respond . js 为不支持媒体查询的浏览器提供媒体查询支持。
还有一组有限的特定于 Webkit 的媒体扩展,您可能会觉得有用。例如,要为配有高清 retina 显示屏的新款 iOS 设备应用 CSS 增强功能,您可以使用webkit-min-device-pixel-ratio媒体功能:
//Webkit-specific media query for the iOS high-resolution Retina display @media screen and **(-webkit-min-device-pixel-ratio: 2)**{ // Apply retina display enhancements }
作为对 iOS 用户的额外奖励,jQuery Mobile 包含了一整套针对 retina 优化的图标,可以自动应用于任何具有非常高分辨率显示屏的 iOS 设备。
注意:如果你选择在单独的文件中分离特定于媒体的样式,你可以用 HTML <链接>媒体属性来引用它们。这种做法促进了关注点的良好分离,但是从性能的角度来看,这是因为每个单独的文件都需要一个额外的 HTTP 请求:
`
`
8 见【https://github.com/scottjehl/Respond】??。
总结
在这一章中,我们回顾了 jQuery Mobile 的基础知识,并了解了如何快速启动和运行 jQuery Mobile 应用。我们回顾了两种 jQuery Mobile 页面模板,并讨论了它们在性能和导航流程方面的优势。我们还看了一下 jQuery Mobile 如何将我们的语义标记增强为优化的移动体验。此外,我们回顾了所有可用的页面转换,并讨论了每种转换的常见使用模式。最后,我们看到了许多不同的对话框样式来创建一个有效的界面,用于通知用户或从用户那里收集反馈。在第三章中,我们将进一步了解 jQuery Mobile 的导航,以及如何最好地利用页眉和页脚控件来管理我们的移动应用数据。
三、使用标题、工具栏和标签栏导航
所有移动应用都需要工具栏来帮助导航或管理屏幕上的数据。在本章中,我们将回顾提供这些特性的 jQuery Mobile 组件。主要组件是页眉和页脚。标题通常用于显示页面标题,并且可以选择包含控件来帮助导航或管理屏幕上的对象。页脚的设计类似于页眉,但它们的职责通常由工具栏或选项卡栏来管理。此外,我们将发现分段控件的功能。分段控件是一种特殊的控件,我们可以将其放置在页眉或页脚中,以帮助显示数据的可选视图。我们将探索每一个组件,并演示如何用文本、标准图标甚至自定义图标来设计它们的样式。
标题栏
标题栏显示当前屏幕的标题。此外,您可以添加用于导航的按钮,或者添加管理页面中各项的控件。虽然页眉是可选的,但它通常用于为活动页面提供标题。让我们从查看标题结构开始,看看如何向标题添加额外的控件来帮助管理页面上的项目。
页眉基础
关于标题有几点很重要。它们包括:
标题是用data-role="header"属性定义的。
标题是一个可选组件。
除非您明确启用后退按钮,否则它不会显示在标题中。下一节将详细讨论后退按钮。
您可以使用data-theme属性调整页眉的主题。如果没有为标题设置主题,它将从页面组件继承主题。默认主题是黑色(data-theme="a")。
默认情况下,所有标题级别(H1-H6)的样式相同,以保持视觉一致性。
您可以通过添加data-position="fixed"属性来固定标题。
提示:您也可以使用表头作为分段控件,如图图 3–5 所示。分段控件允许用户显示相关数据的不同视图。
表头结构
页眉的基本用途是简单地显示活动页面的标题。最简单形式的标题如下所示。
`
Header Title
`
表头定位
有三种样式可用于定位页眉。它们包括:
默认:一个默认的标题将显示在屏幕的顶部,当你滚动时会滑出屏幕。`
Default Header`
固定:一个固定的标题将始终保持定位,并在屏幕的顶部边缘可见。然而,在滚动事件期间,标题将会消失,直到滚动完成。我们可以创建一个添加了data-position="fixed"属性的固定头。`
Fixed Header`
注意:为了实现真正的固定工具栏,浏览器需要支持位置:固定或溢出:自动。幸运的是,WebKit (iOS5)的新版本开始支持这种行为。在 jQuery Mobile 中,我们可以通过将touchOverflowEnabled配置选项设置为 true 来启用这种行为(参见第八章的中的“可配置的 jQuery Mobile 选项”了解更多细节)。
响应式:当我们创建一个全屏页面时,内容会边对边地出现,页眉和页脚会根据触摸响应相应地出现和消失。全屏模式对于照片或视频显示非常有用。要创建全屏页面,将data-fullscreen="true"添加到页面容器中,并在页眉和页脚元素中包含data-position="fixed"属性(参见清单 3–1)。例如,在图 3–1 中,我们有一个显示照片的全屏页面。如果用户点击屏幕,页眉和页脚将相应地出现和消失(参见图 3–2)。在本例中,我们有一个照片查看器,其页眉显示图像面板的计数器,页脚显示一个工具栏来帮助导航、发送电子邮件或删除图像。
清单 3–1。 【全屏(ch3/position-fullscreen.html )
`
Header
Footer
`
图 3–1。 全屏
图 3–2。 全屏显示,页眉页脚响应灵敏
注意:在 iOS 和 Android 中查看 jQuery Mobile 页面时,浏览器的地址栏会被隐藏。这是一个方便的功能,允许用户查看更多可用的屏幕空间,并平滑过渡。但是,如果您需要查看地址栏,向下拖动页面,地址栏将变得可见。
标题按钮
有些情况下,您需要在标题中添加控件来帮助管理屏幕内容。例如,“保存”和“取消”按钮是编辑数据时可用的常见控件。有三种样式的按钮可以添加到标题中。它们包括:
只有文本的按钮。
只有图标的按钮(参见图 3–4)。一个纯图标按钮需要添加两个属性:data-icon和data-iconpos="notext"。关于data-icon值的完整列表,请参考表 4-1 。
一个带有文本和图标的按钮(参见图 3–3)。这个按钮还需要data-icon属性。这里显示了每个示例:`
Done
带文字和图标的按钮
在图 3–3 中,我们有一个带有“取消”和“完成”按钮的标题来帮助管理电影评论的条目。如清单 3–2 所示,按钮被设计成普通链接。我们还为每个按钮附加了一个带有data-icon属性的图标。要创建纯文本按钮,只需删除data-icon属性。在标题中,按钮是根据它们的语义顺序来定位的。例如,第一个按钮左对齐,第二个按钮右对齐。如果你的标题只包含一个按钮,你可以通过添加class="ui-btn-right"到按钮的标记来右对齐按钮。
清单 3–2。 【页眉按钮】(ch3/header-buttons.html )
`
Cancel
Add Review
Done
` 
图 3–3。 带按钮的表头
只有图标的按钮
jQuery Mobile 包括几个标准图标(见表 4-1 ),你可以用它们来创建纯图标按钮。例如,"info"图标通常与"flip"转换一起使用,以显示配置选项或更多信息。使用标准图标消耗很少的空间,并且它们的含义在所有设备上相对一致。例如,如果我们想在现有列表中添加一个条目,我们可以选择显示一个"plus"图标,允许用户在列表中添加条目(见图 3–4)。在这个例子中,我们有一个电影评论列表,用户可以点击“add”图标来创建他们的评论。要创建一个只有图标的按钮,需要两个属性,如清单 3–3 所示。
清单 3–3。 【标题与图标(ch3/header-icons.html )
`
Reviews
` 
图 3–4。 带图标的表头
带有分段控件的标题栏
分段控件是一组内嵌控件,每个控件显示不同的视图。例如,图 3–5 中的分段控件按特定类别显示电影。这种分段控制允许用户根据他们选择的类别快速观看电影:在影院,即将上映,或顶级。
图 3–5。 分段控制
建议将分段控件放置在主标题内,如清单 3–4 所示。如果您选择将标题定位为固定控件,这种定位允许分段控件与主标题无缝集成。通过增加一些小的样式更新,我们现在有了一个分段的控件,允许用户在不同的视图中快速查看数据!
清单 3–4。 【分段控制】ch3/header-segmented-control.html