用原生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 相关文章推荐
直接生成打开窗口代码,不必下载
May 14 Javascript
document.getElementById方法在Firefox与IE中的区别
May 18 Javascript
用innerhtml提高页面打开速度的方法
Aug 02 Javascript
当jQuery1.7遇上focus方法的问题
Jan 26 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
Sep 22 Javascript
json的使用小结
Jun 08 Javascript
移动端界面的适配
Jan 11 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
优雅的处理vue项目异常实战记录
Jun 05 Javascript
微信小程序如何利用getCurrentPages进行页面传值
Jul 01 Javascript
Jquery 获取相同NAME 或者id删除行操作
Aug 24 jQuery
js实现弹幕飞机效果
Aug 27 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中inlcude()性能对比详解
2012/09/16 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
如何写一个自定义标签
2012/12/28 面试题
资源环境与城市管理专业推荐信
2013/11/30 职场文书
成功的酒店创业计划书
2013/12/27 职场文书
党员学习十八大感想
2014/01/17 职场文书
公交公司毕业生求职信
2014/02/15 职场文书
党校学习自我鉴定
2014/02/24 职场文书
毕业生评语大全
2015/01/04 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
敬老院活动感想
2015/08/07 职场文书
导游词之介休绵山
2019/12/31 职场文书
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android