在我的网站中,我看到在浏览器的前进按钮选择期间调用了pageinit.它是否正确.这不会两次绑定已注册的事件.
First.html
<!DOCTYPE HTML>
<html>
<head>
<title>Test1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
<script src="../scripts/common.js"></script>
</head>
<body>
<div data-role="page" id="first">
<h1 style="background: red">Swipe 1</h1>
<a href="second.html">Click</a>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Second.html
<!DOCTYPE html>
<html>
<head>
<title>Test2</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
<script src="../scripts/common.js"></script>
</head>
<body>
<div data-role="page" id="second">
<div data-role="header">
<h1>jQuery Mobile</h1>
</div>
<div data-role="content">
<a href="third.html">Click</a>
</div>
<div data-role="footer">
<h4>www.jboss.org/developer</h4>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
third.html
<!DOCTYPE html>
<html>
<head>
<title>jQuery Mobile Template</title>
<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="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
</head>
<body>
<div data-role="page" id="third">
<div data-role="header">
<h1>jQuery Mobile</h1>
</div>
<div data-role="content">
<ul id="listOfItems" data-role="listview" data-inset="true" data-filter="true">
<li><a href="">One</a>
</li>
<li><a href="">Two</a>
</li>
<li><a href="">Three</a>
</li>
</ul>
</div>
<div data-role="footer">
<h4>www.jboss.org/developer</h4>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
common.js
$(document).on('pageinit', "#first", function (event) {
console.log("first");
});
$(document).on('pageinit', "#second", function (event) {
console.log("second");
});
$(document).on('pageinit', "#third", function (event) {
console.log("third");
});
Run Code Online (Sandbox Code Playgroud)
你能查看上面的代码,让我知道为什么每次调用pageinit.
在我们讨论页面事件之前,我们需要讨论jQuery Mobile页面架构.jQuery Mobile应用程序可以通过两种不同的方式创建,即多页面模板或多个HTML页面.
在这种模板中,一切都被加载到了DOM.无论用户从一个页面转换到另一个页面的次数将保持加载到DOM.虽然这是在页面之间平滑过渡的最佳解决方案,但它可能会增加负担DOM.这通常不是桌面浏览器的问题,但移动浏览器可能会受到影响,特别是在低端设备上.
此模板解决方案需要多个HTML页面.它是大型移动应用程序构建的绝佳选择,但有一个问题.与每页访问页面的多页模板不同,它将被加载到DOM.在较慢的设备上,它可能会导致转换问题,尤其是在目标页面很大的情况下.这可以通过页面预取来解决,其中jQuery Mobile在主页加载并pagecreate触发事件后在后台加载目标页面.BUT还有另一个大问题,这在jQuery Mobile文档中没有充分描述.在页面转换期间,将从中删除上一页DOM.这样做是为了防止内容积累DOM.使用另一个名为的属性也可以防止这种情况:
data-dom-cache="true"
Run Code Online (Sandbox Code Playgroud)
或者通过初始化全局参数:
$.mobile.page.prototype.options.domCache = true;
Run Code Online (Sandbox Code Playgroud)
jQuery Mobile有几个页面事件(更多关于它可以在这里或这里找到).它们在这里涵盖整页加载/转换过程.高级jQuery Mobile用户知道使用pageinit事件而不是jQuery经典document ready事件.就像document ready,pageinit这里只在页面初始化期间触发一次.
但是有一个catch,pageinit只会在页面内部初始化时触发一次DOM.如果从DOM(在多HTML模板中)删除页面并再次加载pageinit将再次触发.
简而言之,每个页面DOM初始化将触发新的页面事件初始化.如前所述,这可以通过页面兑现来防止.
这对jQuery Mobile开发人员来说几乎是一个禁忌主题,所以让我讲一些事情,没有必要害怕页面兑现.相信我,jQuery Mobile是一个强大的框架,它通常在每个可用平台上都能很好地运行.与jQuery Mobile相关的大量抱怨与其大的DOM大小要求没有直接关系,因此不必担心兑现.
这并不意味着你应该DOM像喝醉酒的水手一样.每个应用程序开发都必须提前计划.大多数使用的页面必须永久保留在DOM中.其他所有内容都应该特别使用(需要时加载/删除).
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |