Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SPA初试-1

SPA初试-1

作者头像
嘿嘿嘿
发布于 2018-09-10 08:37:11
发布于 2018-09-10 08:37:11
68700
代码可运行
举报
文章被收录于专栏:陈纪庚陈纪庚
运行总次数:0
代码可运行

本篇内容是在上一次的基础上进行改进,对状态的定义进行了修改,一个状态的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function state(stateName, template, templateUrl) {
  this.stateName = stateName;
  if (template) {
    this.template = template;
  }
  if (templateUrl) {
    this.templateUrl = templateUrl;
  }
}

即每一个页面对应着一个状态,一个状态有一个状态名,还有一个模板/模板url,这样我们就可以将不同页面的内容写到不同的html里,然后通过templateUrl将他们动态加载进来渲染页面。

先贴上js代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var states = [];
var currentState;
$(document).ready(function() {
  registState();
  console.log(states);
  currentState = init();
  //监听hash路由变化
  window.addEventListener("hashchange", hashChange)
})

//哈希路由處理事件
function hashChange() {
  var nextState;
  console.log(window.location.hash);
  //判断地址是否为空,若为空,则默认到main-view页面
  if (window.location.hash == "") {
    nextState = "mainView";
  } else {
    //若不为空,则获取hash路由信息,得到下一个状态
    nextState = window.location.hash.substring(1);
  }
  //判断当前状态是否注册过(是有存在这个状态)0g
  var validState = checkState(states, nextState);
  //若不存在,则返回当前状态
  if (!validState) {
    createState(nextState, "", "./test.html");
    currentState = nextState;
    return;
  }
  $('#' + currentState).remove();
  if (!nextState.view) {
    states.forEach( function(element, index) {
      if (element.stateName == nextState) {
        createView(element);
      }
    });
  }
  currentState = nextState;
}

//状态注册
function registState() {

  var newState = new state("mainView", "", "./main-view.html");
  var newState1 = new state("listView", "", "./list-view.html");
  var newState2 = new state("detailView", "", "./detail-view.html");

  states.push(newState);
  states.push(newState1);
  states.push(newState2);
}

//初始化,对用户一开始输入的url进行处理
function init() {
  nextState = window.location.hash.substring(1);
  //若用户输入的hash值为空,则默认跳转到states[0]的页面
  if (nextState == "") {
    createView(states[0]);
    return states[0].stateName;
  }
  states.forEach( function(element, index) {
      if (element.stateName == nextState) {
        createView(element);
      }
    });
  return nextState;
}

//判断状态是否存在
function checkState(states, nextState) {
  var tof = false;
  states.forEach(function(element) {
      if (element.stateName == nextState) {
        tof = true;
      }
    })
  return tof;
}

//创建一个状态
function createState(stateName, template, templateUrl) {
  var newState = new state(stateName, template, templateUrl);
  createView(newState);
  $("#" + newState.stateName).css("display", "block");
  $('#'+ currentState).css("display", "none");
  currentState = newState;
  states.push(newState);
}

//创建状态所对应的视图,并将视图放到body里
function createView(state) {
  if (state.template) {
    template = state.template;
    state.view = $("<div id='" + state.stateName + "'></div>").html(template);
    $("body").append(state.view);
  }  else if (state.templateUrl) {
    htmlobj = $.ajax({url: state.templateUrl, async: false});
    template = htmlobj.responseText;
    state.view = $("<div id='" + state.stateName + "'></div>").html(template);
    $("body").append(state.view);
  }
}

//状态对象
function state(stateName, template, templateUrl) {
  this.stateName = stateName;
  if (template) {
    this.template = template;
  }
  if (templateUrl) {
    this.templateUrl = templateUrl;
  }
}

处理逻辑

  1. 一开始进入页面的时候,先利用registState()注册一些状态,然后利用init()函数来对用户一开始输入的url进行处理
  2. 当用户输入的路由发送变化的时候,调用hashChange()函数:
    1. 获取用户输入的hash值,这个hash值即为状态名
    2. 检查这个状态是否已经注册,若已经注册过,则将当前的页面内容清除掉,然后为输入的状态创建视图
    3. 若状态未注册,则创建一个新的默认状态
文件结构如下:
index.html里的内容

里面没有任何东西,内容都是我们动态加载进去的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
  <head>
    <title>SPA</title>
    <link rel="stylesheet" type="text/css" href="index.css" />
    <script type="text/javascript" src="jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="spa.js"></script>
  </head>
  <body>
  </body>
</html>
注意

我使用的是chrome浏览器,由于安全问题,chrome必须通过http等方式才能用$.ajax来获取到文件内容,因此我用了nodejs的http-server自己搭建了一个简单的服务器. 其他的页面都只是单纯的html文件,没有什么特别,所以就不列举出来了

截图

输入服务器的url

修改url,在后面加上#listView(之前在初始化的时候就已经注册过的状态)

输入一个没有注册过的状态(注册了一个默认的状态)

接下来打算做一下嵌套状态,如果有什么好的建议,麻烦告诉下我~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SPA页面初试
之前一直很好奇,SPA应用到底是怎么实现的,昨天无意间看到了有一篇介绍的文章,就想着来试一下水(以下根据我的理解所写,可能会让你看的云里雾里,如果想加深了解,最好先了解下window.location.hash是什么东西) 其实,SPA的原理就是,一开始将一些必要的页面都加载进来,当你在页面输入别的路由的时候,其实还是待在当前的页面,只不过是他识别出你想要去的地址,然后将那个页面的内容获取到,替代掉当前页面的内容,并且相应的改变url地址,这样给人看起来就好像到了另一个页面,实际上你还是在这个页面里,没有离
嘿嘿嘿
2018/09/10
1K0
SPA页面初试
彻底理清前端单页面应用(SPA)的实现原理
传统的多页面应用构建方式: 纯服务端渲染,前后端不分离,使用jsp,jade,'ejs','tempalte'等技术在后台先拼接成对应的HTML结构,然后转换成字符串,在每个对应的路由返回对应的数据(文件)即可 Jade模版服务端渲染,代码实现: const express= require('express') const app =express() const jade = require('jade') const result = *** const url path = *** const
Peter谭金杰
2019/08/02
3.2K2
Angularjs中UI Router超级详细的教程{{上}}
这篇文章主要介绍了Angularjs中UI Router全攻略,涉及到angularjs ui router的基本用法,需要的朋友参考下吧 首先给大家介绍angular-ui-router的基本用法。 如何引用依赖angular-ui-router angular.module('app',["ui.router"]) .config(function($stateProvider){ $stateProvider.state(stateName, stateCofig); }) $stateProvid
前朝楚水
2018/04/02
5.3K0
angular-ui-router 多视图views
UI Router 中有三种方式激活一个路由: (1)$state.go():优先级较高的便利方式 (2)ui-sref:点击包含此指令跳转 (3)url:url导航
奋飛
2019/08/15
1.1K0
Vue路由实现原理
其中pushState方法和replaceState方法可以分别增加和替换掉一条记录(必须同源),而不会重新加载页面。
愤怒的小鸟
2021/01/11
1.2K0
前端路由原理解析和实现
路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系。
ConardLi
2019/05/23
1K0
Akka(7): FSM:通过状态变化来转换运算行为
  在上篇讨论里我们提到了become/unbecome。由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑。对于比较复杂的程序流程,Akka提供了FSM:
用户1150956
2018/01/05
2.4K0
React Router核心依赖--history库
使用 React 开发稍微复杂一点的应用,React Router 几乎是路由管理的唯一选择。虽然 React Router 经历了 4 个大版本的更新,功能也越来越丰富,但无论怎么变,它的核心依赖 history 库却一直没变。下面我们来了解下这个在 github 上有 5k+ 星的库到底提供了什么功能。
Dickensl
2022/06/14
9250
SPA应用路由器如何工作?
SPA(single page application)-单页面应用有两个特点,一是路由控制,二是模板渲染。通过路由器,可以在不reload页面的情况下,实现页面部分刷新。那么,最关键的地方,就是如何设计路由器,如何让路由器工作?
娜姐
2022/05/13
1.7K0
SPA应用路由器如何工作?
SPA(单页面应用)的基本实现原理
我们应该都使用过网易云音乐或者是别的一些逼格比较高的网页,他们比较厉害的一点是页面看起来只有一个,不管你点击什么地方,永远不会刷新页面,都是感觉是在一个页面上完成的操作,这个逼格那么高的页面是怎么实现的呢?今天博主就简单的将实现的原理写一下,鄙人能力有限,写的不好的,或者您有自己的想法的,可以随时联系我,这里写的是原生的js实现,不是使用vue或者react的路由实现,所以我明白那些每天使用框架的人看到以后的感觉,肯定是没有vue或者react又或者别的一些数据双向绑定的框架使用起来方便,不过这个是入门的基本原理,所以大神莫怪!
何处锦绣不灰堆
2020/05/29
1.1K0
【ionic+angularjs】angularjs ui-router路由简介($urlRouter、$state、$stateProvider、ui-sref....)
之前有写过一篇关于Angular自带的路由:ngRoute。今天来说说Angular的第三方路由:ui-router。那么有人就会问:为什么Angular有了自带的路由,我们还需要用ui-router呢?这里简单明了的说明下ngRoute和ui-router的区别吧,其实也没很大的区别,主要的就是ngRoute针对于单视图,而ui-router可用于多视图(这里说的视图是指在页面内我们可控制的,可变化的区域)。比如:
用户5640963
2019/07/26
7.4K0
【ionic+angularjs】angularjs ui-router路由简介($urlRouter、$state、$stateProvider、ui-sref....)
Akka FSM 源代码分析
有限状态机本身不是啥新奇东西,在GoF的设计模式一书中就有状态模式, 也给出了实现的建议。各种语言对状态机模式都有非常多种实现的方式。我自己以前用C++和java实现过,也以前把 apache mina 源代码中的一个状态机实现抠出来单独使用。
全栈程序员站长
2022/07/05
5780
前端路由的实现原理
路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系。
Daotin
2019/07/28
2.2K0
写给vue转react的同志们(6)
众所周知,路由是前端必不可少的一部分,在实际业务中也是我们接触最多的一个模块。那其实不论 Vue 还是 React,他们实现路由的原理都大同小异,既通过 hash 和 history 这两种方式实现。
饼干_
2022/09/19
5500
微前端07 : 对single-spa的路由管理及微应用状态管理的分析
从流程图中,关于路由管理的初始化,single-spa做了4件事情。我们同时看看代码:
杨艺韬
2022/09/27
1.5K0
微前端07 : 对single-spa的路由管理及微应用状态管理的分析
基于requirejs和angular搭建spa应用1、常规实现2、引入Requirejs
  接上篇,angular 实战部分,angular比较适合spa项目,这里不借助任何seed和构建工具,直接从零搭建,基本的angular项目结构大致包含如下几个部分:   1)app.js 入口   2)index.html html框架页   3)lib(vendor)第三方类库   4)components 业务组件   5)styles/images 静态资源部分 1、常规实现   创建文件夹demo1,按照上述结构分别创建app.js ,index.html文件,创建lib、components
Jerremy
2018/06/13
1.5K0
原生 js 实现一个前端路由 router
项目地址:https://github.com/biaochenxuying/route
夜尽天明
2019/11/13
2.6K0
原生 js 实现一个前端路由 router
百度前端二面常考手写面试题总结
使用时间戳的节流函数会在第一次触发事件时立即执行,以后每过 wait 秒之后才执行一次,并且最后一次触发事件不会被执行
helloworld1024
2022/11/02
5780
手写Vue-router核心原理,再也不怕面试官问我Vue-router原理
在 Web 前端单页应用 SPA(Single Page Application)中,路由描述的是 URL 与 UI 之间的映射关系,这种映射是单向的,即 URL 变化引起 UI 更新(无需刷新页面)。
秋风的笔记
2021/09/22
7.6K1
手写Vue-router核心原理,再也不怕面试官问我Vue-router原理
【路由】:路由那些事——上
前端三杰 Angular、React、Vue 都推荐单页面应用 SPA 开发模式,它们都有自己的前端路由解决方案:
WEBJ2EE
2021/04/07
1.9K0
相关推荐
SPA页面初试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档