页面部分的介绍基本结束。有了框架之后,我们要考虑的页面中的数据通信和交互。jQuery Mobile(JQM)使用了JavaScript与框架通信以及进行内容管理的API。
1.文档事件
- (document).bind('mobileinit', function() { </span></span></li><li class=""><span> // Initialization code here </span></li><li class="alt"><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(‘mobileinit’, function() { // Initialization code here });mobileinit事件会在jQueryMobile框架载入内存之后,UI元素被渲染之前触发,可以使用它来改变一些UI全局选项。
JQM文档事件的执行顺序通常是:mobileinit - ready - load
放置位置:jQuery.js之后,jQueryMobile.js之前。
- <head>
- <meta charset=“utf-8” />
- <title>My first jQuery Mobile code</title>
- <link rel=“stylesheet” href=“http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css” />
- <script src=“http://code.jquery.com/jquery-1.6.4.min.js”></script>
- <script>$(document).bind(<span style=“background-color: rgb(51, 204, 255);”>“mobileinit”</span>, function() {
- // Our initialization code here
- });
- <script>
- <script src=“http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js”></script>
- <!– CUSTOM INITIALIZATION CODE –>
- <script src=“customcode.js”></script>
- <meta name=“viewport” content=“width=device-width, initial-scale=1”>
- </head>
<head> <meta charset="utf-8" /> <title>My first jQuery Mobile code</title> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css" /> <script src="http://code.jquery.com/jquery-1.6.4.min.js"></script> <script>$(document).bind(<span style="background-color: rgb(51, 204, 255);">"mobileinit"</span>, function() { // Our initialization code here }); <script> <script src="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js"></script> <!-- CUSTOM INITIALIZATION CODE --> <script src="customcode.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> </head>
2.配置( .mobile代替jQuery中的 ).mobile.<widget_name>.prototype用于访问相应的原型。例如.mobile.page.prototype.options可用于定义应用到每个页面实例(data-role=”page”)的默认属性。这些设置全局或部件默认属性的设置要放在mobileinit事件中。
2.1全局配置
用户界面配置:
- (document).bind("mobileinit", function() { </span></span></li><li class=""><span> // We change default values </span></li><li class="alt"><span> $<span class="attribute">.mobile.defaultPageTransition</span><span> = </span><span class="attribute-value">"fade"</span><span>; </span></span></li><li class=""><span> $<span class="attribute">.mobile.minScrollBack</span><span> = </span><span class="attribute-value">150</span><span>; </span></span></li><li class="alt"><span> $<span class="attribute">.mobile.activeBtnClass</span><span> = </span><span class="attribute-value">"active-button"</span><span>; </span></span></li><li class=""><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(“mobileinit”, function() { // We change default values
.mobile.defaultPageTransition=“fade”;
.mobile.minScrollBack = 150; $.mobile.activeBtnClass = “active-button”; });
minScrollBack默认页面最小滚动值为250像素高。
activePageClass/activeBtnClass修改当前活动页面或激活按钮的类名。
命名空间和Ajax功能:- (document).bind("mobileinit", function() { </span></span></li><li class=""><span> // We change default values </span></li><li class="alt"><span> $<span class="attribute">.mobile.ns</span><span> = </span><span class="attribute-value">"firt"</span><span>; </span></span></li><li class=""><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(“mobileinit”, function() { // We change default values $.mobile.ns = “firt”; });为了避免框架间的冲突,可以使用ns全局属性来定义一个命名空间。例如上式使用后,页面模板就会变成:
- <div data-firt-role=“page”>
- <div data-firt-role=“header” data-firt-theme=“a”>
- </div>
- <div data-firt-role=“content”>
- </div>
- </div>
<div data-firt-role="page"> <div data-firt-role="header" data-firt-theme="a"> </div> <div data-firt-role="content"> </div> </div>
如果定义了命名空间,则需要手动修改CSS文件(包括结构和主题文件)以便识别。
$.mobile.ajaxEnabled = false:禁用所有Ajax功能,所有外部页面将通过浏览器使用完整的HTTP请求加载。
默认情况下,XMLHttpRequest不支持跨域请求,但是可以通过$.mobile.allowCrossDomainPages=true来开启跨域。
本地化字符串
使用Ajax加载外部页面时显示的加载消息、外部页面无法加载时的加载错误消息以及一些其他基于组件的消息。
下面是各个消息的列表及默认值:
- // Global strings
- <span class="attribute">.mobile.loadingMessage</span><span> = </span><span class="attribute-value">"loading"</span><span>; </span></span></li><li class="alt"><span><script type="math/tex" id="MathJax-Element-7">.mobile.loadingMessage = "loading";
- </script>.mobile.pageLoadErrorMessage = “Error Loading Page”;
- // 组件字符串
- <span class="attribute">.mobile.page.prototype.options.backBtnText</span><span> = </span><span class="attribute-value">"Back"</span><span>; </span></span></li><li class="alt"><span><script type="math/tex" id="MathJax-Element-8">.mobile.page.prototype.options.backBtnText = "Back";
- </script>.mobile.dialog.prototype.options.closeBtnText = “Close”
- <span class="attribute">.mobile.collapsible.prototype.options.expandCueText</span><span> = </span></span></li><li class="alt"><span> <span class="attribute-value">" click to expand contents"</span><span>; </span></span></li><li class=""><span><script type="math/tex" id="MathJax-Element-9">.mobile.collapsible.prototype.options.expandCueText =
- " click to expand contents";
- </script>.mobile.collapsible.prototype.options. collapseCueText = “ click to collapse contents”;
- <span class="attribute">.mobile.listview.prototype.options.filterPlaceholder</span><span> = </span><span class="attribute-value">"Filter items..."</span><span>; </span></span></li><li class=""><span><script type="math/tex" id="MathJax-Element-10">.mobile.listview.prototype.options.filterPlaceholder = "Filter items...";
- </script>.mobile.selectmenu.prototype.options.closeText = “Close”;
创建一个类似的中文版本的JQM文本方案:// Global strings $.mobile.loadingMessage = "loading"; $.mobile.pageLoadErrorMessage = "Error Loading Page"; // 组件字符串 $.mobile.page.prototype.options.backBtnText = "Back"; $.mobile.dialog.prototype.options.closeBtnText = "Close" $.mobile.collapsible.prototype.options.expandCueText = " click to expand contents"; $.mobile.collapsible.prototype.options. collapseCueText = " click to collapse contents"; $.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; $.mobile.selectmenu.prototype.options.closeText = "Close";
- (document).bind('mobileinit', function() { </span></span></li><li class=""><span> // Global strings </span></li><li class="alt"><span> $<span class="attribute">.mobile.loadingMessage</span><span> = </span><span class="attribute-value">"正在加载"</span><span>; </span></span></li><li class=""><span> $<span class="attribute">.mobile.pageLoadErrorMessage</span><span> = </span><span class="attribute-value">"加载页面出错"</span><span>; </span></span></li><li class="alt"><span> </span></li><li class=""><span> // Widget strings </span></li><li class="alt"><span> $<span class="attribute">.mobile.page.prototype.options.backBtnText</span><span> = </span><span class="attribute-value">"后退"</span><span>; </span></span></li><li class=""><span> $<span class="attribute">.mobile.dialog.prototype.options.closeBtnText</span><span> = </span><span class="attribute-value">"关闭"</span><span> </span></span></li><li class="alt"><span> $<span class="attribute">.mobile.collapsible.prototype.options.expandCueText</span><span> = </span><span class="attribute-value">"点击展开"</span><span>; </span></span></li><li class=""><span> $.mobile.collapsible.prototype.options. <span class="attribute">collapseCueText</span><span> = </span><span class="attribute-value">" 点击收起 "</span><span>; </span></span></li><li class="alt"><span> $<span class="attribute">.mobile.listview.prototype.options.filterPlaceholder</span><span> = </span><span class="attribute-value">" 过滤 "</span><span>; </span></span></li><li class=""><span> $<span class="attribute">.mobile.selectmenu.prototype.options.closeText</span><span> = </span><span class="attribute-value">" 关闭 "</span><span>; </span></span></li><li class="alt"><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(‘mobileinit’, function() { // Global strings
.mobile.loadingMessage=“正在加载”;
.mobile.pageLoadErrorMessage = “加载页面出错”; // Widget strings
.mobile.page.prototype.options.backBtnText=“后退”;
.mobile.dialog.prototype.options.closeBtnText = “关闭”
.mobile.collapsible.prototype.options.expandCueText=“点击展开”;
.mobile.collapsible.prototype.options. collapseCueText = ” 点击收起 “;
.mobile.listview.prototype.options.filterPlaceholder=”过滤“;
.mobile.selectmenu.prototype.options.closeText = ” 关闭 “; });
2.2页面配置
- 改变页面默认主题:
改变页面默认主题:
- (document).bind('mobileinit', function() { </span></span></li><li class=""><span> $<span class="attribute">.mobile.page.prototype.options.addBackBtn</span><span> = </span><span class="attribute-value">true</span><span>; </span></span></li><li class="alt"><span> $<span class="attribute">.mobile.page.prototype.options.backBtnTheme</span><span> = </span><span class="attribute-value">"e"</span><span>; </span></span></li><li class=""><span> $<span class="attribute">.mobile.page.prototype.options.headerTheme</span><span> = </span><span class="attribute-value">"b"</span><span>; </span></span></li><li class="alt"><span> $<span class="attribute">.mobile.page.prototype.options.footerTheme</span><span> = </span><span class="attribute-value">"d"</span><span>; </span></span></li><li class=""><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(‘mobileinit’, function() {
.mobile.page.prototype.options.addBackBtn=true;
.mobile.page.prototype.options.backBtnTheme = “e”;
.mobile.page.prototype.options.headerTheme=“b”;
.mobile.page.prototype.options.footerTheme = “d”; });
2.3部件配置JQM中的每个部件widget都有自己的默认配置属性,可以通过部件的prototype属性中的options对象来改变部件的默认配置,接口为$.mobile.<部件名>.prototype.options
- (document).bind('mobileinit', function() { </span></span></li><li class=""><span> // 在所有listviews中启用过滤 </span></li><li class="alt"><span> $<span class="attribute">.mobile.listview.prototype.filter</span><span> = </span><span class="attribute-value">true</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> // 在所有选择框上启用非原生菜单 </span></li><li class=""><span> $<span class="attribute">.mobile.selectmenu.prototype.nativeMenu</span><span>=</span><span class="attribute-value">false</span><span>; </span></span></li><li class="alt"><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(‘mobileinit’, function() { // 在所有listviews中启用过滤
.mobile.listview.prototype.filter=true;//在所有选择框上启用非原生菜单
.mobile.selectmenu.prototype.nativeMenu=false; });
- <strong>
- </strong>
<strong> </strong>
- <strong>3.实用工具</strong>
<strong>3.实用工具</strong>
3.1Data-*工具- 取得页面上所有btn集合:
取得页面上所有btn集合:
- var buttons = ("a[</span><span class="attribute">data-role</span><span>=</span><span class="attribute-value">button</span><span>"]); </span></span></li></ol></div><pre name="code" class="html" style="display: none;">var buttons =(“a[data-role=button”]);
- JQM添加了一个名为jqmData的过滤器,并会应用我们指定的命名空间,上面的代码可以更改为:
JQM添加了一个名为jqmData的过滤器,并会应用我们指定的命名空间,上面的代码可以更改为:
- <pre name=“code” class=“html”>var buttons = ("a:jqmData(</span><span class="attribute">role</span><span>=</span><span class="attribute-value">'button'</span><span>)"); </span></span></li></ol></div><pre name="code" class="html" style="display: none;"><pre name="code" class="html">var buttons =(“a:jqmData(role=’button’)”);同时,在JQM集合对象上应该使用jqmData和jqmRemoveData来代替原来的jQuery函数data和removedata,例如:
- ("a").jqmRemoveData("transition"); </span></span></li><li class=""><span>(“#button1”).jqmData(“theme”, “a”);
$("a").jqmRemoveData("transition"); $("#button1").jqmData("theme", "a");
3.2页面工具当前页面:
- var currentPageId = .mobile.activePage.id; </span></span></li></ol></div><pre name="code" class="html" style="display: none;">var currentPageId =.mobile.activePage.id;可以通过
.mobile.pageContainer属性访问当前页面的容器(通常为body元素),框架中最有用的工具是
.mobile.changePage方法,它允许我们转向另一个页面,就像用户点击了相应的链接一样。
加载外部页面:
- .mobile.changePage("external.html"); </span></span></li></ol></div><pre name="code" class="html" style="display: none;">.mobile.changePage(“external.html”);转向当前文档中已经存在的内部页面:
- .mobile.changePage( (“#pageId”));
$.mobile.changePage($("#pageId"));
更改页面切换效果:
- .mobile.changePage( (“#page2”), {
- transition: “slide”,
- reverse: true
- });
示例:通过POST方式发送数据并加载一个外部页面:$.mobile.changePage($("#page2"), { transition: "slide", reverse: true });
- <script>
- function viewProduct(idProduct) {
- $.mobile.changePage(“productdetail.php”, {
- method: “post”,
- data: {
- action: ‘getProduct’,
- id: idProduct
- },
- transition: “fade”
- });
- }
- </script>
- <!– … –>
- <a href=“javascript:viewProduct(5200)” data-role=“button”>Product details</a>
<script> function viewProduct(idProduct) { $.mobile.changePage("productdetail.php", { method: "post", data: { action: 'getProduct', id: idProduct }, transition: "fade" }); } </script> <!-- ... --> <a href="javascript:viewProduct(5200)" data-role="button">Product details</a>
3.3平台、路径、UI工具
$.mobile对象中用于查询当前平台的工具。getDocumentUrl():返回原始文档的RU
$.mobile.path访问路径管理工具。
parseUrl(url):返回一个对象,各个属性对应该URL的各个部分
makePathAbsolute(relativePath,absolutePate):基于相对路径返回绝对路径
makeURLAbsolute(relativeUrl,absoluteUrl):基于相对URL返回绝对URL
isSameDomain(Url1,Url2):如果两个URL同域名则返回true
isRelativeUrl(Url):如果URL是相对地址则返回true
isAbsolute(Url):如果URL是绝对地址则返回true
$.mobile.silentScroll(y)可以将页面滚动到任意位置,同时不显示动画,也不触发任何时间。
// 显示加载信息,并在2s后将其隐藏
- .mobile.showPageLoadingMsg(); </span></span></li><li class=""><span>setTimeout(function() { </span></li><li class="alt"><span> $.mobile.hidePageLoadingMsg(); </span></li><li class=""><span>}, 2000); </span></li></ol></div><pre name="code" class="html" style="display: none;">.mobile.showPageLoadingMsg(); setTimeout(function() { .mobile.hidePageLoadingMsg();
}, 2000);.mobile.fixedToolbars.show()/.hide():显示、隐藏固定工具栏
4.自定义过渡
添加一个explode过渡类型:- </span><span class="attribute">.mobile.transitionHandlers.explode</span><span> = </span><span class="attribute-value">explodeTransitionHandler</span><span>; </span></span></li></ol></div><pre name="code" class="html" style="display: none;"><script type="math/tex" id="MathJax-Element-31">.mobile.transitionHandlers.explode = explodeTransitionHandler;
</script>.mobile.transitionHandlers.explode = explodeTransitionHandler;
修改默认的过渡,将它赋值为任何其他处理函数- </span><span class="attribute">.mobile.defaultTransitionHandler</span><span> = </span><span class="attribute-value">explodeTransitionHandler</span><span>; </span></span></li></ol></div><pre name="code" class="html" style="display: none;"><script type="math/tex" id="MathJax-Element-32">.mobile.defaultTransitionHandler = explodeTransitionHandler;
- .mobile.changePage("external.html"); </span></span></li></ol></div><pre name="code" class="html" style="display: none;">.mobile.changePage(“external.html”);转向当前文档中已经存在的内部页面:
- (document).bind('mobileinit', function() { </span></span></li><li class=""><span> // 在所有listviews中启用过滤 </span></li><li class="alt"><span> $<span class="attribute">.mobile.listview.prototype.filter</span><span> = </span><span class="attribute-value">true</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> // 在所有选择框上启用非原生菜单 </span></li><li class=""><span> $<span class="attribute">.mobile.selectmenu.prototype.nativeMenu</span><span>=</span><span class="attribute-value">false</span><span>; </span></span></li><li class="alt"><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(‘mobileinit’, function() { // 在所有listviews中启用过滤
.mobile.listview.prototype.filter=true;//在所有选择框上启用非原生菜单
.mobile.selectmenu.prototype.nativeMenu=false; });
- (document).bind("mobileinit", function() { </span></span></li><li class=""><span> // We change default values </span></li><li class="alt"><span> $<span class="attribute">.mobile.ns</span><span> = </span><span class="attribute-value">"firt"</span><span>; </span></span></li><li class=""><span>}); </span></li></ol></div><pre name="code" class="html" style="display: none;">(document).bind(“mobileinit”, function() { // We change default values $.mobile.ns = “firt”; });为了避免框架间的冲突,可以使用ns全局属性来定义一个命名空间。例如上式使用后,页面模板就会变成: