用原生js做单页应用
最近在公司接到一个需求,里面有一个三级跳转。类似于选择地址的时候,选择的顺序是:省份->市->区。如果分三个页面跳转,那么体验非常不好,如果引入其他框架做成单页应用,又比较麻烦。所以可以用js把这一块做成单页应用的样子。。。
主要思路
通过改变url的hash值,跳到相应模块。先把默认模块显示出来,其他模块隐藏,分别给三个模块定义三个hash值,点击默认模块的选项的时候,改变hash值,同时在window上监听hashchange事件,并作相应模块跳转逻辑处理。这样即可模拟浏览器的前进后退,而且用户体验也比较好。
下面详细来看看,现在有一个场景,选择顺序是:车牌子->车型->车系。
首先HTML部分。默认显示车牌子选择列表,其他两个模块隐藏。
<div class="wrap">
<div id="Brand">
<div>品牌</div>
<ul class="mycar_hot_list">
<li>
<p>大众</p>
</li>
</ul>
</div>
<div id="Type" style="display:none">
<dl>
<dt>比亚迪汽车</dt>
<dd>宋</dd>
</dl>
</div>
<div id="Series" style="display:none">
<ul class="mycar_datalist">
<li>
2013年款
<li>
</ul>
</div>
</div>
js逻辑控制部分
①定义一个变量对象,存储三个模块中分别选择的数据、定义hash值、相应模块的处理逻辑函数。
info={
brand:'',
carType:'',
carSeries:'',
pages:['Brand','Type','Series']
};
info.selectBrand=function(){
document.title = '选择商标';
brandEvent();
}
//选择车型
info.selectType=function(){
document.title = '选择车型';
document.body.scrollTop = 0; //滚到顶部
window.scrollTo(0, 0);
typeEvent(); //为该模块的dom绑定事件或做其他逻辑
}
//选择车系
info.selectSeries=function(){
document.title = '选择车系';
document.body.scrollTop = 0;
window.scrollTo(0, 0);
seriesEvent();
}
②dom绑定事件&其他逻辑
function brandEvent(){
//绑定跳转
$('#Brand ul li').click(function(){
info.brand=$(this).find('p').text();
goPage('Type');
})
}
function typeEvent(){
//绑定跳转
$('#Type dd').click(function(){
info.carType=$(this).text();
goPage('Series');
})
}
function seriesEvent(){...}
③goPage逻辑跳转控制
function goPage(tag) {
if ((tag == 'Brand')&&(location.hash.indexOf('Type')!=-1)){ // 后退操作
history.back();
document.title = '选择商标';
}else if ((tag == 'Type')&&(location.hash.indexOf('Series')!=-1)){
history.back();
document.title = '选择车型';
}else {
location.hash = tag;
}
}
④js入口文件(这里用了zepto.js来选择dom)
window.onload=function(){
info.selectBrand(); //为默认显示的模块中的元素绑定相应的事件及其他逻辑
$(window).on("hashchange", function (e) {
doHashChange();
});
}
⑤最重要的hash改变逻辑控制
function doHashChange(){
//获取hash的值
var hash = location.hash.split('|')[0],
tag = hash.replace(/#/g, '');
if (info.pages.indexOf(tag) == -1) {
tag = 'Brand';
}
$('.wrap').children('div').hide();
//执行每个模块不同的方法
if(typeof(info['select' + tag]) == "function"){
info['select' + tag]();
}
//展示对应dom
$('#' + tag).show();
}
想参考demo?
本例没有demo。。。^_^
用原生js做单页应用的更多相关文章
- require.js实现单页web应用(SPA)
本文转载自:https://blog.csdn.net/qq_33401924/article/details/53815922 移动端单页应用基本上是做移动端最流行的的方式了,但是对于很多前端来说, ...
- 通过Web Api 和 Angular.js 构建单页面的web 程序
通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...
- 70.JS---利用原生js做手机端网页自适应解决方案rem布局
利用原生js做手机端网页自适应解决方案rem布局 刚开始我用的是下面这段代码,然后js通过外部链接引入,最后每次用手机刷新网页的时候都会出现缩略图 function getRem(pwidth, pr ...
- 使用 Vuex + Vue.js 构建单页应用
鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用[新篇] ------------------ ...
- 原生js表单序列化----- FormData
<style type="text/css"> .progress{ height: 10px; width: 600px; border: 1px solid red ...
- HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图)
原文:HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图) 3d旋转图:主要用css3中transform属性中的rotate,translate;以及用来做舞台效果的 pers ...
- 使用 Vuex + Vue.js 构建单页应用【新篇】
使用 Vuex + Vue.js 构建单页应用[新篇] 在去年的七月六号的时候,发布了一篇 使用 Vuex + Vue.js 构建单页应用 的文章,文章主要是介绍 vuex 的基本使用方法,发现对大部 ...
- 原生JS 表单提交验证器
转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...
- Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)
在这篇文章中 概观 演习 概要 由网络营 下载网络营训练包 在传统的Web应用程序中,客户机(浏览器)通过请求页面启动与服务器的通信.然后,服务器处理请求,并将页面的HTML发送给客户端.在与页面的后 ...
随机推荐
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...
- 从中间件的历史来看移动App开发的未来
在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...
- mybatis_映射查询
一.一对一映射查询: 第一种方式(手动映射):借助resultType属性,定义专门的pojo类作为输出类型,其中该po类中封装了查询结果集中所有的字段.此方法较为简单,企业中使用普遍. <!- ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- iOS 小知识点(持续更新)
1.如何通过代码设置Button title的字体大小 设置Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#> ...
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...