用原生js做单页应用


Posted in Javascript onJanuary 17, 2017

最近在公司接到一个需求,里面有一个三级跳转。类似于选择地址的时候,选择的顺序是:省份->市->区。如果分三个页面跳转,那么体验非常不好,如果引入其他框架做成单页应用,又比较麻烦。所以可以用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();
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jquery实现相册一下滑动两次的方法
Feb 09 Javascript
Jquery的基本对象转换和文档加载用法实例
Feb 25 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
Vue2.0 http请求以及loading展示实例
Mar 06 Javascript
解决vue中修改了数据但视图无法更新的情况
Aug 27 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
js cookie实现记住密码功能
Jan 17 #Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 #Javascript
微信小程序 登陆流程详细介绍
Jan 17 #Javascript
jQuery无刷新上传之uploadify简单代码
Jan 17 #Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 #Javascript
js处理层级数据结构的方法小结
Jan 17 #Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
Jan 17 #Javascript
You might like
php 前一天或后一天的日期
2008/06/28 PHP
PHP 类型转换函数intval
2009/06/20 PHP
CURL状态码列表(详细)
2013/06/27 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js计算精度问题小结
2013/04/22 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
js实现文字截断功能
2016/09/14 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python让列表倒序输出的实例
2018/06/25 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
一套.net面试题及答案
2016/11/02 面试题
竞选班长演讲稿
2013/12/30 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Python中zipfile压缩包模块的使用
2021/05/14 Python
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python