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

news2024/9/22 9:59:09

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


文章目录

  • jQuery Mobile在SPA模式下的多页面跳转原理及实现案例
  • 前言
  • 一、SPA的实现原理和代码分析
    • 1.实现原理说明
      • (1)index.html
      • (2)index.js
      • (3)page2.html
      • (4)page2.js
    • 2.代码分析
  • 二、特别说明


前言

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
        });
    });
    //changPage外部跳转不能在浏览器运行,会出现跨域安全提示,可以在cordova运行
    $(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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka日志存储

前言 kafka的主题(topic)可以对应多个分区(partition)&#xff0c;而每个分区(partition)可以有多个副本(replica)&#xff0c;我们提生产工单创建topic的时候也是要预设这些参数的。但是它究竟是如何存储的呢&#xff1f;我们在使用kafka发送消息时&#xff0c;实际表现是提交…

一款开源高性能AI应用框架

前言 LobeChat 是一个基于 Next.js 框架构建的 AI 会话应用&#xff0c;旨在提供一个 AI 生产力平台&#xff0c;使用户能够与 AI 进行自然语言交互。 LobeChat应用架构 LobeChat 的整体架构由前端、EdgeRuntime API、Agents 市场、插件市场和独立插件组成。这些组件相互协作&a…

38-1 防火墙了解

一、防火墙的概念: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668 [A]1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。…

4个可将 iPhone iPad iPod 修复至正常状态的 iOS 系统恢复软件

许多iOS用户对操作系统问题感到恐慌&#xff0c;例如iPhone卡在恢复模式、白屏死机、黑屏死机、iOS系统损坏、iTunes连接屏幕、iPhone数据丢失等。这些状态通常很无聊&#xff0c;因为您无法使用 iPhone 执行任何操作。 4个可将 iPhone iPad iPod 修复至正常状态的 iOS 系统恢复…

【Unity 组件思想-预制体】

【Unity 组件思想-预制体】 预制体&#xff08;Prefab&#xff09;是Unity中一种特殊的组件 特点和用途&#xff1a; 重用性&#xff1a; 预制体允许开发者创建可重复使用的自定义游戏对象。这意味着你可以创建一个预制体&#xff0c;然后在场景中多次实例化它&#xff0c;…

sip转webrtc方案

技术选型 由于很多企业会议协议用的主要是webrtc&#xff0c;但是项目上很多时候的一些旧设备只支持sip协议&#xff0c;并不支持webrtc协议。所以sip和webrtc的相互转换就很有必要。 流媒体服务mediasoup本身并不支持sip协议。那么如何实现sip转webrtc呢&#xff1f; 根据调研…

我独自升级崛起下载教程 我独自升级崛起怎么一键下载

定于5月8日全球盛大发布的动作RPG力作《我独自升级崛起》&#xff0c;基于备受追捧的同名动画及网络漫画&#xff0c;誓为热情洋溢的游戏爱好者们呈献一场深度与广度兼具的冒险盛宴。这款游戏巧妙融合网络武侠元素&#xff0c;其创意十足的设计框架下&#xff0c;核心叙述聚焦于…

[极客大挑战 2019]PHP

1.通过目录扫描找到它的备份文件&#xff0c;这里的备份文件是它的源码。 2.源码当中涉及到的关键点就是魔术函数以及序列化与反序列化。 我们提交的select参数会被进行反序列化&#xff0c;我们要构造符合输出flag条件的序列化数据。 但是&#xff0c;这里要注意的就是我们提…

力扣每日一题109:有序链表转换二叉搜索树

题目 中等 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0&#xff0c;-3,9&#xff0c;-10,null,5]&#xff0c;它…

video标签,如何隐藏右下角三个点包含的功能?

// nodownload: 不要下载 // nofullscreen: 不要全屏 // noremoteplayback: 不要远程回放 // disablePictureInPicture: 不要画中画 <videocontrols disablePictureInPicture"true"controlslist"nodownload nofullscreen noremoteplayback" > </v…

Java基础教程 - 5 数组

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 5 数组 前面我们保存数据…

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…

AI 不仅会画画,还能造车 | 最新快讯

本周的北京&#xff0c;正在上演一场深刻的变革。 汽车产业&#xff0c;这个曾经以工业制造为核心的行业&#xff0c;正迅速地被数字化浪潮所改变&#xff0c;汽车、电商、互联网、人工智能等领域的界限变得模糊。在这样的背景下&#xff0c;车企们纷纷开始打破传统&#xff0c…

【AI】深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺……

深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺…… 来自&#xff1a;Axelera AI 资深软件工程师 Matthew Barrett 原帖是linkedin帖子&#xff1a; https://linkedin.com/posts/matthew-barrett-a49929177_i-think-its-fair-to-say-that-ml-compilation-ac…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

【Three.js基础学习】14.Galaxy Generator

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程知识点 1. 实现星际编辑器 2. 创建粒子 1000&#xff0c; 在随机位置 3. 创建材质 PointsMaterial 4. Points() 接收 5. 放到gui 中调试 但是会发现调整size 等 属…

4.任务创建和删除的API函数

一、简介 二、动态创建任务函数:xTaskCreate() 此函数用于使用动态的方式创建任务&#xff0c;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配&#xff0c;若使用此函数&#xff0c;需要在 FreeRTOSConfig.h 文件 中将宏 c…

5.6 qt day1

自由创建一个登录页面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口this->setWindowTitle("");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\14123\\Desktop\\b3119313b07eca80842876219…

【go项目01_学习记录05】

学习记录 1 依赖管理 Go Modules1.1 弃用 $GOPATH1.2 Go Modules 日常使用1.2.1 初始化生成go.mod文件1.2.2 Go Proxy代理1.2.3 go.mod文件查看1.2.4 go.sum文件查看1.2.5 indirect 含义1.2.6 go mod tidy 命令1.2.7 清空 Go Modules 缓存1.2.8 下载依赖1.2.9 所有 Go Modules …

知到java笔记(4.1--继承的用法以及this和super的用法)

格式&#xff1a; 例子&#xff1a; get set获取父类的私有变量 private属性 this和super区别&#xff1a; this用法 super用法 例子