利用JS hash制作单页Web应用的方法详解


Posted in Javascript onOctober 10, 2017

前言

本文主要给大家介绍了关于利用JS hash制作单页Web应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一、何为hash

这里要讲的hash(也叫哈希),指的是JS中location对象的hash属性,它返回的是URL中#后所跟的零个或多个字符。通常,我们可以通过location.hash的方式获取哈希值或设置哈希值。当然,我们也可以通过设置a标签的href属性来设置哈希值,当用户点击该a标签时即可改变页面的哈希值。

例如:

/** JS方式 **/
location.hash = 'hash'; //设置hash,该代码执行后URL后面增加“#hash”字符串
console.log(location.hash); //获取hash
/** HTML方式 **/
<a href="#hash" rel="external nofollow" >点击改变hash</a> <!-- 点击后URL后面增加“#hash”字符串 -->

值得注意的是,无论以何种方式改变哈希值,页面都不会刷新。

二、hash有何用处

1. 设置锚链接

通过设置锚链接(即为上述HTML方式),可使点击链接后页面根据元素id滑动到指定位置,即使页面跳转后也不例外。

2. 实现单页应用的制作

可以根据哈希值的变化来使相应元素显示或者隐藏,从而实现页面无刷新的单页切换。

三、何为单页Web应用

单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。

以上是百度百科对单页应用(SPA)的解释,而使用hash可以非常方便的实现“页面”间的切换。

四、如何使用hash制作SPA

简单来说,就是先只显示第一个page,然后通过改变hash值来切换显示不同的page,前一个page隐藏。
这里写个简单的Demo演示一下吧:

1. 首先写好HTML结构

<article class="container">
 <section id="page1" class="page cur">第一页</section>
 <section id="page2" class="page">第二页</section>
 <section id="page3" class="page">第三页</section>
</article>
<nav id="nav" class="bottom-nav">
 <ul>
  <li>第一页</li>
  <li>第二页</li>
  <li>第三页</li>
 </ul>
</nav>

2. 然后为其设置CSS样式

.page{ display: none; /* 其他样式省略 */}
.page.cur{ display: block;}
/* 其他样式省略 */

3. 编写Javascript,实现单页切换

window.onload = function () {
 var nav = document.getElementById('nav');
 var navLi = nav.getElementsByTagName('li');
 for(var i = 0,len = navLi.length; i < len; i++){
  (function (i) { 
   navLi[i].onclick = function () { //点击nav中的li,改变hash值
    location.hash = 'page' + (i+1);
   }
  })(i);
 }
 location.hash = 'page1'; //每次页面重新加载时都回到page1
 window.onhashchange = function (e) { 
  //当hash变化时,执行hashchange事件,该事件具有oldURL和newURL两个事件属性,分别代表前一个URL和目前的URL
  var oldHash = e.oldURL.split('#')[1]; //取得前一个hash
  var newHash = e.newURL.split('#')[1]; //取得当前hash
  var oldPage = document.getElementById(oldHash);
  var newPage = document.getElementById(newHash);
  oldPage.classList.remove('cur'); //隐藏前一个page
  newPage.classList.add('cur');  //显示当前page
 };
}

这里有几个地方需要注意的是,IE并不兼容oldURL和newURL这两个属性,所以该方法有一定的局限性。当然,更好的方法是,一开始将hash值用变量存起来作为oldHash,具体方法如下:

/**** 前面代码省略 ****/
location.hash = 'page1';
var oldHash = location.hash;
window.onhashchange = function (e) {
 var newHash = location.hash;
 var oldPage = document.querySelector(oldHash);
 var newPage = document.querySelector(newHash);
 oldPage.classList.remove('cur');
 newPage.classList.add('cur');
 oldHash = newHash;
};

这里还有一个地方需要注意,就是classList在IE9及其以下浏览器不兼容,最好通过处理className属性的方式来实现相同的效果,此处便不再详述。

总结

以上就是这篇文章的全部内容了,当然,hash的作用或许远不止这些,以后如有遇到再同大家一起分享。希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Exjs 入门篇
Apr 07 Javascript
关于JavaScript中原型继承中的一点思考
Jul 25 Javascript
一个JS的日期格式化算法示例
Jul 31 Javascript
js生成随机数的过程解析
Nov 24 Javascript
JavaScript中Object.prototype.toString方法的原理
Feb 24 Javascript
JavaScript实现经典排序算法之冒泡排序
Dec 28 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
Feb 26 Javascript
浅析bootstrap原理及优缺点
Mar 19 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
Feb 06 Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 Javascript
React四级菜单的实现
Apr 08 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 #jQuery
JavaScript如何获取到导航条中HTTP信息
Oct 10 #Javascript
使用Dropzone.js上传的示例代码
Oct 10 #Javascript
React中上传图片到七牛的示例代码
Oct 10 #Javascript
基于对象合并功能的实现示例
Oct 10 #Javascript
聊聊Vue.js的template编译的问题
Oct 09 #Javascript
Vue组件之全局组件与局部组件的使用详解
Oct 09 #Javascript
You might like
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
详解python编译器和解释器的区别
2019/06/24 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python如何实现图片压缩
2020/09/11 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
电气自动化个人求职信范文
2014/02/03 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
2015年工会工作总结
2015/03/30 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
Elasticsearch 数据类型及管理
2022/04/19 Python