介绍
这篇文章也可以在这里找到,作为我博客的一部分。
jQuery Mobile 如何处理页面更改
要了解这种情况,您需要了解 jQuery Mobile 的工作原理。它使用 ajax 来加载其他页面。
第一页正常加载。它的HEAD
和BODY
被加载到 中DOM
,它们在那里等待其他内容。加载第二页时,仅将其BODY
内容加载到DOM
. 更准确地说,甚至BODY
没有满载。只有第一个具有 data-role="page" 属性的 div 将被加载,其他所有内容都将被丢弃。即使您有更多页面,也BODY
只会加载第一个页面。此规则仅适用于后续页面,如果您在初始HTML中有更多页面,所有这些页面都将被加载。
这就是为什么您的按钮显示成功但单击事件不起作用的原因。HEAD
在页面转换期间忽略其父级的相同单击事件。
这是官方文档:http: //jquerymobile.com/demos/1.2.0/docs/pages/page-links.html
不幸的是,您不会在他们的文档中找到此描述。以太他们认为这是一个常识,或者他们忘记像我的其他主题一样描述这个。(jQuery Mobile 文档很大,但缺少很多东西)。
解决方案 1
在您的第二页和其他所有页面中,将您的SCRIPT
标签移动到BODY
内容中,如下所示:
<body>
<div data-role="page">
// And rest of your HTML content
<script>
// Your javascript will go here
</script>
</div>
</body>
这是一个快速的解决方案,但仍然是一个丑陋的解决方案。
工作示例可以在我的其他答案中找到:Pageshow not trigger after changepage
另一个工作示例:页面加载方式与 jQuery-mobile 转换不同
解决方案 2
将您的所有 javascript 移动到原始的第一个 HTML 中。收集所有内容并将其放入单个 js 文件中,放入HEAD
. 在加载 jQuery Mobile 后初始化它。
<head>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
<script src="index.js"></script> // Put your code into a new file
</head>
最后,我将描述为什么这是一个好的解决方案的一部分。
解决方案 3
在您的按钮和用于更改页面的每个元素中使用rel="external" 。因为它不会使用 ajax 来加载页面,并且您的 jQuery Mobile 应用程序将表现得像一个普通的 Web 应用程序。不幸的是,在您的情况下,这不是一个好的解决方案。Phonegap 永远不能作为普通的网络应用程序运行。
<a href="#second" class="ui-btn-right" rel="external">Next</a>
官方文档,找一章:Linking without Ajax
现实的解决方案
现实的解决方案将使用解决方案 2。但与解决方案 2 不同,我将使用相同的 index.js 文件并在HEAD
每个可能的其他页面中对其进行初始化。
现在你可以问我为什么?
Phonegap
就像 jQuery Mobile 有问题一样,如果您的每个 js 内容都在一个 HTML 文件中,迟早会出现错误并且您的应用程序将失败(包括加载的 DOM)。DOM 可能会被删除,并Phonegap
会刷新您当前的页面。如果该页面没有javascript,则在重新启动之前它将无法工作。
最后的话
这个问题可以通过良好的页面架构轻松解决。如果有人感兴趣,我已经写了一篇关于优秀 jQuery Mobile 页面架构的文章。简而言之,我正在讨论 jQuery Mobile 如何工作的知识是您在成功创建第一个应用程序之前需要了解的最重要的事情。