本章以实例介绍在JQuery Mobile中使用page控件的方法。page控件不仅是JQuery Mobile中非常重要的控件,更是必不可少的控件。虽然用法简单,却能反映出程序员对编码理解的深度。
本章还将介绍利用原生JQuery提高页面交互性的例子。主要知识点包括:
简单的hello页面:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <!--重点所在--> <title>测试设备的分辨率</title> <link rel="stylesheet" href="jquery.mobile.min.css" /> <!--Jquery Mobile样式文件--> <!--引用JQuery脚本--> <script src="../jquery-3.5.1.min.js"></script> <!--引入JQuery Mobile脚本--> <script src="../jquery.mobile-1.4.5.min.js"></script> </head> <body> <div data-role="page"> <!--此处为页面控件--> hello shenziyi <!--在空间中插入内容hello shenziyi--> </div> </body> </html>
程序运行结果如下:
闪光灯代码:(利用JQuery不断切换页面的背景颜色)
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"> <title>不断闪动的页面 </title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ var i=0; //声明标志变量i setInterval(function(){ if(i==0) { //将所有div标签的背景颜色改为黄色 $("div").css("background-color","black"); i=1; }else { $("div").css("background-color","white"); i=0; } },100); }); </script> </head> <body> <!--为page控件加入主题、默认为黑色--> <div data-role="page" data-theme="a"> </div> </body> </html>
(效果图为动态不方便展示)
程序在页面加载完成之后开启setInterval()计数器,其中100表示计数器运行间隔为100ms,设置一个临时变量i记录当前状态。$(“div”)选择了页面中的所有div标签,由于该页面只有一个div,因此选中了page控件,然后利用css改变页面属性。
也可以使用JQuery来修改page的主题属性:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>使用JQuery Mobile主题的闪光灯 </title> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ var i=0; setInterval(function(){ if(i==0) { $("div").attr("data-theme","a"); i=1; }else { $("div").attr("data-theme","b"); alert($("div").attr("data-theme"));//在主题被修改后用对话框弹出当前主题名称 i=0; } },100); }); </script> </head> <body> <div data-role="page" data-theme="b"> </div> </body> </html>
运行结果如下所示:
我们可以看到page主题改变了但是页面颜色没有发生变化,是因为在页面加载时,JQuery会搜索页面中所有data-role为page的元素并对其加载相应的主题,之后如果不重复运行加载脚本,那么无论元素的属性如何变化,页面上显示是不会变化的。当然也可以在文件中重新添加加载的脚本。
作为一款真正具有使用价值的应用,首先应该至少有两个界面,通过页面的切换来实现更多的交互。在JQuery Mobile中页面的切换是通过链接实现的。JQuery Mobile为了使开发者能够创造出更好的交互性,提供了十种不同的切换效果。
示例:JQuery Mobile中的场景切换
<!DOCTYPE html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>不断闪动的页面 </title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <!--使用默认切换方式,效果为渐显--> <a href="E:/API Cloud/chapter4/html/demo.html" data-role="button">页面间的切换</a> <!-- data-transition="fade" 定义切换方式渐显--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="fade" data-direction="reverse">fade</a> <!-- data-transition="pop" 定义切换方式扩散--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="pop" data-direction="reverse">pop</a> <!-- data-transition="flip" 定义切换方式展开--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="flip" data-direction="reverse">flip</a> <!-- data-transition="turn" 定义切换方式翻转覆盖--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="turn" data-direction="reverse">turn</a> <!-- data-transition="flow" 定义切换方式扩散覆盖--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="flow" data-direction="reverse">flow</a> <!-- data-transition="slidefade" 定义切换方式滑动渐显--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="slidefade" >slidefade</a> <!-- data-transition="slide" 定义切换方式滑动--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="slide" data-direction="reverse">slide</a> <!-- data-transition="slidedown" 定义切换方式向下滑动--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="slidedown" >slidedown</a> <!-- data-transition="slideup" 定义切换方式向上滑动--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="slideup" >slideup</a> <!-- data-transition="none" 定义切换方式“无"--> <a data-role="button" href="E:/API Cloud/chapter4/html/demo.html" data-transition="none" data-direction="reverse">none</a> </div> </body> </html>
除此之外还需要一个页面demo.html:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"> <title>不断闪动的页面 </title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <h1>19-计算机类-严伟</h1> <h1>20-软件-林昊天</h1> <h1>21-人文-沈子怡</h1> </div> </body> </html>
运行效果如下所示:
编辑四个文件,分别为main.html,confirm.html,result.html,question.html。
游戏开始页面main.html:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>游戏开始</title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <a href="question.html" data-role="button" data-rel="dialog">游戏开始</a> </div> </body> </html>
result.html:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>老实交代!你到底是不是弱智!</title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <h1>早点承认不就好了么,何必这么麻烦!</h1> </div> </body> </html>
question.html:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>老实交代!你到底是不是弱智!</title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <h1>老实交代!你到底是不是弱智!</h1> <a href="result.html" data-role="button">这你都知道!!!!</a> <a href="confirm.html" data-role="button" data-rel="dialog">死不承认!</a> </div> </body> </html>
confirm.html:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>老实交代!你到底是不是弱智!</title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <!--<script type="text/javascript" src="cordova.js"></script>--> </head> <body> <div data-role="page"> <h1>老实交代!你到底是不是弱智!</h1> <a href="result.html" data-role="button">我承认,我是</a> <a href="question.html" data-role="button" data-rel="dialog">我不是!</a> </div> </body> </html>
代码如下:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=2"/> <title>游戏开始</title> <!--jQuery Mobile样式文件--> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ alert("警告!你的手机已被入侵"); setInterval(function(){ //使用计时器 alert("警告!你的手机已被入侵"); },3000); //设置间隔为三秒,注意这里不要把间隔设的太短,否则在PC上测试时无法关闭浏览器 }); </script> </head> <body> <div data-role="page" data-theme="a"> <!--这里面可以再加一点内容,比如说:hello world --> </div> </body> </html>
前面的内容介绍了在页面中使用page控件的方法,也介绍了如何通过设置主题来让页面拥有不同的颜色,但很多时候,还需要更加绚丽的方式。直接使用CSS设置背景图片是一个很好的方法,可是会造成页面加载缓慢。这时可以用CSS的渐变效果,实现如下:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> <style> .background-gradient { background-image:-webkit-gradient( linear,left bottom,left top, color-stop(0.22,rgb(12,12,12)), color-stop(0.57,rgb(153,168,192)), color-stop(0.84,rgb(23,45,67)) ); background-image:-moz-linear-gradient( 90deg, rgb(12,12,12), rgb(153,168,192), rgb(23,45,67) ); } </style> </head> <body> <div data-role="page" class="background-gradient"> hello,沈子怡 </div> </body> </html>
效果如下:
可以看出,页面中实现了背景的渐变,在JQuery Mobile中只要可以使用背景的地方就可以使用渐变,如按钮、列表等。渐变的主要方式主要分为线性渐变和放射性渐变,本例使用的渐变就是线性渐变。
1.5 中介绍了一种可利用JavaScript实现的对话框,但是随着JQuery Mobile新版本的出现,又有一些原生的对话框效果可供选择:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> </head> <body> <div data-role="page"> <a href="#popupBasic" data-rel="popup" data-role="button">请点击按钮</a> <div data-role="popup" id="popupBasic"> <p>这是一个新的对话框</p> </div> </div> </body> </html>
效果如下:
data-role="popup"属性将div标签以及其中的内容声明为一个对话框的样式,通过属性id="popupBasic"为它设置了id。
href="#popupBasic"指定了该按钮的作用是打开id为popupBasic的对话框。另外,为了使按钮能够打开对话框,还要为按钮加入属性data-rel=“popup”。
同样也可以使用data-transition来定义对话框弹出的样式。
上一节介绍了新的对话框使用方法,但是显然这样的对话框只能作为一种提示符来使用,无法满足开发需求。但是事实上对话框有许多高级属性。在下例中体现:
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>对话框的高级属性</title> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> </head> <body> <div data-role="page"> <div data-role="header"> <h1>对话框的高技属性</h1> </div> <div data-role="content"> <a href="#popupCloseRight" data-rel="popup" data-role="button">右边关闭</a> <a href="#popupCloseLeft" data-rel="popup" data-role="button">左边关闭</a> <a href="#popupUndismissible" data-rel="popup" data-role="button" >禁用关闭</a> <a href="#popupCloseRight1" data-rel="popup" data-role="button">另一种右边关闭</a> <a href="#popupCloseLeft1" data-rel="popup" data-role="button">另一种左边关闭</a> <a href="#popupUndismissible1" data-rel="popup" data-role="button" >另一种禁用关闭</a> <div data-role="popup" id="popupCloseRight" class="ui-content" style="max-width:280px"> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <p>点击右侧的叉叉可以关闭对话框</p> </div> <div data-role="popup" id="popupCloseLeft" class="ui-content" style="max-width:280px"> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-left">Close</a> <p>点击左侧的叉叉可以关闭对话框</p> </div> <div data-role="popup" id="popupUndismissible" class="ui-content" style="max-width:280px" data-dismissible="false"> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-left">Close</a> <p>点击屏幕的空白区域无法关闭</p> </div> <div data-role="popup" id="popupCloseRight1" class="ui-content" style="max-width:280px"> <div data-role="header" data-theme="a" class="ui-corner-top"> <h1>空白标题</h1> </div> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <p>点击右侧的叉叉可以关闭对话框</p> </div> <div data-role="popup" id="popupCloseLeft1" class="ui-content" style="max-width:280px"> <div data-role="header" data-theme="a" class="ui-corner-top"> <h1>空白标题</h1> </div> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-left">Close</a> <p>点击左侧的叉叉可以关闭对话框</p> </div> <div data-role="popup" id="popupUndismissible1" class="ui-content" style="max-width:280px" data-dismissible="false"> <div data-role="header" data-theme="a" class="ui-corner-top"> <h1>这是一个对话框的标题</h1> </div> <a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-left">Close</a> <p>点击屏幕的空白区域无法关闭</p> </div> </div> </div> </body> </html>
效果如下:
依次单击页面上六个按钮会出现不同的界面。通过观察发现,新的对话框相比之前增加了一个关闭键和顶部标题。在JQuery Mobile中非常容易实现这样的效果。
<a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a>
该语句实际上定义了一个按钮,关于实现按钮的方法将在后面详解。可改变属性class="ui-btn-right"为class="ui-btn-left"使按钮位置作为对话框的左上角。
带有属性data-dismissible="false"就不能依靠点击屏幕的空白区域取消。
<div data-role="header" data-theme="a" class="ui-corner-top"> <h1>空白标题</h1> </div>
这段代码使得对话框多一个标题栏。使用了头部栏的一些样式。
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="stylesheet" href="../css/jquery.mobile.min.css" /> <script src="../script/jquery-2.1.4.min.js"></script> <script src="../script/jquery.mobile.min.js"></script> </head> <body> <div data-role="page"> <a href="#popup_1" data-rel="popup" data-position-to="window"> <img src="p1.jpg" style="width:49%"> </a> <a href="#popup_2" data-rel="popup" data-position-to="window"> <img src="p2.jpg" style="width:49%"> </a> <a href="#popup_3" data-rel="popup" data-position-to="window"> <img src="p3.jpg" style="width:49%"> </a> <a href="#popup_4" data-rel="popup" data-position-to="window"> <img src="p4.jpg" style="width:49%"> </a> <a href="#popup_5" data-rel="popup" data-position-to="window"> <img src="p5.jpg" style="width:49%"> </a> <a href="#popup_6" data-rel="popup"> <img src="p6.jpg" style="width:49%"> </a> <div data-role="popup" id="popup_1"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p1.jpg" style="max-height:512px;"> </div> <div data-role="popup" id="popup_2"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p2.jpg" style="max-height:512px;" alt="Sydney, Australia"> </div> <div data-role="popup" id="popup_3"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p3.jpg" style="max-height:512px;" alt="New York, USA"> </div> <div data-role="popup" id="popup_4"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p4.jpg" style="max-height:512px;"> </div> <div data-role="popup" id="popup_5"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p5.jpg" style="max-height:512px;" alt="Sydney, Australia"> </div> <div data-role="popup" id="popup_6"> <a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a> <img src="p6.jpg" style="max-height:512px;" alt="New York, USA"> </div> </div> </body> </html>
单击页面中某张图片,该图片会以对话框的形式放大显示,如下所示:
<a href="#popup_1" data-rel="popup" data-position-to="window"> <img src="p1.jpg" style="width:49%"> </a>
该代码段展示了页面中一个图片的显示,利用一个a标签将图片包裹其中,使得图片具有了按钮的某些功能。
data-position-to="window"使弹出的对话框位于屏幕正中,而不是位于呼出这个对话框的按钮附近。