SPA模式下的多页面跳转原理及实现

jQuery Mobile在SPA模式下的多页面跳转原理及实现案例



前言

jQuery Mobile提供了采用SPA(Single Page Application)方式的多页面开发,特别适合于移动跨端开发中提升多页面应用的性能。其中,在官方文档提到了changePage、loadPage的方式,也给出了采用< a href>标签的方式,并且在官方文档中只给出了以内联方式的多页面切换(即各个页面写在同一个html文件中,用< div data-role=“page” id=“pagex”>区分不同页面,其中的x代表了page1、page2…),但对于一个包含较多页面的应用,会导致html文件过于复杂和超长,带来维护困难和可读性差的问题。
那么在jQuery Mobile中SPA下多页面的不同调用方式有什么区别?对于单独保存为不同的html页面又该如何调用呢?
本文详细分析和描述了jQuery Mobile中SPA多页面调用外部和内联页面的原理,并给出代码分析。


一、SPA的实现原理和代码分析

1.实现原理说明

在示例中是基于jQuery Mobile开发的cordova App。
主入口index.html中采用不同方式调用了page2.html或内联页面pagetwo。代码如下:

(1)index.html

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="css/index.css">
  <link rel="stylesheet" href="lib/jquery.mobile-1.4.5.min.css">
    <script src="lib/jquery-2.2.4.min.js"></script>
    <script src="js/index.js"></script>
    <!--index.js必须在jqmobile调用前加载,否则mobileinit不会被捕获,导致init函数不执行-->
    <script src="lib/jquery.mobile-1.4.5.min.js"></script>
    <title>Multi Page Change Demo</title>
</head>
<body>
    <div data-role="page" id="pageone">
        <div data-role="header">
            <h2>第一页</h2>
        </div>
        <div data-role="main" class="ui-content">
            <button id="page2Btn">changePage按钮跳转page2</button>
            <a href="page2.html" data-role="button" data-ajax="true" data-transition="slide">ajax锚跳转page2</a>
            <a href="#pagetwo" class="ui-shadow" data-transition="slide" data-role="button">内联跳转page2</a>
        </div>
        <div data-role="footer">
            <h3>版权所有&copy;W</h3>
        </div>
    </div>
	<!--以下为内联页面-->
    <div data-role="page" id="pagetwo">
        <div data-role="header">
            <h2>第二页</h2>
        </div>
        <div data-role="main" class="ui-content">
            <a href="#pageone"  data-transition="flip">跳转到第一个页面</a>
        </div>
        <div data-role="footer">
            <h3>版权所有&copy;W</h3>
        </div>
    </div>
    <script src="cordova.js"></script>
    <script src="js/index.js"></script>
</body>
</html>

(2)index.js

var deviceReadyDeferred = $.Deferred();
var jqmReadyDeferred = $.Deferred();
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
    deviceReadyDeferred.resolve();
}
$(document).on("mobileinit",function(){
    jqmReadyDeferred.resolve();
});
function init(){
    $(document).on("touchend","#page2Btn",function(e){
        alert("in index.js click page2Btn,开始跳转外部page2.html");
        // $.mobile.changePage("page2.html");//成功
        // $.mobile.loadPage("page2.html");//该方式不成功
        //该方式可访问内联页面
        // $.mobile.changePage("#pagetwo",{
        //     transition:"pop",
        //     reverse:true
        // });
        //该方式也成功
        $.mobile.pageContainer.pagecontainer("change","page2.html",{
            changeHash:false
        });
    });
     $(document).on("touchend","#page1Btn",function(e){
        alert("in index.js click page1Btn which in page2.html,开始跳转外部index.html")
        // $.mobile.changePage("index.html");
        $.mobile.changePage("index.html",{
            transition:"pop",
            reverse:true
        });
    });
}

(3)page2.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Page 2</title>
  <link rel="stylesheet" href="lib/jquery.mobile-1.4.5.min.css">
    <script src="lib/jquery-2.2.4.min.js"></script>
    <script src="lib/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>
<!--ajax方式只会更新div data-role="page"其中的部分-->
<div data-role="page" id="page2">
  <div data-role="header">
    <h1>Page 2</h1>
  </div>
  <div data-role="main" class="ui-content">
    <p>This is Page 2.</p>
    <button id="page1Btn">回到第一个页面</button>
    <a href="index.html" data-role="button" data-ajax="true" data-transition="slide" data-direction="reverse">ajax锚方式返回</a>
  </div>
  <div data-role="footer">
    <h4>Footer</h4>
  </div>
</div>
在div外面的部分将不会被Ajax方式加载,因此该部分文字和page2.js不会被执行
<script src="js/page2.js"></script>
</body>
</html>

(4)page2.js

在运行中,page2.js不会被执行

$(document).on("touchend","#page1Btn",function(e){
    alert("in page2.js click page1Btn,changePage跳转index.html");
    $.mobile.changePage("index.html");
    // $.mobile.changePage("index.html",{
    //     transition:"pop",
    //     reverse:true
    // });
});

2.代码分析

运行结果如图:
在这里插入图片描述
确定后,则跳转到page2.html, 如图,再点击"回到第一个页面",则又回页面index.html
在这里插入图片描述
点击其中的"AJAX锚跳转PAGE2”和“AJA X锚方式返回",也具有同样的效果,只是实现代码采用了< a href>方式;
而”内联跳转PAGE2“则是显示的index.html中的pagetwo页面。

二、特别说明

在index.js中用了Deferred延迟对象来实现挂起进程,直到用resolve()可以继续执行。
在其中需要判断deviceready和mobileinit两个事件都就绪后,才开始执行init函数的内容。
因此,要特别注意两个事件的触发机制。

  • jQuery Mobile的mobileinit事件,会在 <script src="lib/jquery.mobile-1.4.5.min.js"></script>加载后马上触发,甚至早于 jQuery 的 document.ready 事件,因此,自己开发的绑定侦听事件的index.js需要在加载 jQuery Mobile之前,否则会由于错过mobileinit而导致侦听不执行!因此,应按如下顺序加载 jQuery Mobile:
  <link rel="stylesheet" href="jquery.mobile-XXX.css">
    <script src="jquery-XXX.js"></script>
    <script src="index.js"></script><!--自己的js文件-->
    <script src="jquery.mobile-XXX.js"></script>
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPA(Single Page Application)即页面应用,是一种通过JavaScript实现的Web应用程序模式,其原理如下: 1. 前端路由:SPA使用前端路由来管理页面的跳转和加载。通过监听浏览器URL的变化,SPA可以根据URL中的路径信息加载相应的页面或组件,实现页面的切换,而不会刷新整个页面。 2. 组件化开发:SPA将页面拆分为多个组件,每个组件负责不同的功能。在切换页面时,只需要加载当前页面需要的组件,可以减少网络请求,提高用户体验。 3. 异步数据加载:SPA使用Ajax、WebSocket等技术与后端进行数据通信,通过异步请求获取数据,并在页面上进行渲染。数据的获取和展示是分离的,可以实现数据的动态更新,减少页面的刷新。 4. 虚拟DOM:SPA使用虚拟DOM机制,通过JavaScript对象来表示页面的结构和内容。当数据发生变化时,SPA会通过比较新旧虚拟DOM的差异,然后只更新差异部分,减少页面的重新渲染,提高性能。 5. 前后端分离:SPA将前端和后端完全分离,前端负责页面展示和用户交互,后端只负责提供数据接口。前后端可以独立开发和部署,提高开发效率和灵活性。 总结:SPA通过前端路由、组件化开发、异步数据加载、虚拟DOM以及前后端分离等技术,实现了在一个页面中动态加载不同的组件、实时更新数据、提高用户体验和开发效率的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值