用原生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 构建客户/服务分离的链接模型中Table中的排序分析
Jan 22 Javascript
Javascript 网页水印(非图片水印)实现代码
Mar 01 Javascript
JS的get和set使用示例
Feb 20 Javascript
jquery库文件略庞大用纯js替换jquery的方法
Aug 12 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
JavaScript 封装一个tab效果源码分享
Sep 15 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 Javascript
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
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中的观察者模式
2010/03/24 PHP
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
php中return的用法实例分析
2015/02/28 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
微信小程序背景音乐开发详解
2019/12/12 Javascript
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python实现复制大量文件功能
2019/08/31 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Python列表操作方法详解
2020/02/09 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
String和StringBuffer的区别
2015/08/13 面试题
计算机毕业大学生推荐信
2013/12/01 职场文书
会计专业的自荐信
2013/12/12 职场文书
致800米运动员广播稿
2014/02/16 职场文书
生日寄语大全
2014/04/08 职场文书
网站推广策划方案
2014/06/04 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
公司财务部岗位职责
2015/04/14 职场文书
React中的Context应用场景分析
2021/06/11 Javascript