在本章中,我们将介绍以下配方:
- 使用
loadPage()
加载页面 - 使用
changePage()
更改页面 - 使用
jqmData()
和jqmRemoveData()
- 使用
jqmEnhanceable()
- 使用
jqmHijackable()
- 使用
$.mobile.base
- 解析 URL
- 使用
$.mobile.path
实用方法 - 使用无声滚动
jquerymobile 框架提供了许多方法和实用程序来处理$.mobile
对象。本章介绍如何使用这些方法和实用程序。
本章中所有配方的源文件位于档案的code/09
文件夹下。每个配方都列在其自己的子文件夹中,并相应地命名。
使用$.mobile.loadPage()
方法,您可以将背景中的外部页面加载到 DOM 中,并在不影响当前页面的情况下增强其内容。这个食谱告诉你如何做同样的事情。
从code/09/loadpage
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/loadpage/main.html
启动此代码。
-
使用
id="main"
页面创建main.html
,并添加一个空的div
标签和一个指向#page1
的链接,如下图:<div data-role="content"> <div id="msgdiv"></div> <a href="#page1" data-role="button">Show Page 1</a> </div>
-
为
#main
的pagebeforeshow
事件添加事件处理程序,并使用loadPage()
方法加载#page1
:$("#main").live("pagebeforeshow", function(event, data) { $("#msgdiv").html("<p>Current Active Page : " + $.mobile.activePage.attr("data-url") + "</p>"); $.mobile.loadPage( "page1.html", {role: "dialog"}); });
-
为
#page1
的pagebeforeshow
事件添加事件处理程序,更新显示的消息:$("#page1").live("pagebeforeshow", function(event, data) { $("#page1content").html("<p>Current Active Page : " + $.mobile.activePage.attr("data-url") + "</p>"); });
-
最后创建
page1.html
,如下图:<div id="page1" data-role="page" data-theme="e"> <div data-role="header"> <h1>Header of Page 1</h1> </div> <div id="page1content" data-role="content"></div> </div>
使用#main
页面创建 main.html,并在其中添加一个空的div
和一个打开#page1
的链接。#page1
参考在pageinit
期间不可用,因为它来自外部page1.html
文件。在#main
页面上添加pagebeforeshow
事件的事件处理程序。这里,使用$.mobile.activePage()
方法获取当前活动页面,并使用 jQueryattr()
方法在#msgdiv
中显示其data-url
属性。接下来,使用$.mobile.loadPage()
调用加载page1.html
。另外,设置loadPage()
选项,并将属性设置为dialog
。页面现在在后台加载。
为#page1
的pagebeforeshow
事件添加事件处理程序。如前所述获取活动页面的data-url
,并将其显示在#page1content
div 容器中。最后,用空 div 和id="page1content"
创建page1.html
。
当main.html
加载时,您将看到显示第 1 页按钮。点击它,page1.html
将显示为一个使用默认 pop 转换的对话框。此外,活动页面数据 URL 将正确显示在两个页面中。
$.mobile.loadPage()
返回一个延迟的promise
对象,一旦页面被增强并加载到 DOM 中,该对象将自动得到解析。
loadPage()
方法接受可选的options
对象作为第二个参数。可以在options
对象上设置以下属性:
data
:这是 Ajax 页面请求的数据loadMsgDelay
(默认 50 秒):这是页面加载消息显示之前的延迟pageContainer
:这是包含加载页面的元素reloadPage
(false
默认):强制页面重新加载role
:这是页面加载的data-role
值showLoadMsg
(false
默认):决定是否显示页面加载消息type
(默认为get
:指定 Ajax 请求的类型(get
或post
)
- 使用 changePage()更改页面配方
- 第 8 章、事件中的使用页面加载和删除事件配方
本食谱向您展示了如何使用$.mobile.changePage()
方法使用 JavaScript 将从一个页面更改为另一个页面。此配方使用第 6 章、列表视图中的拆分按钮列表配方扩展*,并在新页面中显示从列表项中选择的图像。*
从code/09/changepage
源文件夹复制此配方的完整代码。此外,使用第 6 章中的拆分按钮列表重新访问*。您可以使用 URL:http://localhost:8080/09/changepage/main.html
启动此代码。*
-
创建带有拆分按钮列表的
main.html
,其中<img>
标签的href
属性具有file
参数,图像文件的路径位于左侧按钮中,如下所示:<div data-role="content"> <ul data-role="listview" data-inset="true" data-theme="b" data-split-theme="e" data-split-icon="arrow-d"> <li> <a href="#viewphoto&file=img1.png"> <img style="margin: 10px" src="../../resourcimg/img1.png" /> <h3>Lal Bagh</h3> </a> <a href='#' data-rel='dialog'>Download</a> </li> <li> <a href="#viewphoto&file=img2.png"> <img style="margin: 10px" src="../../resourcimg/img2.png" /> <h3>Peacock</h3> </a> <a href='#' data-rel='dialog'>Download</a> </li> <li> <a href="#viewphoto&file=img3.png"> <img style="margin: 10px" src="../../resourcimg/img3.png" height=75% /> <h3>Ganesha</h3> </a> <a href='#' data-rel='dialog'>Download</a> </li> </ul> </div>
-
添加
#viewphoto
页面,点击拆分按钮左侧打开:<div id="viewphoto" data-role="page" data-theme="e" data-add-back-btn="true"> …..... <div data-role="content"> <div id="imgid"> <p>Displaying Image ...</p> </div> </div> </div>
-
将以下脚本添加到
<head>
部分,并在pagebeforechange
事件处理程序中调用$.mobile.changePage()
:$(document).live( "pagebeforechange", function( e, data ) { if ( typeof data.toPage === "string" ) { var u = $.mobile.path.parseUrl( data.toPage ); var re = /^#viewphoto&file/; if ( u.hash.search(re) !== -1 ) { $.mobile.changePage("main.html#viewphoto", { transition: "pop", dataUrl: u.hash.split("=")[1], type: "get" }); e.preventDefault(); } } });
-
在
#viewphoto
页面的pagebeforeshow
事件处理程序中显示图像:$("#viewphoto").live( "pagebeforeshow", function( e, data ) { var u = $.mobile.path.parseUrl( document.location.href ); var re = /^#img/; if ( u.hash.search(re) !== -1 ) { var str="<img src='../img/" + u.hash.substr(1) + "' />"; $("#imgid").html(str).trigger("refresh"); } });
在main.html
中增加拆分按钮列表和#viewphoto
页面,如代码所示。在#viewphoto
页面的div
标签中添加一个空的#imgid
属性,以显示完整图像。拆分按钮列表和#viewphoto
页面代码已在第 6 章中说明。右键的href
属性只指向#
,因为它不在本配方中使用。更改左侧按钮中的列表项href
属性,以包含文件参数;例如,href="#viewphoto&file=img1.png"
。当应用启动时,将显示以下带有缩略图的屏幕,如拆分按钮列表所示。
但是,当您单击拆分列表按钮时,不会发生任何事情,因为框架不理解具有href
属性的文件参数。要打开并显示图像,您必须手动处理页面更改。要手动调用pageChange()
,请为pagebeforechange
事件添加事件处理程序。这里,检查目标页面(data.toPage
是否为 URL 字符串,并使用$.mobile.path.parseUrl()
方法获取 URL 组件。现在,使用正则表达式-#viewphoto&file
在 URL 哈希中搜索文件参数。如果找到,则是查看图像的请求。您现在必须处理页面更改。
调用pageChange()
方法并将main.html#viewphoto
URL 传递给它。另外,使用transition
、type
和dataUrl
的自定义值设置options
参数。您可以通过拆分 URL 哈希将文件名信息存储在dataUrl
中,如图所示。最后,防止默认的pagebeforechange
事件处理,因为您已经在这里处理页面更改。
接下来,您需要查询pageChange()
提供给file
参数的 URL 字符串,并显示图像。为此,请为#viewphoto
页面的pagebeforeshow
事件添加事件处理程序。使用$.mobile.path.parseUrl()
方法获取 URL 组件。搜索img
表达式;如果找到,从 URL 散列中获取文件名,并在#imgid
div 容器中显示图像,如代码所示。现在,如果您点击任何列表项,相应的图像将以较大的尺寸显示在#viewphoto
页面中,如下图所示:
$.mobile.changePage()
方法在页面更改期间内部使用$.mobile.loadPage()
方法获取新页面。
changePage()
方法接受可选的options
对象作为第二个参数。可以在options
对象上设置以下属性:
allowSamePageTransition
(false
默认):默认情况下忽略到当前活动页面的转换,但可以使用allowSamePageTransition
选项启用changeHash
(true
默认):更新位置栏中的哈希值data
:这是 Ajax 页面请求的数据dataUrl
:这是页面更改后更新浏览器位置的 URLpageContainer
:这是包含加载页面的元素reloadPage
(false
默认):强制页面重新加载reverse
(false
默认):这是页面显示的过渡方向role
:提供显示页面的data-role
值showLoadMsg
(false
默认):决定是否显示页面加载消息transition
:这是用于页面更改的转换type
(默认为get
:指定 Ajax 请求的类型(get
或post
)
jqmData()
和jqmRemoveData()
方法可用于向 jQueryMobile 应用的元素添加或删除数据属性。它们自动处理自定义名称空间。本食谱向您展示了如何使用这些方法。
从code/09/jqmdata
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/jqmdata/main.html
启动此代码。
-
在包含
jquery.``mobile.js
之前,在main.html
中添加以下脚本:$(document).bind("mobileinit", function() { $.mobile.ns = "my-"; });
-
在页面中添加两个文本输入和一个按钮,如下所示:
<div data-my-role="content"> <div data-role="fieldcontain"> <label for="pgtheme">Page Theme : </label> <input type="text" id="pgtheme" /> </div> <div data-role="fieldcontain"> <label for="customdata">Custom Data : </label> <input type="text" id="customdata" /> </div> <button id="clearbtn">Clear Custom Data</button> </div>
-
在
<head>
部分添加以下脚本以调用jqmData()
和jqmRemoveData(``)
方法:$("#main").live("pageinit", function(event) { var pg = $("div:jqmData(role='page')"); pg.jqmData("custom", "Custom data text"); $("#pgtheme").attr("value", pg.jqmData("theme")); $("#customdata").attr("value", pg.jqmData("custom")); $("#clearbtn").bind("click", function(event, ui) { pg.jqmRemoveData("custom"); $("#customdata").attr("value", ""+pg.jqmData("custom")); }); });
在main.html
中,在包含对jquery.mobile.js
的引用之前,为mobileinit
事件添加事件处理程序。此在应用启动时调用。在这里,设置$.mobile.ns="my-"
名称空间配置。
使用id="pgtheme"
和id="customdata"
添加两个文本输入,分别显示页面主题和自定义数据。添加带有id="clearbtn"
的按钮。接下来,将pageinit
事件绑定到回调函数。在此函数中,使用div:jqmData(role='page')
自定义选择器获取page
元素。使用jqmData()
可确保自动处理具有自定义命名空间的数据属性(data-my-role
的查找。
使用jqmData()
方法在页面上设置自定义数据属性,值为自定义数据文本,如下图所示。最后,在两个文本输入中显示页面主题和自定义数据属性。页面显示如下:
接下来,为#clearbtn
添加click
事件处理程序,使用jqmRemoveData()
方法删除页面上设置的自定义数据属性,并更新自定义数据文本字段的值。现在,当您点击清除自定义数据按钮时,文本输入将显示未定义。
jQuery 方法data()
、hasData()
、removeData()
、没有考虑data-
属性的名称空间。您必须编写一个自定义代码来处理它。相反,使用jqmData()
和jqmRemoveData()
方法,如本配方所示。您可以使用 DOM 检查器检查代码,以验证自定义命名空间的使用。
- 第 7 章配置中的配置默认名称空间配方
当父元素上设置了data-enhance="false"
时,它将被所有子元素继承。为了搜索可以使用手动增强或自定义插件创作的元素,jQueryMobile 框架提供了一个名为jqmEnhanceable()
的过滤方法。这个食谱告诉你如何使用它。
从code/09/jqmenhance
源文件夹复制此配方的完整代码。您可以使用 URLhttp://localhost:8080/09/jqmenhance/main.html
启动此代码。
-
在包含
j``query.mobile.js
之前,在main.html
中添加以下脚本:$(document).bind("mobileinit", function() { $.mobile.ignoreContentEnabled = true; });
-
如图所示,向页面添加两个定位按钮。第二个按钮位于具有
data-``enhance="false"
的div
标签内。<div data-role="content"> <div> <a href="#">Link 1</a> </div> <div data-enhance="false"> <a href="#">Link 2</a> </div> </div>
-
在
<head>
部分添加以下脚本以调用jqmEnha``nceable()
方法:$("#main").live("pagecreate", function(event) { $("a").jqmEnhanceable().attr("data-role", "button"); });
在main.html
中,在包含对jquery.mobile.js
的引用之前,为mobileinit
事件添加一个事件处理程序,该引用在应用启动时调用。设置$.mobile.ignoreContentEnabled=true
配置。
在#main
的内容中增加两个div
标签。向这两个div
标签添加#
链接。不要在任何一个链接上设置data-role="button"
属性。第二个div
标记设置了data-enhance="false"
属性。接下来,将pagecreate
事件绑定到事件处理程序。此时,页面已经initialzied
,但小部件仍有待增强。现在调用锚元素上的jqmEnhanceable()
方法,如图所示。这将过滤并仅提供那些没有从其父级继承data-enhance="false"
的锚元素。因此,在代码中,Link 1
是可用的。使用 jQueryattr()
调用将其data-role
属性设置为button
,如代码所示。
现在,当您打开应用时,只有链接 1被增强为一个按钮,而链接 2没有被增强,如下图所示:
jqmEnhanceable()
方法仅在$.mobile.ignoreContentEnabled=true
配置设置时有效。访问每个元素的父节点并检查中的data-enhance
值,任何具有false
设置的父节点都将与其子元素一起从过滤集移除。
即使在一小部分元素上使用jqmEnhanceable()
也是代价高昂的,因为所有父元素都会检查data-enhance
值。
- *使用 jqmjackable()*配方
当父元素上设置了data-ajax="false"
时,所有子元素都会继承它。有一个名为jqmHijackable()
的过滤方法用于搜索可以使用自定义表单和链接绑定的子元素。这个食谱告诉你如何使用这个方法。
从code/09/jqmhijack
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/jqmhijack/main.html
启动此代码。
-
在包含
jquery.mobile.js
之前,在main.html
中添加以下脚本:$(document).bind("mobileinit", function() { $.mobile.ignoreContentEnabled = true; });
-
在页面中添加两个锚定按钮,如图所示。第二个按钮位于
div
标签内,标签上有data-ajax="false"
:<div data-role="content"> <div> <a href="page1.html" data-role="button">Link 1</a> </div> <div data-ajax="false"> <a href="page1.html" data-role="button">Link 2</a> </div> </div>
-
将以下脚本添加到
<head>
部分以调用jqmHijackable()
方法:$("#main").live("pageinit", function(event) { $("a").jqmHijackable().each(function() { $(this).attr("data-transition", "flip"); }); });
-
最后创建
page1.html
,如下代码片段所示:<div id="page1" data-role="page" data-theme="e"> …..... <div data-role="content"> <p>Page 1 Content</p> <a href="main.html" data-direction="reverse" data-ajax="false" data-role="button">Go Back</a> </div> </div>
在main.html
中,在包含对jquery.mobile.js
的引用之前,为mobileinit
事件添加一个事件处理程序。这将在应用启动时调用。设置$.mobile.ignoreContentEnabled=true
配置。
在#main
的内容中增加两个div
标签。在这两个div
标记中添加指向外部page1.html
文件的链接。第二个div
标记设置了data-ajax="false"
属性。接下来,将pageinit
事件绑定到事件处理程序,并在锚元素上调用jqmHijackable()
方法,如图所示。这将过滤并仅提供那些没有从其父级继承data-ajax="false"
的锚元素。因此,在代码中,Link 1
是可用的。使用 jQueryattr()
调用将其data-transition
属性设置为flip
,如代码所示。最后创建page1.html
,添加返回链接返回#main
页面。
现在,当您单击链接 1时,page1.html
将打开翻转过渡。但是,如果您点击链接 2,则page1.html
将在没有翻转的情况下打开。
在此配方中,链接 2使用data-ajax="false"
打开page1.html
。这将从 DOM 中清除main.html
。返回到main.html
会将main.html
加载到 DOM 中,但不会触发mobileinit
事件。这将导致链路 1在打开page1.html
时不使用翻转过渡。要解决此问题,请添加data-ajax="false"
属性以返回page1.html
中的链接。这会将main.html
重新加载到 DOM 中并触发mobileinit
事件。现在,通过两条链路从main.html
移动到page1.html
可以顺利地工作任意次数。
jqmHijackable()
方法仅在$.mobile.ignoreContentEnabled=true
配置设置时有效。访问每个元素的父节点并检查其data-ajax
值,任何具有false
设置的父节点都将与其子元素一起从过滤集移除。
即使在一小部分元素上使用jqmHijackable()
也是代价高昂的,因为所有父元素都会检查data-ajax
值。
- *使用 jqmEnhanceable()*配方
$.mobile.base
对象提供对原始文档库的引用。您可以使用set()
方法在基础对象上设置自定义值。您可以使用reset()
方法还原到原始值。本食谱向您展示了如何使用这些实用方法。
从code/09/base
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/base/main.html
启动此代码。
-
用两个按钮创建
main.html
,如下代码片段所示:<div id="content" data-role="content"> <div id="dispdiv"></div> <button id="changebtn">Set Document Base</button> <button id="resetbtn">Reset Document Base</button> </div>
-
添加以下脚本以显示文档库对象值:
function disp() { var str = "<p>Original Document Base: " + $.mobile.getDocumentBase() + "</p>" + "<p>Document Base set to : " + $.mobile.base.element.attr("href"); $("#dispdiv").html(str); }
-
调用
pageinit
事件处理程序中的$.mobile.base
实用程序方法:$("#main").live("pageinit", function(event) { disp(); $("#changebtn").bind("click", function(event, ui) { $.mobile.base.set("http://localhost:8080/"); disp(); }); $("#resetbtn").bind("click", function(event, ui) { $.mobile.base.reset(); disp(); }); });
添加一个带id="dispdiv"
的空div
标签,并在main.html
上添加两个按钮(#changebtn
和#resetbtn
,如图所示。增加disp()
功能,显示#dispdiv
div 容器中的当前文档库和原始文档库值。您可以使用$.mobile.getDocumentBase()
方法获取原始文档库。对pageinit
事件调用disp()
函数。第一次加载时,基本值显示如下:
现在,将#changebtn
的点击事件绑定到事件处理程序,并使用$.mobile.base.set()
方法将文档库设置为自定义值。现在点击设置文档库按钮,显示自定义库,如下图所示:
将#resetbtn
绑定到事件处理程序,通过调用$.mobile.base.reset()
方法重置文档库。点击重置单据基础按钮,您会看到基础值已经恢复。
$.mobile.path
对象提供可用于处理 URL 的属性和方法。这个配方向您展示了如何使用$.mobile.path.parseUrl()
方法获取 URL 的组件。
从code/09/parseurl
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/parseurl/main.html
启动此代码。
-
使用空的
div
标记和锚定链接创建main.html
,如下面的代码片段所示:<div data-role="content"> <div id="msgdiv"></div> <a href="http://user:pwd@localhost:8080/09/main.html?img=img1.png#imgview" data-role="button">Link 1</a> </div>
-
在
<head>
部分添加以下脚本,以获取点击锚定按钮时的 URL:$("#main").live("pageinit", function(event) { dispPath($.mobile.getDocumentUrl()); $("a").bind("click", function(event, ui) { dispPath($(this).attr("href")); event.preventDefault(); event.stopPropagation(); });
-
添加以下方法显示 URL 的各个组件:
function dispPath(urlstr) { var urlcomp = $.mobile.path.parseUrl(urlstr); var str = "<p>href: " + urlcomp.href + "</p>" + "<p>hrefNoHash: " + urlcomp.hrefNoHash + "</p>" + "<p>hrefNoSearch: " + urlcomp.hrefNoSearch + "</p>" + "<p>domain: " + urlcomp.domain + "</p>" + "<p>protocol: " + urlcomp.protocol + "</p>" + "<p>authority: " + urlcomp.authority + "</p>" + "<p>username: " + urlcomp.username + "</p>" + "<p>password: " + urlcomp.password + "</p>" + "<p>host: " + urlcomp.host + "</p>" + "<p>hostname: " + urlcomp.hostname + "</p>" + "<p>port: " + urlcomp.port + "</p>" + "<p>pathname: " + urlcomp.pathname + "</p>" + "<p>directory: " + urlcomp.directory + "</p>" + "<p>filename: " + urlcomp.filename + "</p>" + "<p>hash: " + urlcomp.hash + "</p>" + "<p>search: " + urlcomp.search + "</p>"; $("#msgdiv").html(str); } });
在main.html
中添加一个带id="msgdiv"
的空div
标签。添加一个带有复杂href
字符串的链接,如代码所示。创建一个接收 URL 字符串的dispPath
函数。在这里,调用$.mobile.path.parseUrl
方法以获取包含 URL 的各种组件的对象(#urlcomp
。在#msgdiv
div 容器中显示这些 URL 组件。首次加载应用时,调用pageinit
事件处理程序中的dispPath()
方法,通过调用$.mobile.getDocumentUrl()
方法将其传递给文档 URL 参数got
。第一次加载时显示以下屏幕截图:
接下来,为锚链的click
事件添加事件处理程序。调用dispPath()
函数,a 并将href
属性作为参数传递给它。通过调用锚对象上的 jQueryattr("href")
方法获取href
属性。最后,调用event.preventDefault()
和event.stopPropagation()
方法来阻止点击事件的默认动作。现在,当您点击链接 1时,复合href
属性的 URL 组件显示如下:
$.mobile.parseUrl()
方法返回一个对象,该对象包含各种 URL 组件的字符串值,如下所示:;未使用特定 URL 组件时,将存储空字符串:
href
:这是解析的原始 URLhrefNoHash
:这是没有散列组件的href
属性hrefNoSearch
:这是href
属性,没有搜索查询和散列domain
:此具有协议和权限组件protocol
:此为协议(含:
字符)authority
:此有用户名、密码和主机组件username
:此为用户名password
:此为密码host
:这是主机和端口hostname
:此为主机的名称port
:此为端口(协议使用默认端口时可以为空)pathname
:此为所引用文件或目录的路径directory
:此为路径名的目录部分,无文件名filename
:这个是没有目录的路径名的文件名部分hash
:这是的散列组件(包括#
字符)search
:此为查询组件(包含?
字符)
- 使用$.mobile.path 实用方法配方
此配方向展示如何使用应用中$.mobile.path
对象提供的实用方法。
从code/09/path
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/path/main.html
启动此代码。
-
创建具有四个锚定链接的
main.html
页面,如以下代码段所示:<div data-role="content"> <div id="msgdiv"></div> <a href="http://localhost:8080/09/base/main.html" data-role="button"> 1: http://localhost:8080/09/base/main.html </a> <a href="http://localhost:8080/09/base/" data- role="button"> 2: http://localhost:8080/09/base/ </a> <a href="page1.html" data-role="button"> 3: page1.html </a> <a href="../" data-role="button">4: ../</a> </div>
-
将以下脚本添加到
<head>
部分,以获取单击的链接的 URL。$("#main").live("pageinit", function(event) { var docurl = $.mobile.getDocumentUrl(); $("a").bind("click", function(event, ui) { dispPath($(this).attr("href")); event.preventDefault(); event.stopPropagation(); });
-
增加
disppath()
功能显示$.mobile.path
实用方法的输出:function dispPath(urlstr) { var urlcomp = $.mobile.path.parseUrl(urlstr); var str = "<p>Base: " + docurl + "</p>" + "<p>Page: " + urlcomp.href + "</p>" + "<p>Same Domain: " + $.mobile.path.isSameDomain( docurl, urlcomp) + "</p>" + "<p>is Absolute: " + $.mobile.path.isAbsoluteUrl(urlcomp) + "</p>" + "<p>is Relative: " + $.mobile.path.isRelativeUrl(urlcomp) + "</p>"; if ($.mobile.path.isRelativeUrl(urlcomp)) { str += "<p>Make Absolute Path: " + $.mobile.path.makePathAbsolute(urlcomp.href, $.mobile.path.parseUrl(docurl).pathname) + "</p>" + "<p>Make Absolute Url: " + $.mobile.path.makeUrlAbsolute(urlcomp.href, docurl) + "</p>" } $("#msgdiv").html(str); } });
在main.html
中添加一个带id="msgdiv"
的空 div 标签。添加具有不同 URL 的四个链接,如代码所示。在<head>
部分添加脚本,使用pageinit
事件处理程序中的$.mobile.getDocumentUrl()
方法获取页面的原始文档 URL(#docurl
。使用此 URL 作为此配方中比较的参考点。
接下来,为四个锚链接的click
事件添加一个事件处理程序。调用dispPath()
函数,并将link
href 属性作为参数传递给它。您可以通过调用锚对象上的 jQueryattr("href")
方法来获取href
属性。还可以在此事件处理程序中调用event.preventDefault()
和event.stopPropagation()
方法,以防止对click
事件执行任何进一步的操作。
在dispPath
函数中,调用$.mobile.path.parseUrl
方法获取传入 URL 的的href
组件。现在,调用各种$.mobile.path
实用程序方法,并在#msgdiv
div 容器中显示它们的输出,如代码所示。调用isRelativeUrl()
方法检查传入的 URL 是否相对。使用makePathAbsolute()
和makeUrlAbsolute()
方法将其转换为绝对值。原始文档 URL 用作这些转换的参考。
当页面加载时,您将看到四个链接按钮。点击第一个链接http://localhost:8080/09/path/main.html
,将显示类似于以下屏幕截图的输出。该 URL 与参考 URL 位于同一域中,并且该 URL 也是绝对的。
第二个链接http://localhost:8080/09/base/
指向一个文件夹。可以看到以下输出:;域是相同的,URL 是绝对的:
第三个链接page1.html
是一个相对 URL。绝对路径和绝对 URL 使用参考 URL 计算并显示,如以下屏幕截图所示;此处的相同域值为false。
最后一个链接指向父目录../
,也是一个相对 URL。使用参考 URL 计算绝对路径和 URL,并显示如下屏幕截图所示;同域值再次为假:
本配方中使用的$.mobile.path
实用方法如下:
isAbsoluteUrl
:检查给定的 URL 是否为绝对 URLisRelativeUrl
:检查给定的 URL 是否是相对的makePathAbsolute
:将相对路径转换为绝对路径;该方法使用引用路径参数进行转换makeUrlAbsolute
:将相对 URL 转换为绝对 URL;该方法使用引用 URL 参数进行转换isSameDomain
:检查两个 URL 是否属于同一个域
- 解析 URL配方
您可以使用$.mobile.silentScroll
方法滚动到页面上的任何垂直位置,而无需触发滚动事件侦听器。本食谱向您展示了如何使用无声滚动。
从code/09/silentscroll
源文件夹复制此配方的完整代码。您可以使用 URL:http://localhost:8080/09/silentscroll/main.html
启动此代码。
-
使用空的
div
标签和两个按钮创建main.html
,这两个按钮将用于滚动到页面的顶部和底部:<div data-role="content"> <button id="bottombtn">Page Bottom</button> <div id="dispdiv"></div> <button id="topbtn">Page Top</button> </div>
-
将以下脚本添加到
<head>
部分以创建一个较长的页面:$("#main").live("pageinit", function(event) { var str=""; for (var i=0; i<100; i++) { str += i + "<br/>"; } $("#dispdiv").html(str);
-
现在,根据单击的按钮,滚动到页面的顶部或底部:
$("#topbtn").bind("click", function(event, ui) { $.mobile.silentScroll($.mobile.defaultHomeScroll); }); $("#bottombtn").bind("click", function(event, ui) { $.mobile.silentScroll(2000); }); });
向main.html
添加两个带有 IDbottombtn
和topbtn
的按钮。用id="dispdiv"
创建一个空的div
标记,并用一些冗长的内容填充它。这里,在pageinit
事件上使用脚本在#dispdiv
循环中添加 100 行文本。该页面最初显示如下:
绑定#bottombtn
按钮的click
事件调用$.mobile.silentScroll
,Y 参数为大值(此处为 2000px)。现在,当您点击页面底部按钮时,页面滚动到文档底部的 Y 位置(2000px),如下图所示:
接下来,绑定#topbtn
按钮的click
事件,并将$.mobile.defaultHomeScroll
属性作为参数传递给$.mobile.silentScroll
。现在,点击页面顶部按钮,页面滚动回到顶部。
silentScroll
方法不调用滚动事件监听器。添加以下代码以验证单击任何按钮时未显示警报。但当您使用滚动条时,会显示此警报。
$(window).bind("scrollstop", function(event) {
alert("Scroll event was fired");
});
此配方中使用的$.mobile.defaultHomeScroll
属性在 jQueryMobile 框架内部用于滚动到页面顶部。此值是使用$.support.scrollTop
属性从浏览器中获取的。如果该值不是0
,则框架将其设置为0
。
- 第 8 章事件中使用滚动事件配方