活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

零基础学习jQuery Mobile快速入门教程从新手到高手轻松掌握移动应用开发技能打造跨平台响应式网页应用

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-11 21:40:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. jQuery Mobile简介

jQuery Mobile是一个基于jQuery的触控优化的HTML5网页框架,专为移动设备设计。它允许开发者创建在各种智能手机、平板电脑和桌面设备上都能正常运行的响应式网站和应用。jQuery Mobile的核心优势在于其”编写一次,到处运行”的理念,使开发者能够快速构建跨平台的移动应用。

jQuery Mobile的主要特点包括:

• 跨平台兼容性:支持iOS、Android、Windows Phone、BlackBerry等主流移动平台
• 响应式设计:自动适应不同屏幕尺寸
• 主题系统:提供可定制的主题和样式
• 丰富的UI组件:包括按钮、列表、表单、对话框等
• 简单的API:基于jQuery,学习曲线平缓
• 无需JavaScript知识:主要通过HTML5 data-*属性实现功能

2. 环境搭建

2.1 基本HTML结构

要开始使用jQuery Mobile,首先需要创建一个基本的HTML5文档,并引入jQuery Mobile所需的CSS和JavaScript文件。以下是一个基本的HTML模板:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">
  6.     <title>jQuery Mobile入门示例</title>
  7.    
  8.     <!-- 引入jQuery Mobile CSS -->
  9.     <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  10.    
  11.     <!-- 引入jQuery库 -->
  12.     <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  13.    
  14.     <!-- 引入jQuery Mobile JS -->
  15.     <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
  16. </head>
  17. <body>
  18. <!-- 这里是页面内容 -->
  19. </body>
  20. </html>
复制代码

2.2 使用CDN或本地文件

你可以选择使用CDN(内容分发网络)来引入jQuery Mobile文件,如上面的示例所示。这种方式简单快捷,适合开发和测试。对于生产环境,你可能希望下载这些文件并托管在自己的服务器上,以提高加载速度和可靠性。

从jQuery Mobile官方网站(https://jquerymobile.com/)下载最新版本的文件后,可以将它们放在项目的相应目录中,然后修改引用路径:
  1. <link rel="stylesheet" href="css/jquery.mobile-1.4.5.min.css">
  2. <script src="js/jquery-1.11.3.min.js"></script>
  3. <script src="js/jquery.mobile-1.4.5.min.js"></script>
复制代码

2.3 开发工具推荐

虽然jQuery Mobile开发可以使用任何文本编辑器,但以下工具可以提高开发效率:

• Visual Studio Code:免费、强大的代码编辑器,支持HTML、CSS和JavaScript的智能提示和语法高亮
• Sublime Text:轻量级但功能丰富的文本编辑器
• Adobe Dreamweaver:提供可视化设计界面和代码编辑功能
• Chrome开发者工具:用于调试和测试移动应用

3. 基本页面结构

3.1 单页面模板

jQuery Mobile应用的基本单位是”页面”。在单个HTML文件中,可以定义一个或多个页面。以下是一个单页面的基本结构:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">
  6.     <title>单页面示例</title>
  7.     <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  8.     <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  9.     <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
  10. </head>
  11. <body>
  12. <!-- 页面容器 -->
  13. <div data-role="page">
  14.    
  15.     <!-- 页眉 -->
  16.     <div data-role="header">
  17.         <h1>欢迎来到jQuery Mobile</h1>
  18.     </div>
  19.    
  20.     <!-- 内容区域 -->
  21.     <div data-role="content">
  22.         <p>这是页面的主要内容区域。</p>
  23.         <a href="#" data-role="button">点击我</a>
  24.     </div>
  25.    
  26.     <!-- 页脚 -->
  27.     <div data-role="footer">
  28.         <h4>页面底部</h4>
  29.     </div>
  30.    
  31. </div>
  32. </body>
  33. </html>
复制代码

在这个结构中:

• data-role="page"定义了一个jQuery Mobile页面
• data-role="header"定义了页面的头部区域
• data-role="content"定义了页面的主要内容区域
• data-role="footer"定义了页面的底部区域

3.2 多页面模板

在单个HTML文件中,可以定义多个页面,每个页面都有一个唯一的ID。页面之间可以通过链接进行导航:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">
  6.     <title>多页面示例</title>
  7.     <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  8.     <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  9.     <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
  10. </head>
  11. <body>
  12. <!-- 首页 -->
  13. <div data-role="page" id="home">
  14.     <div data-role="header">
  15.         <h1>首页</h1>
  16.     </div>
  17.    
  18.     <div data-role="content">
  19.         <p>欢迎来到首页!</p>
  20.         <a href="#about" data-role="button">关于我们</a>
  21.         <a href="#contact" data-role="button">联系我们</a>
  22.     </div>
  23.    
  24.     <div data-role="footer">
  25.         <h4>© 2023 jQuery Mobile教程</h4>
  26.     </div>
  27. </div>
  28. <!-- 关于页面 -->
  29. <div data-role="page" id="about">
  30.     <div data-role="header">
  31.         <h1>关于我们</h1>
  32.         <a href="#home" data-icon="home" data-iconpos="notext">首页</a>
  33.     </div>
  34.    
  35.     <div data-role="content">
  36.         <p>这是关于我们的页面。</p>
  37.         <p>jQuery Mobile是一个强大的移动应用开发框架。</p>
  38.     </div>
  39.    
  40.     <div data-role="footer">
  41.         <h4>© 2023 jQuery Mobile教程</h4>
  42.     </div>
  43. </div>
  44. <!-- 联系页面 -->
  45. <div data-role="page" id="contact">
  46.     <div data-role="header">
  47.         <h1>联系我们</h1>
  48.         <a href="#home" data-icon="home" data-iconpos="notext">首页</a>
  49.     </div>
  50.    
  51.     <div data-role="content">
  52.         <p>这是联系我们的页面。</p>
  53.         <p>邮箱:info@example.com</p>
  54.         <p>电话:123-456-7890</p>
  55.     </div>
  56.    
  57.     <div data-role="footer">
  58.         <h4>© 2023 jQuery Mobile教程</h4>
  59.     </div>
  60. </div>
  61. </body>
  62. </html>
复制代码

在这个多页面示例中:

• 每个页面都有一个唯一的ID(如id="home")
• 页面之间的链接使用href="#页面ID"的格式
• 在子页面的头部添加了返回首页的按钮,使用data-icon="home"属性

4. 导航和页面转换

4.1 页面链接和导航

在jQuery Mobile中,页面之间的导航可以通过几种方式实现:

如前面的多页面示例所示,使用锚点链接(href="#页面ID")可以在同一HTML文档中的页面之间导航:
  1. <a href="#about" data-role="button">关于我们</a>
复制代码

要导航到外部HTML文件中的页面,可以使用标准的链接方式:
  1. <a href="about.html" data-role="button">关于我们</a>
复制代码

jQuery Mobile会自动在页面中添加返回按钮,但你也可以手动添加:
  1. <a href="#" data-rel="back" data-role="button" data-icon="back">返回</a>
复制代码

4.2 页面转换效果

jQuery Mobile提供了多种页面转换效果,通过data-transition属性指定:
  1. <a href="#about" data-transition="slide" data-role="button">滑动效果</a>
  2. <a href="#about" data-transition="pop" data-role="button">弹出效果</a>
  3. <a href="#about" data-transition="fade" data-role="button">淡入效果</a>
  4. <a href="#about" data-transition="flip" data-role="button">翻转效果</a>
  5. <a href="#about" data-transition="turn" data-role="button">转动效果</a>
  6. <a href="#about" data-transition="flow" data-role="button">流动效果</a>
  7. <a href="#about" data-transition="slidefade" data-role="button">滑动淡入效果</a>
  8. <a href="#about" data-transition="slideup" data-role="button">向上滑动效果</a>
  9. <a href="#about" data-transition="slidedown" data-role="button">向下滑动效果</a>
复制代码

4.3 导航栏和标签栏

导航栏通常放在页眉或页脚中,用于放置主要导航链接:
  1. <div data-role="footer" data-position="fixed">
  2.     <div data-role="navbar">
  3.         <ul>
  4.             <li><a href="#home" data-icon="home">首页</a></li>
  5.             <li><a href="#about" data-icon="info">关于</a></li>
  6.             <li><a href="#contact" data-icon="mail">联系</a></li>
  7.         </ul>
  8.     </div>
  9. </div>
复制代码

标签栏类似于导航栏,但通常用于内容区域的顶部:
  1. <div data-role="tabs">
  2.     <div data-role="navbar">
  3.         <ul>
  4.             <li><a href="#tab1" data-ajax="false">标签1</a></li>
  5.             <li><a href="#tab2" data-ajax="false">标签2</a></li>
  6.             <li><a href="#tab3" data-ajax="false">标签3</a></li>
  7.         </ul>
  8.     </div>
  9.    
  10.     <div id="tab1" class="ui-body-d ui-content">
  11.         <h3>第一个标签内容</h3>
  12.         <p>这是第一个标签的内容。</p>
  13.     </div>
  14.    
  15.     <div id="tab2" class="ui-body-d ui-content">
  16.         <h3>第二个标签内容</h3>
  17.         <p>这是第二个标签的内容。</p>
  18.     </div>
  19.    
  20.     <div id="tab3" class="ui-body-d ui-content">
  21.         <h3>第三个标签内容</h3>
  22.         <p>这是第三个标签的内容。</p>
  23.     </div>
  24. </div>
复制代码

5. 基本UI组件

5.1 按钮

按钮是移动应用中最常用的交互元素之一。jQuery Mobile提供了多种按钮样式和选项:
  1. <a href="#" data-role="button">链接按钮</a>
  2. <button>按钮元素</button>
  3. <input type="button" value="输入按钮">
  4. <input type="submit" value="提交按钮">
  5. <input type="reset" value="重置按钮">
复制代码

默认情况下,按钮会占据整行宽度。使用data-inline="true"可以使按钮只占据必要的宽度:
  1. <a href="#" data-role="button" data-inline="true">按钮1</a>
  2. <a href="#" data-role="button" data-inline="true">按钮2</a>
  3. <a href="#" data-role="button" data-inline="true">按钮3</a>
复制代码

将多个按钮组合在一起:
  1. <div data-role="controlgroup" data-type="horizontal">
  2.     <a href="#" data-role="button">是</a>
  3.     <a href="#" data-role="button">否</a>
  4.     <a href="#" data-role="button">取消</a>
  5. </div>
复制代码
  1. <a href="#" data-role="button" data-icon="delete">删除</a>
  2. <a href="#" data-role="button" data-icon="plus">添加</a>
  3. <a href="#" data-role="button" data-icon="arrow-l">后退</a>
  4. <a href="#" data-role="button" data-icon="arrow-r">前进</a>
  5. <a href="#" data-role="button" data-icon="arrow-u">向上</a>
  6. <a href="#" data-role="button" data-icon="arrow-d">向下</a>
  7. <a href="#" data-role="button" data-icon="gear">设置</a>
  8. <a href="#" data-role="button" data-icon="refresh">刷新</a>
  9. <a href="#" data-role="button" data-icon="check">检查</a>
  10. <a href="#" data-role="button" data-icon="grid">网格</a>
  11. <a href="#" data-role="button" data-icon="star">星标</a>
  12. <a href="#" data-role="button" data-icon="alert">警报</a>
  13. <a href="#" data-role="button" data-icon="info">信息</a>
  14. <a href="#" data-role="button" data-icon="home">首页</a>
  15. <a href="#" data-role="button" data-icon="search">搜索</a>
复制代码
  1. <a href="#" data-role="button" data-icon="delete" data-iconpos="notext"></a>
  2. <a href="#" data-role="button" data-icon="plus" data-iconpos="notext"></a>
  3. <a href="#" data-role="button" data-icon="gear" data-iconpos="notext"></a>
复制代码

5.2 列表视图

列表视图是移动应用中显示数据集合的常用组件。jQuery Mobile提供了丰富的列表样式和功能:
  1. <ul data-role="listview">
  2.     <li><a href="#">苹果</a></li>
  3.     <li><a href="#">香蕉</a></li>
  4.     <li><a href="#">橙子</a></li>
  5.     <li><a href="#">葡萄</a></li>
  6. </ul>
复制代码
  1. <ul data-role="listview">
  2.     <li><a href="#"><img src="images/apple.png" alt="苹果" class="ui-li-icon">苹果</a></li>
  3.     <li><a href="#"><img src="images/banana.png" alt="香蕉" class="ui-li-icon">香蕉</a></li>
  4.     <li><a href="#"><img src="images/orange.png" alt="橙子" class="ui-li-icon">橙子</a></li>
  5.     <li><a href="#"><img src="images/grape.png" alt="葡萄" class="ui-li-icon">葡萄</a></li>
  6. </ul>
复制代码
  1. <ul data-role="listview">
  2.     <li>
  3.         <a href="#">
  4.             <img src="images/apple.jpg" alt="苹果">
  5.             <h2>苹果</h2>
  6.             <p>苹果是一种常见的水果,富含维生素和纤维。</p>
  7.         </a>
  8.     </li>
  9.     <li>
  10.         <a href="#">
  11.             <img src="images/banana.jpg" alt="香蕉">
  12.             <h2>香蕉</h2>
  13.             <p>香蕉富含钾元素,有助于维持心脏健康。</p>
  14.         </a>
  15.     </li>
  16.     <li>
  17.         <a href="#">
  18.             <img src="images/orange.jpg" alt="橙子">
  19.             <h2>橙子</h2>
  20.             <p>橙子含有丰富的维生素C,有助于增强免疫力。</p>
  21.         </a>
  22.     </li>
  23. </ul>
复制代码
  1. <ul data-role="listview" data-split-icon="gear" data-split-theme="d">
  2.     <li>
  3.         <a href="#apple">
  4.             <img src="images/apple.jpg" alt="苹果">
  5.             <h2>苹果</h2>
  6.             <p>苹果是一种常见的水果,富含维生素和纤维。</p>
  7.         </a>
  8.         <a href="#apple-settings" data-rel="popup" data-position-to="window" data-transition="pop">设置</a>
  9.     </li>
  10.     <li>
  11.         <a href="#banana">
  12.             <img src="images/banana.jpg" alt="香蕉">
  13.             <h2>香蕉</h2>
  14.             <p>香蕉富含钾元素,有助于维持心脏健康。</p>
  15.         </a>
  16.         <a href="#banana-settings" data-rel="popup" data-position-to="window" data-transition="pop">设置</a>
  17.     </li>
  18. </ul>
复制代码
  1. <ul data-role="listview" data-autodividers="true">
  2.     <li><a href="#">苹果</a></li>
  3.     <li><a href="#">杏子</a></li>
  4.     <li><a href="#">香蕉</a></li>
  5.     <li><a href="#">蓝莓</a></li>
  6.     <li><a href="#">樱桃</a></li>
  7.     <li><a href="#">橙子</a></li>
  8.     <li><a href="#">葡萄</a></li>
  9. </ul>
复制代码

5.3 表单元素

jQuery Mobile为各种表单元素提供了移动友好的样式和交互:
  1. <div data-role="fieldcontain">
  2.     <label for="name">姓名:</label>
  3.     <input type="text" name="name" id="name" value="" placeholder="请输入您的姓名">
  4. </div>
  5. <div data-role="fieldcontain">
  6.     <label for="email">邮箱:</label>
  7.     <input type="email" name="email" id="email" value="" placeholder="请输入您的邮箱">
  8. </div>
  9. <div data-role="fieldcontain">
  10.     <label for="password">密码:</label>
  11.     <input type="password" name="password" id="password" value="" placeholder="请输入密码">
  12. </div>
  13. <div data-role="fieldcontain">
  14.     <label for="textarea">留言:</label>
  15.     <textarea cols="40" rows="8" name="textarea" id="textarea" placeholder="请输入您的留言"></textarea>
  16. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <label for="search">搜索:</label>
  3.     <input type="search" name="search" id="search" value="" placeholder="搜索内容...">
  4. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <fieldset data-role="controlgroup">
  3.         <legend>性别:</legend>
  4.         <input type="radio" name="gender" id="male" value="male" checked="checked">
  5.         <label for="male">男</label>
  6.         <input type="radio" name="gender" id="female" value="female">
  7.         <label for="female">女</label>
  8.     </fieldset>
  9. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <fieldset data-role="controlgroup">
  3.         <legend>兴趣爱好:</legend>
  4.         <input type="checkbox" name="hobby1" id="hobby1" value="reading">
  5.         <label for="hobby1">阅读</label>
  6.         <input type="checkbox" name="hobby2" id="hobby2" value="sports">
  7.         <label for="hobby2">运动</label>
  8.         <input type="checkbox" name="hobby3" id="hobby3" value="music">
  9.         <label for="hobby3">音乐</label>
  10.     </fieldset>
  11. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <label for="select-choice" class="select">选择国家:</label>
  3.     <select name="select-choice" id="select-choice">
  4.         <option value="china">中国</option>
  5.         <option value="usa">美国</option>
  6.         <option value="uk">英国</option>
  7.         <option value="japan">日本</option>
  8.         <option value="korea">韩国</option>
  9.     </select>
  10. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <label for="slider">音量:</label>
  3.     <input type="range" name="slider" id="slider" value="50" min="0" max="100">
  4. </div>
复制代码
  1. <div data-role="fieldcontain">
  2.     <label for="flip-switch">Wi-Fi:</label>
  3.     <select name="flip-switch" id="flip-switch" data-role="slider">
  4.         <option value="off">关闭</option>
  5.         <option value="on">开启</option>
  6.     </select>
  7. </div>
复制代码

6. 弹窗和对话框

6.1 基本弹窗

弹窗是jQuery Mobile中显示临时信息或收集用户输入的组件:
  1. <!-- 触发弹窗的链接 -->
  2. <a href="#popupBasic" data-rel="popup" data-role="button">显示基本弹窗</a>
  3. <!-- 基本弹窗 -->
  4. <div data-role="popup" id="popupBasic">
  5.     <p>这是一个基本弹窗。</p>
  6. </div>
复制代码

6.2 带有选项的弹窗
  1. <!-- 触发弹窗的链接 -->
  2. <a href="#popupOptions" data-rel="popup" data-role="button">显示选项弹窗</a>
  3. <!-- 带有选项的弹窗 -->
  4. <div data-role="popup" id="popupOptions" data-overlay-theme="b" data-theme="a" data-dismissible="false" style="max-width:400px;">
  5.     <div data-role="header" data-theme="a">
  6.         <h1>删除项目?</h1>
  7.     </div>
  8.     <div data-role="content" data-theme="d">
  9.         <h3>您确定要删除这个项目吗?</h3>
  10.         <p>此操作不可撤销。</p>
  11.         <a href="#" data-role="button" data-inline="true" data-rel="back" data-theme="c">取消</a>
  12.         <a href="#" data-role="button" data-inline="true" data-rel="back" data-transition="flow" data-theme="b">删除</a>
  13.     </div>
  14. </div>
复制代码

6.3 表单弹窗
  1. <!-- 触发弹窗的链接 -->
  2. <a href="#popupLogin" data-rel="popup" data-position-to="window" data-role="button">登录</a>
  3. <!-- 表单弹窗 -->
  4. <div data-role="popup" id="popupLogin" data-theme="a" class="ui-corner-all">
  5.     <form>
  6.         <div style="padding:10px 20px;">
  7.             <h3>请登录</h3>
  8.             <label for="un" class="ui-hidden-accessible">用户名:</label>
  9.             <input type="text" name="user" id="un" value="" placeholder="用户名" data-theme="a">
  10.             <label for="pw" class="ui-hidden-accessible">密码:</label>
  11.             <input type="password" name="pass" id="pw" value="" placeholder="密码" data-theme="a">
  12.             <button type="submit" data-theme="b" data-icon="check">登录</button>
  13.         </div>
  14.     </form>
  15. </div>
复制代码

6.4 对话框页面
  1. <!-- 触发对话框的链接 -->
  2. <a href="#dialogPage" data-rel="dialog" data-transition="pop" data-role="button">显示对话框</a>
  3. <!-- 对话框页面 -->
  4. <div data-role="page" id="dialogPage">
  5.     <div data-role="header" data-theme="d">
  6.         <h1>对话框</h1>
  7.     </div>
  8.     <div data-role="content" data-theme="c">
  9.         <h1>删除确认</h1>
  10.         <p>您确定要删除这条记录吗?</p>
  11.         <a href="#" data-role="button" data-rel="back" data-theme="b" data-icon="check">是</a>
  12.         <a href="#" data-role="button" data-rel="back" data-theme="c" data-icon="delete">否</a>
  13.     </div>
  14. </div>
复制代码

7. 主题和样式定制

7.1 jQuery Mobile主题系统

jQuery Mobile使用字母(a到e)来标识不同的主题样式,每个主题定义了一套颜色和样式。你可以通过设置data-theme属性来应用不同的主题:
  1. <div data-role="page" data-theme="b">
  2.     <div data-role="header" data-theme="a">
  3.         <h1>主题示例</h1>
  4.     </div>
  5.     <div data-role="content">
  6.         <p>这是内容区域。</p>
  7.         <a href="#" data-role="button" data-theme="c">主题C按钮</a>
  8.         <a href="#" data-role="button" data-theme="d">主题D按钮</a>
  9.         <a href="#" data-role="button" data-theme="e">主题E按钮</a>
  10.     </div>
  11.     <div data-role="footer" data-theme="a">
  12.         <h4>页脚</h4>
  13.     </div>
  14. </div>
复制代码

7.2 自定义主题

你可以通过覆盖CSS样式来自定义主题。以下是一个简单的自定义主题示例:
  1. /* 自定义主题F */
  2. .ui-bar-f {
  3.     border: 1px solid #333;
  4.     background: #111;
  5.     color: #fff;
  6.     font-weight: bold;
  7.     text-shadow: 0 -1px 0 #000;
  8.     background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#111));
  9.     background-image: -webkit-linear-gradient(top, #3c3c3c, #111);
  10.     background-image: -moz-linear-gradient(top, #3c3c3c, #111);
  11.     background-image: -ms-linear-gradient(top, #3c3c3c, #111);
  12.     background-image: -o-linear-gradient(top, #3c3c3c, #111);
  13.     background-image: linear-gradient(top, #3c3c3c, #111);
  14. }
  15. .ui-body-f {
  16.     border: 1px solid #444;
  17.     background: #222;
  18.     color: #fff;
  19.     text-shadow: 0 1px 0 #111;
  20.     font-weight: normal;
  21.     background-image: -webkit-gradient(linear, left top, left bottom, from(#444), to(#222));
  22.     background-image: -webkit-linear-gradient(top, #444, #222);
  23.     background-image: -moz-linear-gradient(top, #444, #222);
  24.     background-image: -ms-linear-gradient(top, #444, #222);
  25.     background-image: -o-linear-gradient(top, #444, #222);
  26.     background-image: linear-gradient(top, #444, #222);
  27. }
  28. .ui-btn-up-f {
  29.     border: 1px solid #222;
  30.     background: #333;
  31.     font-weight: bold;
  32.     color: #fff;
  33.     text-shadow: 0 -1px 0 #000;
  34.     background-image: -webkit-gradient(linear, left top, left bottom, from(#555), to(#333));
  35.     background-image: -webkit-linear-gradient(top, #555, #333);
  36.     background-image: -moz-linear-gradient(top, #555, #333);
  37.     background-image: -ms-linear-gradient(top, #555, #333);
  38.     background-image: -o-linear-gradient(top, #555, #333);
  39.     background-image: linear-gradient(top, #555, #333);
  40. }
复制代码

然后在HTML中使用这个自定义主题:
  1. <div data-role="page" data-theme="f">
  2.     <div data-role="header" data-theme="f">
  3.         <h1>自定义主题</h1>
  4.     </div>
  5.     <div data-role="content" data-theme="f">
  6.         <p>这是使用自定义主题F的内容。</p>
  7.         <a href="#" data-role="button" data-theme="f">主题F按钮</a>
  8.     </div>
  9. </div>
复制代码

7.3 使用ThemeRoller

jQuery Mobile提供了一个在线工具ThemeRoller(https://themeroller.jquerymobile.com/),可以可视化的创建和自定义主题。使用ThemeRoller,你可以:

1. 选择预定义的主题作为起点
2. 调整颜色、渐变、字体等属性
3. 实时预览效果
4. 导出自定义主题的CSS文件

8. 响应式设计

8.1 响应式网格系统

jQuery Mobile提供了一个简单的响应式网格系统,可以创建适应不同屏幕尺寸的布局:
  1. <!-- 两列网格 -->
  2. <div class="ui-grid-a">
  3.     <div class="ui-block-a">
  4.         <div class="ui-body ui-body-d">
  5.             <p>第一列</p>
  6.         </div>
  7.     </div>
  8.     <div class="ui-block-b">
  9.         <div class="ui-body ui-body-d">
  10.             <p>第二列</p>
  11.         </div>
  12.     </div>
  13. </div>
  14. <!-- 三列网格 -->
  15. <div class="ui-grid-b">
  16.     <div class="ui-block-a">
  17.         <div class="ui-body ui-body-d">
  18.             <p>第一列</p>
  19.         </div>
  20.     </div>
  21.     <div class="ui-block-b">
  22.         <div class="ui-body ui-body-d">
  23.             <p>第二列</p>
  24.         </div>
  25.     </div>
  26.     <div class="ui-block-c">
  27.         <div class="ui-body ui-body-d">
  28.             <p>第三列</p>
  29.         </div>
  30.     </div>
  31. </div>
  32. <!-- 四列网格 -->
  33. <div class="ui-grid-c">
  34.     <div class="ui-block-a">
  35.         <div class="ui-body ui-body-d">
  36.             <p>第一列</p>
  37.         </div>
  38.     </div>
  39.     <div class="ui-block-b">
  40.         <div class="ui-body ui-body-d">
  41.             <p>第二列</p>
  42.         </div>
  43.     </div>
  44.     <div class="ui-block-c">
  45.         <div class="ui-body ui-body-d">
  46.             <p>第三列</p>
  47.         </div>
  48.     </div>
  49.     <div class="ui-block-d">
  50.         <div class="ui-body ui-body-d">
  51.             <p>第四列</p>
  52.         </div>
  53.     </div>
  54. </div>
  55. <!-- 五列网格 -->
  56. <div class="ui-grid-d">
  57.     <div class="ui-block-a">
  58.         <div class="ui-body ui-body-d">
  59.             <p>第一列</p>
  60.         </div>
  61.     </div>
  62.     <div class="ui-block-b">
  63.         <div class="ui-body ui-body-d">
  64.             <p>第二列</p>
  65.         </div>
  66.     </div>
  67.     <div class="ui-block-c">
  68.         <div class="ui-body ui-body-d">
  69.             <p>第三列</p>
  70.         </div>
  71.     </div>
  72.     <div class="ui-block-d">
  73.         <div class="ui-body ui-body-d">
  74.             <p>第四列</p>
  75.         </div>
  76.     </div>
  77.     <div class="ui-block-e">
  78.         <div class="ui-body ui-body-d">
  79.             <p>第五列</p>
  80.         </div>
  81.     </div>
  82. </div>
复制代码

8.2 响应式表格

jQuery Mobile提供了”列切换”表格模式,可以在小屏幕上隐藏不重要的列:
  1. <table data-role="table" data-mode="columntoggle" class="ui-responsive" id="myTable">
  2.     <thead>
  3.         <tr>
  4.             <th data-priority="1">排名</th>
  5.             <th data-priority="2">球队</th>
  6.             <th data-priority="3">场次</th>
  7.             <th data-priority="4">胜</th>
  8.             <th data-priority="5">平</th>
  9.             <th data-priority="6">负</th>
  10.             <th data-priority="7">积分</th>
  11.         </tr>
  12.     </thead>
  13.     <tbody>
  14.         <tr>
  15.             <th>1</th>
  16.             <td>球队A</td>
  17.             <td>10</td>
  18.             <td>8</td>
  19.             <td>1</td>
  20.             <td>1</td>
  21.             <td>25</td>
  22.         </tr>
  23.         <tr>
  24.             <th>2</th>
  25.             <td>球队B</td>
  26.             <td>10</td>
  27.             <td>7</td>
  28.             <td>2</td>
  29.             <td>1</td>
  30.             <td>23</td>
  31.         </tr>
  32.         <tr>
  33.             <th>3</th>
  34.             <td>球队C</td>
  35.             <td>10</td>
  36.             <td>6</td>
  37.             <td>3</td>
  38.             <td>1</td>
  39.             <td>21</td>
  40.         </tr>
  41.     </tbody>
  42. </table>
复制代码

data-priority属性用于指定列的重要性,数字越小表示越重要。在小屏幕上,用户可以通过一个按钮来选择显示哪些列。

8.3 响应式面板

面板是可以在页面边缘滑入/滑出的容器,适合用于导航或显示辅助信息:
  1. <!-- 触发面板的按钮 -->
  2. <a href="#myPanel" data-role="button">打开面板</a>
  3. <!-- 面板 -->
  4. <div data-role="panel" id="myPanel" data-display="overlay">
  5.     <h2>菜单</h2>
  6.     <p>这里可以放置导航链接或其他内容。</p>
  7.     <ul data-role="listview">
  8.         <li><a href="#home">首页</a></li>
  9.         <li><a href="#about">关于</a></li>
  10.         <li><a href="#contact">联系我们</a></li>
  11.     </ul>
  12.     <a href="#" data-rel="close" data-role="button">关闭面板</a>
  13. </div>
复制代码

面板可以设置不同的显示模式:

• data-display="overlay":面板覆盖在内容上方
• data-display="push":面板推动内容
• data-display="reveal":面板从内容下显示

9. 实际项目案例

9.1 移动待办事项应用

下面是一个简单的移动待办事项应用的完整代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">
  6.     <title>待办事项</title>
  7.     <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  8.     <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  9.     <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
  10.     <style>
  11.         .completed {
  12.             text-decoration: line-through;
  13.             color: #aaa;
  14.         }
  15.         .task-date {
  16.             font-size: 0.8em;
  17.             color: #777;
  18.         }
  19.     </style>
  20. </head>
  21. <body>
  22. <!-- 主页 -->
  23. <div data-role="page" id="home">
  24.     <div data-role="header">
  25.         <h1>我的待办事项</h1>
  26.         <a href="#add-task" data-icon="plus" data-iconpos="notext">添加</a>
  27.     </div>
  28.    
  29.     <div data-role="content">
  30.         <ul data-role="listview" id="task-list" data-filter="true" data-filter-placeholder="搜索任务...">
  31.             <!-- 任务将通过JavaScript动态添加 -->
  32.         </ul>
  33.     </div>
  34.    
  35.     <div data-role="footer" data-position="fixed">
  36.         <div data-role="navbar">
  37.             <ul>
  38.                 <li><a href="#home" data-icon="home" class="ui-btn-active">所有</a></li>
  39.                 <li><a href="#active" data-icon="check">进行中</a></li>
  40.                 <li><a href="#completed" data-icon="star">已完成</a></li>
  41.             </ul>
  42.         </div>
  43.     </div>
  44. </div>
  45. <!-- 进行中页面 -->
  46. <div data-role="page" id="active">
  47.     <div data-role="header">
  48.         <h1>进行中的任务</h1>
  49.         <a href="#home" data-icon="home" data-iconpos="notext">首页</a>
  50.     </div>
  51.    
  52.     <div data-role="content">
  53.         <ul data-role="listview" id="active-task-list" data-filter="true" data-filter-placeholder="搜索任务...">
  54.             <!-- 进行中的任务将通过JavaScript动态添加 -->
  55.         </ul>
  56.     </div>
  57.    
  58.     <div data-role="footer" data-position="fixed">
  59.         <div data-role="navbar">
  60.             <ul>
  61.                 <li><a href="#home" data-icon="home">所有</a></li>
  62.                 <li><a href="#active" data-icon="check" class="ui-btn-active">进行中</a></li>
  63.                 <li><a href="#completed" data-icon="star">已完成</a></li>
  64.             </ul>
  65.         </div>
  66.     </div>
  67. </div>
  68. <!-- 已完成页面 -->
  69. <div data-role="page" id="completed">
  70.     <div data-role="header">
  71.         <h1>已完成的任务</h1>
  72.         <a href="#home" data-icon="home" data-iconpos="notext">首页</a>
  73.     </div>
  74.    
  75.     <div data-role="content">
  76.         <ul data-role="listview" id="completed-task-list" data-filter="true" data-filter-placeholder="搜索任务...">
  77.             <!-- 已完成的任务将通过JavaScript动态添加 -->
  78.         </ul>
  79.     </div>
  80.    
  81.     <div data-role="footer" data-position="fixed">
  82.         <div data-role="navbar">
  83.             <ul>
  84.                 <li><a href="#home" data-icon="home">所有</a></li>
  85.                 <li><a href="#active" data-icon="check">进行中</a></li>
  86.                 <li><a href="#completed" data-icon="star" class="ui-btn-active">已完成</a></li>
  87.             </ul>
  88.         </div>
  89.     </div>
  90. </div>
  91. <!-- 添加任务页面 -->
  92. <div data-role="page" id="add-task">
  93.     <div data-role="header">
  94.         <h1>添加新任务</h1>
  95.         <a href="#home" data-icon="back" data-iconpos="notext">返回</a>
  96.     </div>
  97.    
  98.     <div data-role="content">
  99.         <form id="task-form">
  100.             <div data-role="fieldcontain">
  101.                 <label for="task-title">任务标题:</label>
  102.                 <input type="text" name="task-title" id="task-title" placeholder="输入任务标题">
  103.             </div>
  104.             
  105.             <div data-role="fieldcontain">
  106.                 <label for="task-description">任务描述:</label>
  107.                 <textarea name="task-description" id="task-description" placeholder="输入任务描述"></textarea>
  108.             </div>
  109.             
  110.             <div data-role="fieldcontain">
  111.                 <label for="task-date">截止日期:</label>
  112.                 <input type="date" name="task-date" id="task-date">
  113.             </div>
  114.             
  115.             <div data-role="fieldcontain">
  116.                 <label for="task-priority">优先级:</label>
  117.                 <select name="task-priority" id="task-priority">
  118.                     <option value="low">低</option>
  119.                     <option value="medium" selected>中</option>
  120.                     <option value="high">高</option>
  121.                 </select>
  122.             </div>
  123.             
  124.             <button type="submit" data-theme="b">添加任务</button>
  125.         </form>
  126.     </div>
  127. </div>
  128. <script>
  129. // 任务数据
  130. var tasks = [
  131.     {
  132.         id: 1,
  133.         title: "学习jQuery Mobile",
  134.         description: "完成jQuery Mobile教程的学习",
  135.         date: "2023-12-31",
  136.         priority: "high",
  137.         completed: false
  138.     },
  139.     {
  140.         id: 2,
  141.         title: "购买生日礼物",
  142.         description: "为朋友挑选生日礼物",
  143.         date: "2023-12-15",
  144.         priority: "medium",
  145.         completed: false
  146.     },
  147.     {
  148.         id: 3,
  149.         title: "回复邮件",
  150.         description: "回复客户询问的邮件",
  151.         date: "2023-12-10",
  152.         priority: "high",
  153.         completed: true
  154.     }
  155. ];
  156. // 渲染任务列表
  157. function renderTasks() {
  158.     // 渲染所有任务
  159.     var allTasksHtml = '';
  160.     var activeTasksHtml = '';
  161.     var completedTasksHtml = '';
  162.    
  163.     tasks.forEach(function(task) {
  164.         var priorityIcon = task.priority === 'high' ? 'alert' : (task.priority === 'medium' ? 'info' : 'check');
  165.         var priorityClass = task.priority === 'high' ? 'high-priority' : (task.priority === 'medium' ? 'medium-priority' : 'low-priority');
  166.         var completedClass = task.completed ? 'completed' : '';
  167.         
  168.         var taskHtml = '<li data-icon="false" class="' + priorityClass + ' ' + completedClass + '">';
  169.         taskHtml += '<a href="#" data-task-id="' + task.id + '" class="task-toggle">';
  170.         taskHtml += '<h2>' + task.title + '</h2>';
  171.         taskHtml += '<p>' + task.description + '</p>';
  172.         taskHtml += '<p class="task-date">截止日期: ' + task.date + '</p>';
  173.         taskHtml += '<span class="ui-li-count ui-btn-up-' + (task.priority === 'high' ? 'e' : (task.priority === 'medium' ? 'b' : 'c')) + '">';
  174.         taskHtml += '<span class="ui-icon ui-icon-' + priorityIcon + '"></span>';
  175.         taskHtml += '</span>';
  176.         taskHtml += '</a>';
  177.         taskHtml += '<a href="#" data-task-id="' + task.id + '" class="task-delete" data-icon="delete">删除</a>';
  178.         taskHtml += '</li>';
  179.         
  180.         allTasksHtml += taskHtml;
  181.         
  182.         if (task.completed) {
  183.             completedTasksHtml += taskHtml;
  184.         } else {
  185.             activeTasksHtml += taskHtml;
  186.         }
  187.     });
  188.    
  189.     $('#task-list').html(allTasksHtml).listview('refresh');
  190.     $('#active-task-list').html(activeTasksHtml).listview('refresh');
  191.     $('#completed-task-list').html(completedTasksHtml).listview('refresh');
  192. }
  193. // 添加新任务
  194. $('#task-form').on('submit', function(e) {
  195.     e.preventDefault();
  196.    
  197.     var newTask = {
  198.         id: tasks.length > 0 ? Math.max.apply(Math, tasks.map(function(t) { return t.id; })) + 1 : 1,
  199.         title: $('#task-title').val(),
  200.         description: $('#task-description').val(),
  201.         date: $('#task-date').val(),
  202.         priority: $('#task-priority').val(),
  203.         completed: false
  204.     };
  205.    
  206.     tasks.push(newTask);
  207.     renderTasks();
  208.    
  209.     // 重置表单并返回主页
  210.     this.reset();
  211.     $.mobile.changePage('#home');
  212. });
  213. // 切换任务完成状态
  214. $(document).on('click', '.task-toggle', function(e) {
  215.     e.preventDefault();
  216.    
  217.     var taskId = parseInt($(this).data('task-id'));
  218.     var task = tasks.find(function(t) { return t.id === taskId; });
  219.    
  220.     if (task) {
  221.         task.completed = !task.completed;
  222.         renderTasks();
  223.     }
  224. });
  225. // 删除任务
  226. $(document).on('click', '.task-delete', function(e) {
  227.     e.preventDefault();
  228.    
  229.     var taskId = parseInt($(this).data('task-id'));
  230.     tasks = tasks.filter(function(t) { return t.id !== taskId; });
  231.     renderTasks();
  232. });
  233. // 初始化
  234. $(document).on('pageinit', function() {
  235.     renderTasks();
  236. });
  237. </script>
  238. </body>
  239. </html>
复制代码

这个待办事项应用包含以下功能:

• 添加新任务,包括标题、描述、截止日期和优先级
• 查看所有任务、进行中的任务和已完成的任务
• 标记任务为完成或未完成
• 删除任务
• 搜索任务
• 根据优先级显示不同的图标和颜色

9.2 移动新闻阅读应用

下面是一个简单的移动新闻阅读应用的完整代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">
  6.     <title>新闻阅读器</title>
  7.     <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  8.     <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  9.     <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
  10.     <style>
  11.         .news-date {
  12.             font-size: 0.8em;
  13.             color: #777;
  14.         }
  15.         .news-category {
  16.             font-size: 0.8em;
  17.             font-weight: bold;
  18.             color: #3388cc;
  19.         }
  20.         .news-content img {
  21.             max-width: 100%;
  22.             height: auto;
  23.         }
  24.         .news-content p {
  25.             text-align: justify;
  26.         }
  27.     </style>
  28. </head>
  29. <body>
  30. <!-- 新闻列表页面 -->
  31. <div data-role="page" id="news-list">
  32.     <div data-role="header">
  33.         <h1>新闻阅读器</h1>
  34.         <a href="#settings" data-icon="gear" data-iconpos="notext">设置</a>
  35.     </div>
  36.    
  37.     <div data-role="content">
  38.         <div data-role="collapsible-set" data-inset="false">
  39.             <div data-role="collapsible" data-collapsed="false">
  40.                 <h2>头条新闻</h2>
  41.                 <ul data-role="listview" id="headline-news">
  42.                     <!-- 头条新闻将通过JavaScript动态添加 -->
  43.                 </ul>
  44.             </div>
  45.             
  46.             <div data-role="collapsible">
  47.                 <h2>科技新闻</h2>
  48.                 <ul data-role="listview" id="tech-news">
  49.                     <!-- 科技新闻将通过JavaScript动态添加 -->
  50.                 </ul>
  51.             </div>
  52.             
  53.             <div data-role="collapsible">
  54.                 <h2>体育新闻</h2>
  55.                 <ul data-role="listview" id="sports-news">
  56.                     <!-- 体育新闻将通过JavaScript动态添加 -->
  57.                 </ul>
  58.             </div>
  59.             
  60.             <div data-role="collapsible">
  61.                 <h2>娱乐新闻</h2>
  62.                 <ul data-role="listview" id="entertainment-news">
  63.                     <!-- 娱乐新闻将通过JavaScript动态添加 -->
  64.                 </ul>
  65.             </div>
  66.         </div>
  67.     </div>
  68.    
  69.     <div data-role="footer" data-position="fixed">
  70.         <div data-role="navbar">
  71.             <ul>
  72.                 <li><a href="#news-list" data-icon="grid" class="ui-btn-active">新闻</a></li>
  73.                 <li><a href="#favorites" data-icon="star">收藏</a></li>
  74.                 <li><a href="#about" data-icon="info">关于</a></li>
  75.             </ul>
  76.         </div>
  77.     </div>
  78. </div>
  79. <!-- 新闻详情页面 -->
  80. <div data-role="page" id="news-detail">
  81.     <div data-role="header">
  82.         <h1>新闻详情</h1>
  83.         <a href="#news-list" data-icon="back" data-iconpos="notext">返回</a>
  84.     </div>
  85.    
  86.     <div data-role="content" id="news-content">
  87.         <!-- 新闻内容将通过JavaScript动态添加 -->
  88.     </div>
  89.    
  90.     <div data-role="footer" data-position="fixed">
  91.         <div data-role="navbar">
  92.             <ul>
  93.                 <li><a href="#" id="favorite-btn" data-icon="star">收藏</a></li>
  94.                 <li><a href="#" id="share-btn" data-icon="action">分享</a></li>
  95.                 <li><a href="#" id="comment-btn" data-icon="comment">评论</a></li>
  96.             </ul>
  97.         </div>
  98.     </div>
  99. </div>
  100. <!-- 收藏页面 -->
  101. <div data-role="page" id="favorites">
  102.     <div data-role="header">
  103.         <h1>我的收藏</h1>
  104.         <a href="#news-list" data-icon="back" data-iconpos="notext">返回</a>
  105.     </div>
  106.    
  107.     <div data-role="content">
  108.         <ul data-role="listview" id="favorites-list">
  109.             <!-- 收藏的新闻将通过JavaScript动态添加 -->
  110.         </ul>
  111.         <div id="no-favorites" style="text-align: center; display: none;">
  112.             <p>暂无收藏的新闻</p>
  113.         </div>
  114.     </div>
  115.    
  116.     <div data-role="footer" data-position="fixed">
  117.         <div data-role="navbar">
  118.             <ul>
  119.                 <li><a href="#news-list" data-icon="grid">新闻</a></li>
  120.                 <li><a href="#favorites" data-icon="star" class="ui-btn-active">收藏</a></li>
  121.                 <li><a href="#about" data-icon="info">关于</a></li>
  122.             </ul>
  123.         </div>
  124.     </div>
  125. </div>
  126. <!-- 设置页面 -->
  127. <div data-role="page" id="settings">
  128.     <div data-role="header">
  129.         <h1>设置</h1>
  130.         <a href="#news-list" data-icon="back" data-iconpos="notext">返回</a>
  131.     </div>
  132.    
  133.     <div data-role="content">
  134.         <div data-role="fieldcontain">
  135.             <label for="font-size">字体大小:</label>
  136.             <select name="font-size" id="font-size">
  137.                 <option value="small">小</option>
  138.                 <option value="medium" selected>中</option>
  139.                 <option value="large">大</option>
  140.             </select>
  141.         </div>
  142.         
  143.         <div data-role="fieldcontain">
  144.             <label for="theme">主题:</label>
  145.             <select name="theme" id="theme">
  146.                 <option value="a">黑色</option>
  147.                 <option value="b" selected>蓝色</option>
  148.                 <option value="c">灰色</option>
  149.             </select>
  150.         </div>
  151.         
  152.         <div data-role="fieldcontain">
  153.             <label for="auto-refresh">自动刷新:</label>
  154.             <select name="auto-refresh" id="auto-refresh" data-role="slider">
  155.                 <option value="off">关闭</option>
  156.                 <option value="on">开启</option>
  157.             </select>
  158.         </div>
  159.         
  160.         <div data-role="fieldcontain">
  161.             <fieldset data-role="controlgroup">
  162.                 <legend>新闻类别:</legend>
  163.                 <input type="checkbox" name="category-headline" id="category-headline" checked>
  164.                 <label for="category-headline">头条</label>
  165.                 <input type="checkbox" name="category-tech" id="category-tech" checked>
  166.                 <label for="category-tech">科技</label>
  167.                 <input type="checkbox" name="category-sports" id="category-sports" checked>
  168.                 <label for="category-sports">体育</label>
  169.                 <input type="checkbox" name="category-entertainment" id="category-entertainment" checked>
  170.                 <label for="category-entertainment">娱乐</label>
  171.             </fieldset>
  172.         </div>
  173.         
  174.         <button type="button" id="save-settings" data-theme="b">保存设置</button>
  175.     </div>
  176. </div>
  177. <!-- 关于页面 -->
  178. <div data-role="page" id="about">
  179.     <div data-role="header">
  180.         <h1>关于</h1>
  181.         <a href="#news-list" data-icon="back" data-iconpos="notext">返回</a>
  182.     </div>
  183.    
  184.     <div data-role="content">
  185.         <h2>新闻阅读器 v1.0</h2>
  186.         <p>这是一个基于jQuery Mobile开发的移动新闻阅读应用。</p>
  187.         <p>功能特点:</p>
  188.         <ul>
  189.             <li>分类浏览新闻</li>
  190.             <li>收藏新闻</li>
  191.             <li>自定义设置</li>
  192.             <li>响应式设计</li>
  193.         </ul>
  194.         <p>© 2023 新闻阅读器 版权所有</p>
  195.     </div>
  196.    
  197.     <div data-role="footer" data-position="fixed">
  198.         <div data-role="navbar">
  199.             <ul>
  200.                 <li><a href="#news-list" data-icon="grid">新闻</a></li>
  201.                 <li><a href="#favorites" data-icon="star">收藏</a></li>
  202.                 <li><a href="#about" data-icon="info" class="ui-btn-active">关于</a></li>
  203.             </ul>
  204.         </div>
  205.     </div>
  206. </div>
  207. <script>
  208. // 模拟新闻数据
  209. var newsData = {
  210.     headline: [
  211.         {
  212.             id: 1,
  213.             title: "全球科技峰会召开,探讨人工智能未来发展",
  214.             summary: "来自世界各地的科技专家齐聚一堂,共同探讨人工智能的未来发展方向和挑战。",
  215.             content: "<p>来自世界各地的科技专家齐聚一堂,共同探讨人工智能的未来发展方向和挑战。</p><p>本次峰会为期三天,将围绕人工智能的伦理问题、技术突破、产业应用等多个方面展开深入讨论。</p><p>与会专家普遍认为,人工智能将在未来十年内深刻改变人类的生活方式和工作模式。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/da5549efc66a4f2a.webp' alt='科技峰会'><p>各国政府代表也表示将加强对人工智能领域的投入,推动相关产业的发展。</p>",
  216.             date: "2023-12-01",
  217.             category: "headline"
  218.         },
  219.         {
  220.             id: 2,
  221.             title: "国际气候变化大会达成新协议",
  222.             summary: "经过两周的激烈谈判,各国代表就减少碳排放达成新的国际协议。",
  223.             content: "<p>经过两周的激烈谈判,各国代表就减少碳排放达成新的国际协议。</p><p>根据新协议,发达国家承诺在2030年前将碳排放量减少50%,发展中国家也将根据自身情况制定减排目标。</p><p>这一协议被认为是应对气候变化的重要一步,得到了环保组织的广泛欢迎。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/88ea1233fe9c4350.webp' alt='气候变化大会'><p>然而,也有批评者认为协议缺乏强制执行机制,实际效果有待观察。</p>",
  224.             date: "2023-11-28",
  225.             category: "headline"
  226.         }
  227.     ],
  228.     tech: [
  229.         {
  230.             id: 3,
  231.             title: "新一代智能手机发布,搭载革命性处理器",
  232.             summary: "科技巨头发布新一代智能手机,搭载自主研发的革命性处理器,性能提升50%。",
  233.             content: "<p>科技巨头发布新一代智能手机,搭载自主研发的革命性处理器,性能提升50%。</p><p>这款新处理器采用5纳米工艺制造,集成了150亿个晶体管,在保持低功耗的同时大幅提升了计算能力。</p><p>除了处理器,新手机还配备了更先进的摄像头系统和更长的电池续航时间。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/6c43d3410b6a4200.webp' alt='新智能手机'><p>分析师预计,这款新手机将在高端智能手机市场占据重要地位。</p>",
  234.             date: "2023-11-25",
  235.             category: "tech"
  236.         },
  237.         {
  238.             id: 4,
  239.             title: "量子计算机取得重大突破",
  240.             summary: "研究团队成功开发出更稳定的量子计算机,为实用化迈出重要一步。",
  241.             content: "<p>研究团队成功开发出更稳定的量子计算机,为实用化迈出重要一步。</p><p>新型量子计算机采用了创新的量子纠错技术,大幅提高了量子比特的稳定性,使计算错误率降低了90%。</p><p>这一突破意味着量子计算机在解决复杂问题上的能力将得到显著提升,有望在药物研发、材料科学等领域发挥重要作用。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/1b7b8801aa7a484a.webp' alt='量子计算机'><p>不过,专家表示,量子计算机的完全商业化还需要5到10年的时间。</p>",
  242.             date: "2023-11-20",
  243.             category: "tech"
  244.         }
  245.     ],
  246.     sports: [
  247.         {
  248.             id: 5,
  249.             title: "国家足球队晋级世界杯决赛圈",
  250.             summary: "经过激烈角逐,国家足球队成功晋级世界杯决赛圈,时隔20年再次进入世界杯。",
  251.             content: "<p>经过激烈角逐,国家足球队成功晋级世界杯决赛圈,时隔20年再次进入世界杯。</p><p>在最后一场预选赛中,国家队以2:0战胜对手,以小组第二的身份晋级。</p><p>全队上下表现出色,特别是年轻球员的发挥令人印象深刻,为球队注入了新的活力。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/b425b1849fb147ec.webp' alt='足球比赛'><p>球迷们对球队在世界杯上的表现充满期待,希望球队能创造历史。</p>",
  252.             date: "2023-11-22",
  253.             category: "sports"
  254.         },
  255.         {
  256.             id: 6,
  257.             title: "网球公开赛落幕,新星夺冠",
  258.             summary: "在备受瞩目的网球公开赛决赛中,20岁的新星选手击败卫冕冠军,夺得个人首个大满贯冠军。",
  259.             content: "<p>在备受瞩目的网球公开赛决赛中,20岁的新星选手击败卫冕冠军,夺得个人首个大满贯冠军。</p><p>这场比赛持续了3小时45分钟,双方展现出极高的技术水平,最终新星选手以3:2的比分险胜。</p><p>这位年轻选手在过去一年中进步神速,世界排名从100名之外上升到前20,此次夺冠更是证明了他的实力。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/4ebfe822739646ec.webp' alt='网球比赛'><p>赛后,他表示这只是开始,未来会继续努力,争取更多荣誉。</p>",
  260.             date: "2023-11-18",
  261.             category: "sports"
  262.         }
  263.     ],
  264.     entertainment: [
  265.         {
  266.             id: 7,
  267.             title: "年度电影颁奖典礼举行,《追梦人》获最佳影片",
  268.             summary: "在备受瞩目的年度电影颁奖典礼上,《追梦人》击败众多强劲对手,荣获最佳影片奖。",
  269.             content: "<p>在备受瞩目的年度电影颁奖典礼上,《追梦人》击败众多强劲对手,荣获最佳影片奖。</p><p>这部影片讲述了一个关于坚持梦想的感人故事,自上映以来获得了观众和评论家的一致好评。</p><p>除了最佳影片奖,《追梦人》还获得了最佳导演和最佳男主角两项大奖,成为本届颁奖典礼的最大赢家。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/5a5c2cacc4fd4320.webp' alt='电影颁奖'><p>导演在获奖感言中表示,这个奖项属于所有为电影付出努力的人,特别是那些相信梦想的人。</p>",
  270.             date: "2023-11-15",
  271.             category: "entertainment"
  272.         },
  273.         {
  274.             id: 8,
  275.             title: "流行音乐天后发布新专辑,创销售纪录",
  276.             summary: "流行音乐天后时隔三年发布新专辑,首周销量突破500万张,创下了近年来的销售纪录。",
  277.             content: "<p>流行音乐天后时隔三年发布新专辑,首周销量突破500万张,创下了近年来的销售纪录。</p><p>这张专辑融合了多种音乐风格,展现了歌手在音乐上的新尝试和突破,获得了乐迷的热烈追捧。</p><p>专辑中的多首歌曲迅速登上各大音乐排行榜榜首,其中主打歌《重生》更是成为社交媒体上的热门话题。</p><img src='https://io.pixtech.org/pixtech/forum/202509/11/fd74cbe68c854ed5.webp' alt='音乐专辑'><p>歌手表示,这张专辑是她个人经历和感悟的真实表达,希望听众能从中获得力量和启发。</p>",
  278.             date: "2023-11-10",
  279.             category: "entertainment"
  280.         }
  281.     ]
  282. };
  283. // 收藏的新闻ID
  284. var favoriteNewsIds = [];
  285. // 当前查看的新闻
  286. var currentNews = null;
  287. // 渲染新闻列表
  288. function renderNewsLists() {
  289.     // 渲染头条新闻
  290.     var headlineHtml = '';
  291.     newsData.headline.forEach(function(news) {
  292.         headlineHtml += '<li><a href="#" data-news-id="' + news.id + '" data-category="headline">';
  293.         headlineHtml += '<h2>' + news.title + '</h2>';
  294.         headlineHtml += '<p>' + news.summary + '</p>';
  295.         headlineHtml += '<p class="news-date">' + news.date + '</p>';
  296.         headlineHtml += '</a></li>';
  297.     });
  298.     $('#headline-news').html(headlineHtml).listview('refresh');
  299.    
  300.     // 渲染科技新闻
  301.     var techHtml = '';
  302.     newsData.tech.forEach(function(news) {
  303.         techHtml += '<li><a href="#" data-news-id="' + news.id + '" data-category="tech">';
  304.         techHtml += '<h2>' + news.title + '</h2>';
  305.         techHtml += '<p>' + news.summary + '</p>';
  306.         techHtml += '<p class="news-date">' + news.date + '</p>';
  307.         techHtml += '</a></li>';
  308.     });
  309.     $('#tech-news').html(techHtml).listview('refresh');
  310.    
  311.     // 渲染体育新闻
  312.     var sportsHtml = '';
  313.     newsData.sports.forEach(function(news) {
  314.         sportsHtml += '<li><a href="#" data-news-id="' + news.id + '" data-category="sports">';
  315.         sportsHtml += '<h2>' + news.title + '</h2>';
  316.         sportsHtml += '<p>' + news.summary + '</p>';
  317.         sportsHtml += '<p class="news-date">' + news.date + '</p>';
  318.         sportsHtml += '</a></li>';
  319.     });
  320.     $('#sports-news').html(sportsHtml).listview('refresh');
  321.    
  322.     // 渲染娱乐新闻
  323.     var entertainmentHtml = '';
  324.     newsData.entertainment.forEach(function(news) {
  325.         entertainmentHtml += '<li><a href="#" data-news-id="' + news.id + '" data-category="entertainment">';
  326.         entertainmentHtml += '<h2>' + news.title + '</h2>';
  327.         entertainmentHtml += '<p>' + news.summary + '</p>';
  328.         entertainmentHtml += '<p class="news-date">' + news.date + '</p>';
  329.         entertainmentHtml += '</a></li>';
  330.     });
  331.     $('#entertainment-news').html(entertainmentHtml).listview('refresh');
  332. }
  333. // 渲染收藏列表
  334. function renderFavoritesList() {
  335.     var favoritesHtml = '';
  336.     var hasFavorites = false;
  337.    
  338.     // 遍历所有新闻类别
  339.     Object.keys(newsData).forEach(function(category) {
  340.         newsData[category].forEach(function(news) {
  341.             if (favoriteNewsIds.includes(news.id)) {
  342.                 hasFavorites = true;
  343.                 favoritesHtml += '<li><a href="#" data-news-id="' + news.id + '" data-category="' + category + '">';
  344.                 favoritesHtml += '<h2>' + news.title + '</h2>';
  345.                 favoritesHtml += '<p>' + news.summary + '</p>';
  346.                 favoritesHtml += '<p class="news-date">' + news.date + '</p>';
  347.                 favoritesHtml += '<span class="news-category">' + getCategoryName(category) + '</span>';
  348.                 favoritesHtml += '</a></li>';
  349.             }
  350.         });
  351.     });
  352.    
  353.     if (hasFavorites) {
  354.         $('#favorites-list').html(favoritesHtml).listview('refresh');
  355.         $('#no-favorites').hide();
  356.     } else {
  357.         $('#favorites-list').html('');
  358.         $('#no-favorites').show();
  359.     }
  360. }
  361. // 获取类别名称
  362. function getCategoryName(category) {
  363.     var categoryNames = {
  364.         'headline': '头条',
  365.         'tech': '科技',
  366.         'sports': '体育',
  367.         'entertainment': '娱乐'
  368.     };
  369.     return categoryNames[category] || category;
  370. }
  371. // 显示新闻详情
  372. function showNewsDetail(newsId, category) {
  373.     var news = newsData[category].find(function(n) { return n.id === parseInt(newsId); });
  374.    
  375.     if (news) {
  376.         currentNews = news;
  377.         
  378.         var contentHtml = '<h2>' + news.title + '</h2>';
  379.         contentHtml += '<p class="news-category">' + getCategoryName(category) + '</p>';
  380.         contentHtml += '<p class="news-date">' + news.date + '</p>';
  381.         contentHtml += '<div class="news-content">' + news.content + '</div>';
  382.         
  383.         $('#news-content').html(contentHtml);
  384.         
  385.         // 更新收藏按钮状态
  386.         if (favoriteNewsIds.includes(news.id)) {
  387.             $('#favorite-btn').text('取消收藏');
  388.         } else {
  389.             $('#favorite-btn').text('收藏');
  390.         }
  391.         
  392.         $.mobile.changePage('#news-detail');
  393.     }
  394. }
  395. // 切换收藏状态
  396. function toggleFavorite() {
  397.     if (currentNews) {
  398.         var index = favoriteNewsIds.indexOf(currentNews.id);
  399.         
  400.         if (index === -1) {
  401.             // 添加到收藏
  402.             favoriteNewsIds.push(currentNews.id);
  403.             $('#favorite-btn').text('取消收藏');
  404.         } else {
  405.             // 从收藏中移除
  406.             favoriteNewsIds.splice(index, 1);
  407.             $('#favorite-btn').text('收藏');
  408.         }
  409.         
  410.         // 保存到本地存储
  411.         localStorage.setItem('favoriteNewsIds', JSON.stringify(favoriteNewsIds));
  412.     }
  413. }
  414. // 保存设置
  415. function saveSettings() {
  416.     var fontSize = $('#font-size').val();
  417.     var theme = $('#theme').val();
  418.     var autoRefresh = $('#auto-refresh').val();
  419.    
  420.     // 应用字体大小
  421.     var newsContent = $('#news-content');
  422.     newsContent.removeClass('small-font medium-font large-font');
  423.     newsContent.addClass(fontSize + '-font');
  424.    
  425.     // 应用主题
  426.     $('div[data-role="page"]').attr('data-theme', theme);
  427.     $('div[data-role="header"]').attr('data-theme', theme);
  428.     $('div[data-role="footer"]').attr('data-theme', theme);
  429.    
  430.     // 保存到本地存储
  431.     var settings = {
  432.         fontSize: fontSize,
  433.         theme: theme,
  434.         autoRefresh: autoRefresh
  435.     };
  436.     localStorage.setItem('appSettings', JSON.stringify(settings));
  437.    
  438.     // 显示保存成功消息
  439.     $('<div>').simpledialog2({
  440.         mode: 'blank',
  441.         headerText: '提示',
  442.         headerClose: true,
  443.         blankContent:
  444.             "<p>设置已保存</p>" +
  445.             "<a rel='close' data-role='button' href='#'>确定</a>"
  446.     });
  447. }
  448. // 加载设置
  449. function loadSettings() {
  450.     var settingsStr = localStorage.getItem('appSettings');
  451.    
  452.     if (settingsStr) {
  453.         var settings = JSON.parse(settingsStr);
  454.         
  455.         // 应用设置
  456.         $('#font-size').val(settings.fontSize);
  457.         $('#theme').val(settings.theme);
  458.         $('#auto-refresh').val(settings.autoRefresh).slider('refresh');
  459.         
  460.         // 应用字体大小
  461.         var newsContent = $('#news-content');
  462.         newsContent.addClass(settings.fontSize + '-font');
  463.         
  464.         // 应用主题
  465.         $('div[data-role="page"]').attr('data-theme', settings.theme);
  466.         $('div[data-role="header"]').attr('data-theme', settings.theme);
  467.         $('div[data-role="footer"]').attr('data-theme', settings.theme);
  468.     }
  469.    
  470.     // 加载收藏
  471.     var favoritesStr = localStorage.getItem('favoriteNewsIds');
  472.     if (favoritesStr) {
  473.         favoriteNewsIds = JSON.parse(favoritesStr);
  474.     }
  475. }
  476. // 事件处理
  477. $(document).on('pageinit', '#news-list', function() {
  478.     renderNewsLists();
  479. });
  480. $(document).on('pageinit', '#favorites', function() {
  481.     renderFavoritesList();
  482. });
  483. $(document).on('pageinit', '#settings', function() {
  484.     loadSettings();
  485. });
  486. $(document).on('click', '#headline-news a, #tech-news a, #sports-news a, #entertainment-news a, #favorites-list a', function(e) {
  487.     e.preventDefault();
  488.     var newsId = $(this).data('news-id');
  489.     var category = $(this).data('category');
  490.     showNewsDetail(newsId, category);
  491. });
  492. $(document).on('click', '#favorite-btn', function(e) {
  493.     e.preventDefault();
  494.     toggleFavorite();
  495. });
  496. $(document).on('click', '#share-btn', function(e) {
  497.     e.preventDefault();
  498.     $('<div>').simpledialog2({
  499.         mode: 'blank',
  500.         headerText: '分享',
  501.         headerClose: true,
  502.         blankContent:
  503.             "<p>分享功能开发中...</p>" +
  504.             "<a rel='close' data-role='button' href='#'>确定</a>"
  505.     });
  506. });
  507. $(document).on('click', '#comment-btn', function(e) {
  508.     e.preventDefault();
  509.     $('<div>').simpledialog2({
  510.         mode: 'blank',
  511.         headerText: '评论',
  512.         headerClose: true,
  513.         blankContent:
  514.             "<p>评论功能开发中...</p>" +
  515.             "<a rel='close' data-role='button' href='#'>确定</a>"
  516.     });
  517. });
  518. $(document).on('click', '#save-settings', function(e) {
  519.     e.preventDefault();
  520.     saveSettings();
  521. });
  522. // 添加字体大小样式
  523. $('<style>')
  524.     .text('.small-font { font-size: 14px; } .medium-font { font-size: 16px; } .large-font { font-size: 18px; }')
  525.     .appendTo('head');
  526. </script>
  527. </body>
  528. </html>
复制代码

这个新闻阅读应用包含以下功能:

• 分类浏览新闻(头条、科技、体育、娱乐)
• 查看新闻详情
• 收藏新闻
• 自定义设置(字体大小、主题等)
• 响应式设计,适应不同屏幕尺寸

10. 高级技巧和最佳实践

10.1 性能优化
  1. <!-- 延迟加载图片 -->
  2. <img src="placeholder.jpg" data-src="actual-image.jpg" class="lazy-load">
  3. <script>
  4. $(document).on('pageinit', function() {
  5.     // 当页面可见时加载图片
  6.     $(document).on('pageshow', function() {
  7.         $('.lazy-load').each(function() {
  8.             var $img = $(this);
  9.             $img.attr('src', $img.data('src')).removeClass('lazy-load');
  10.         });
  11.     });
  12. });
  13. </script>
复制代码
  1. <!-- 预加载下一页 -->
  2. <a href="next-page.html" data-prefetch>下一页</a>
  3. <!-- 预渲染页面 -->
  4. <div data-role="page" id="home" data-dom-cache="true">
  5.     <!-- 页面内容 -->
  6. </div>
复制代码
  1. <!-- 使用虚拟滚动处理长列表 -->
  2. <ul data-role="listview" data-inset="true" data-filter="true" id="long-list">
  3.     <!-- 列表项将通过JavaScript动态添加 -->
  4. </ul>
  5. <script>
  6. $(document).on('pageinit', function() {
  7.     var listData = []; // 假设这是你的大数据集
  8.     var pageSize = 20; // 每页显示的项目数
  9.     var currentPage = 0;
  10.    
  11.     function renderListPage() {
  12.         var start = currentPage * pageSize;
  13.         var end = start + pageSize;
  14.         var pageData = listData.slice(start, end);
  15.         
  16.         var html = '';
  17.         pageData.forEach(function(item) {
  18.             html += '<li><a href="#">' + item.name + '</a></li>';
  19.         });
  20.         
  21.         if (currentPage === 0) {
  22.             $('#long-list').html(html).listview('refresh');
  23.         } else {
  24.             $('#long-list').append(html).listview('refresh');
  25.         }
  26.     }
  27.    
  28.     // 初始加载
  29.     renderListPage();
  30.    
  31.     // 滚动到底部时加载更多
  32.     $(document).on('scrollstop', function() {
  33.         if ($(window).scrollTop() + $(window).height() >= $(document).height() - 100) {
  34.             currentPage++;
  35.             if (currentPage * pageSize < listData.length) {
  36.                 renderListPage();
  37.             }
  38.         }
  39.     });
  40. });
  41. </script>
复制代码

10.2 与后端API集成
  1. <div data-role="page" id="api-page">
  2.     <div data-role="header">
  3.         <h1>API数据示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <ul data-role="listview" id="api-data">
  8.             <li>加载数据中...</li>
  9.         </ul>
  10.     </div>
  11. </div>
  12. <script>
  13. $(document).on('pageinit', '#api-page', function() {
  14.     // 显示加载指示器
  15.     $.mobile.loading('show', {
  16.         text: '加载数据中...',
  17.         textVisible: true,
  18.         theme: 'a',
  19.         html: ""
  20.     });
  21.    
  22.     // 使用AJAX获取数据
  23.     $.ajax({
  24.         url: 'https://api.example.com/data',
  25.         type: 'GET',
  26.         dataType: 'json',
  27.         success: function(data) {
  28.             var html = '';
  29.             data.items.forEach(function(item) {
  30.                 html += '<li><a href="#">' + item.title + '</a></li>';
  31.             });
  32.             
  33.             $('#api-data').html(html).listview('refresh');
  34.             
  35.             // 隐藏加载指示器
  36.             $.mobile.loading('hide');
  37.         },
  38.         error: function(xhr, status, error) {
  39.             $('#api-data').html('<li>加载数据失败: ' + error + '</li>').listview('refresh');
  40.             
  41.             // 隐藏加载指示器
  42.             $.mobile.loading('hide');
  43.         }
  44.     });
  45. });
  46. </script>
复制代码
  1. <div data-role="page" id="jsonp-page">
  2.     <div data-role="header">
  3.         <h1>JSONP示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <ul data-role="listview" id="jsonp-data">
  8.             <li>加载数据中...</li>
  9.         </ul>
  10.     </div>
  11. </div>
  12. <script>
  13. $(document).on('pageinit', '#jsonp-page', function() {
  14.     // 显示加载指示器
  15.     $.mobile.loading('show', {
  16.         text: '加载数据中...',
  17.         textVisible: true,
  18.         theme: 'a',
  19.         html: ""
  20.     });
  21.    
  22.     // 使用JSONP获取跨域数据
  23.     $.ajax({
  24.         url: 'https://api.example.com/data',
  25.         type: 'GET',
  26.         dataType: 'jsonp',
  27.         jsonp: 'callback',
  28.         success: function(data) {
  29.             var html = '';
  30.             data.items.forEach(function(item) {
  31.                 html += '<li><a href="#">' + item.title + '</a></li>';
  32.             });
  33.             
  34.             $('#jsonp-data').html(html).listview('refresh');
  35.             
  36.             // 隐藏加载指示器
  37.             $.mobile.loading('hide');
  38.         },
  39.         error: function(xhr, status, error) {
  40.             $('#jsonp-data').html('<li>加载数据失败: ' + error + '</li>').listview('refresh');
  41.             
  42.             // 隐藏加载指示器
  43.             $.mobile.loading('hide');
  44.         }
  45.     });
  46. });
  47. </script>
复制代码

10.3 本地存储
  1. <div data-role="page" id="storage-page">
  2.     <div data-role="header">
  3.         <h1>本地存储示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <div data-role="fieldcontain">
  8.             <label for="storage-input">输入数据:</label>
  9.             <input type="text" name="storage-input" id="storage-input" value="">
  10.         </div>
  11.         
  12.         <button type="button" id="save-data" data-theme="b">保存数据</button>
  13.         <button type="button" id="load-data" data-theme="c">加载数据</button>
  14.         <button type="button" id="clear-data" data-theme="e">清除数据</button>
  15.         
  16.         <div id="storage-result" style="margin-top: 20px;"></div>
  17.     </div>
  18. </div>
  19. <script>
  20. $(document).on('pageinit', '#storage-page', function() {
  21.     // 保存数据
  22.     $('#save-data').on('click', function() {
  23.         var data = $('#storage-input').val();
  24.         if (data) {
  25.             localStorage.setItem('myData', data);
  26.             $('#storage-result').html('<p>数据已保存: ' + data + '</p>');
  27.         } else {
  28.             $('#storage-result').html('<p>请输入要保存的数据</p>');
  29.         }
  30.     });
  31.    
  32.     // 加载数据
  33.     $('#load-data').on('click', function() {
  34.         var data = localStorage.getItem('myData');
  35.         if (data) {
  36.             $('#storage-input').val(data);
  37.             $('#storage-result').html('<p>已加载数据: ' + data + '</p>');
  38.         } else {
  39.             $('#storage-result').html('<p>没有找到保存的数据</p>');
  40.         }
  41.     });
  42.    
  43.     // 清除数据
  44.     $('#clear-data').on('click', function() {
  45.         localStorage.removeItem('myData');
  46.         $('#storage-input').val('');
  47.         $('#storage-result').html('<p>数据已清除</p>');
  48.     });
  49. });
  50. </script>
复制代码
  1. <div data-role="page" id="session-storage-page">
  2.     <div data-role="header">
  3.         <h1>会话存储示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <div data-role="fieldcontain">
  8.             <label for="session-input">输入临时数据:</label>
  9.             <input type="text" name="session-input" id="session-input" value="">
  10.         </div>
  11.         
  12.         <button type="button" id="save-session-data" data-theme="b">保存数据</button>
  13.         <button type="button" id="load-session-data" data-theme="c">加载数据</button>
  14.         
  15.         <div id="session-result" style="margin-top: 20px;"></div>
  16.         
  17.         <p style="margin-top: 20px; font-size: 0.9em; color: #777;">
  18.             注意:会话存储的数据在浏览器关闭后会自动清除。
  19.         </p>
  20.     </div>
  21. </div>
  22. <script>
  23. $(document).on('pageinit', '#session-storage-page', function() {
  24.     // 保存数据
  25.     $('#save-session-data').on('click', function() {
  26.         var data = $('#session-input').val();
  27.         if (data) {
  28.             sessionStorage.setItem('mySessionData', data);
  29.             $('#session-result').html('<p>数据已保存: ' + data + '</p>');
  30.         } else {
  31.             $('#session-result').html('<p>请输入要保存的数据</p>');
  32.         }
  33.     });
  34.    
  35.     // 加载数据
  36.     $('#load-session-data').on('click', function() {
  37.         var data = sessionStorage.getItem('mySessionData');
  38.         if (data) {
  39.             $('#session-input').val(data);
  40.             $('#session-result').html('<p>已加载数据: ' + data + '</p>');
  41.         } else {
  42.             $('#session-result').html('<p>没有找到保存的数据</p>');
  43.         }
  44.     });
  45. });
  46. </script>
复制代码

10.4 设备API集成
  1. <div data-role="page" id="geolocation-page">
  2.     <div data-role="header">
  3.         <h1>地理位置示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <button type="button" id="get-location" data-theme="b">获取当前位置</button>
  8.         
  9.         <div id="location-result" style="margin-top: 20px;">
  10.             <p>点击按钮获取您的位置信息</p>
  11.         </div>
  12.         
  13.         <div id="map-container" style="width: 100%; height: 300px; margin-top: 20px; display: none;">
  14.             <!-- 地图将在这里显示 -->
  15.         </div>
  16.     </div>
  17. </div>
  18. <script>
  19. $(document).on('pageinit', '#geolocation-page', function() {
  20.     $('#get-location').on('click', function() {
  21.         if (navigator.geolocation) {
  22.             // 显示加载指示器
  23.             $.mobile.loading('show', {
  24.                 text: '获取位置中...',
  25.                 textVisible: true,
  26.                 theme: 'a',
  27.                 html: ""
  28.             });
  29.             
  30.             navigator.geolocation.getCurrentPosition(
  31.                 // 成功回调
  32.                 function(position) {
  33.                     var latitude = position.coords.latitude;
  34.                     var longitude = position.coords.longitude;
  35.                     var accuracy = position.coords.accuracy;
  36.                     
  37.                     var resultHtml = '<p><strong>纬度:</strong> ' + latitude + '</p>';
  38.                     resultHtml += '<p><strong>经度:</strong> ' + longitude + '</p>';
  39.                     resultHtml += '<p><strong>精确度:</strong> ' + accuracy + ' 米</p>';
  40.                     
  41.                     $('#location-result').html(resultHtml);
  42.                     
  43.                     // 显示地图(这里使用静态图片作为示例)
  44.                     var mapUrl = 'https://maps.googleapis.com/maps/api/staticmap?center=' + latitude + ',' + longitude + '&zoom=15&size=400x300&markers=color:red%7C' + latitude + ',' + longitude;
  45.                     $('#map-container').html('<img src="' + mapUrl + '" alt="地图" style="width: 100%;">').show();
  46.                     
  47.                     // 隐藏加载指示器
  48.                     $.mobile.loading('hide');
  49.                 },
  50.                 // 错误回调
  51.                 function(error) {
  52.                     var errorMessage = '';
  53.                     switch(error.code) {
  54.                         case error.PERMISSION_DENIED:
  55.                             errorMessage = "用户拒绝了地理位置请求。";
  56.                             break;
  57.                         case error.POSITION_UNAVAILABLE:
  58.                             errorMessage = "位置信息不可用。";
  59.                             break;
  60.                         case error.TIMEOUT:
  61.                             errorMessage = "请求位置信息超时。";
  62.                             break;
  63.                         case error.UNKNOWN_ERROR:
  64.                             errorMessage = "发生未知错误。";
  65.                             break;
  66.                     }
  67.                     
  68.                     $('#location-result').html('<p style="color: red;">错误: ' + errorMessage + '</p>');
  69.                     
  70.                     // 隐藏加载指示器
  71.                     $.mobile.loading('hide');
  72.                 },
  73.                 // 选项
  74.                 {
  75.                     enableHighAccuracy: true,
  76.                     timeout: 10000,
  77.                     maximumAge: 60000
  78.                 }
  79.             );
  80.         } else {
  81.             $('#location-result').html('<p style="color: red;">您的浏览器不支持地理位置功能。</p>');
  82.         }
  83.     });
  84. });
  85. </script>
复制代码
  1. <div data-role="page" id="camera-page">
  2.     <div data-role="header">
  3.         <h1>相机示例</h1>
  4.     </div>
  5.    
  6.     <div data-role="content">
  7.         <button type="button" id="take-photo" data-theme="b">拍照</button>
  8.         <button type="button" id="choose-photo" data-theme="c">从相册选择</button>
  9.         
  10.         <div id="photo-result" style="margin-top: 20px;">
  11.             <img id="captured-photo" style="max-width: 100%; display: none;" alt="拍摄的照片">
  12.         </div>
  13.     </div>
  14. </div>
  15. <script>
  16. $(document).on('pageinit', '#camera-page', function() {
  17.     // 拍照
  18.     $('#take-photo').on('click', function() {
  19.         if (navigator.camera) {
  20.             navigator.camera.getPicture(
  21.                 // 成功回调
  22.                 function(imageData) {
  23.                     $('#captured-photo').attr('src', 'data:image/jpeg;base64,' + imageData).show();
  24.                 },
  25.                 // 错误回调
  26.                 function(message) {
  27.                     alert('拍照失败: ' + message);
  28.                 },
  29.                 // 选项
  30.                 {
  31.                     quality: 50,
  32.                     destinationType: Camera.DestinationType.DATA_URL,
  33.                     sourceType: Camera.PictureSourceType.CAMERA,
  34.                     encodingType: Camera.EncodingType.JPEG,
  35.                     targetWidth: 800,
  36.                     targetHeight: 600
  37.                 }
  38.             );
  39.         } else {
  40.             alert('您的设备不支持相机功能,或未安装Cordova插件。');
  41.         }
  42.     });
  43.    
  44.     // 从相册选择
  45.     $('#choose-photo').on('click', function() {
  46.         if (navigator.camera) {
  47.             navigator.camera.getPicture(
  48.                 // 成功回调
  49.                 function(imageData) {
  50.                     $('#captured-photo').attr('src', 'data:image/jpeg;base64,' + imageData).show();
  51.                 },
  52.                 // 错误回调
  53.                 function(message) {
  54.                     alert('选择照片失败: ' + message);
  55.                 },
  56.                 // 选项
  57.                 {
  58.                     quality: 50,
  59.                     destinationType: Camera.DestinationType.DATA_URL,
  60.                     sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
  61.                     encodingType: Camera.EncodingType.JPEG,
  62.                     targetWidth: 800,
  63.                     targetHeight: 600
  64.                 }
  65.             );
  66.         } else {
  67.             alert('您的设备不支持相册功能,或未安装Cordova插件。');
  68.         }
  69.     });
  70. });
  71. </script>
复制代码

11. 总结与进阶学习

jQuery Mobile是一个强大而灵活的移动应用开发框架,它使开发者能够快速创建跨平台的移动应用。通过本教程,你已经学习了jQuery Mobile的基础知识,包括:

• 基本页面结构和导航
• 各种UI组件的使用
• 表单和数据处理
• 主题和样式定制
• 响应式设计
• 实际项目案例
• 高级技巧和最佳实践

11.1 进阶学习资源

要进一步提高你的jQuery Mobile技能,可以参考以下资源:

1. 官方文档:jQuery Mobile官方网站(https://jquerymobile.com/)提供了最权威和最新的文档、示例和API参考。
2. jQuery Mobile API参考:深入学习jQuery Mobile的各种API和配置选项。
3. jQuery Mobile主题定制:学习如何使用ThemeRoller创建自定义主题。
4. Cordova/PhoneGap集成:了解如何将jQuery Mobile应用打包为原生移动应用。
5. 响应式设计进阶:学习更高级的响应式设计技巧,使你的应用在各种设备上都能完美显示。

官方文档:jQuery Mobile官方网站(https://jquerymobile.com/)提供了最权威和最新的文档、示例和API参考。

jQuery Mobile API参考:深入学习jQuery Mobile的各种API和配置选项。

jQuery Mobile主题定制:学习如何使用ThemeRoller创建自定义主题。

Cordova/PhoneGap集成:了解如何将jQuery Mobile应用打包为原生移动应用。

响应式设计进阶:学习更高级的响应式设计技巧,使你的应用在各种设备上都能完美显示。

11.2 社区和支持

加入jQuery Mobile社区可以获得帮助和支持:

• Stack Overflow:在Stack Overflow上提问和回答jQuery Mobile相关问题。
• jQuery论坛:官方论坛是获取帮助和分享经验的好地方。
• GitHub:jQuery Mobile的GitHub仓库(https://github.com/jquery/jquery-mobile)是报告问题和贡献代码的地方。

11.3 未来发展方向

随着移动技术的发展,jQuery Mobile也在不断演进。关注以下趋势可以帮助你保持竞争力:

1. 性能优化:随着移动设备性能的提升,用户对应用性能的要求也越来越高。学习如何优化jQuery Mobile应用的性能是一个重要方向。
2. 渐进式Web应用(PWA):将jQuery Mobile应用转变为PWA,可以提供类似原生应用的用户体验。
3. 与现代框架集成:学习如何将jQuery Mobile与React、Vue等现代前端框架结合使用。
4. 无障碍访问:确保你的应用对所有用户都可用,包括那些有视觉、听觉或其他障碍的用户。

性能优化:随着移动设备性能的提升,用户对应用性能的要求也越来越高。学习如何优化jQuery Mobile应用的性能是一个重要方向。

渐进式Web应用(PWA):将jQuery Mobile应用转变为PWA,可以提供类似原生应用的用户体验。

与现代框架集成:学习如何将jQuery Mobile与React、Vue等现代前端框架结合使用。

无障碍访问:确保你的应用对所有用户都可用,包括那些有视觉、听觉或其他障碍的用户。

通过不断学习和实践,你将从jQuery Mobile新手成长为高手,能够创建出功能强大、用户体验优秀的移动应用。祝你在jQuery Mobile的学习之路上取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则