利用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 相关文章推荐
jQuery1.6 正式版发布并提供下载
May 05 Javascript
firefox下input type=&quot;file&quot;的size是多大
Oct 24 Javascript
js multiple全选与取消全选实现代码
Dec 04 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
Jan 16 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
Oct 23 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
利用vscode调试编译后的js代码详解
May 14 Javascript
vue自定义底部导航栏Tabbar的实现代码
Sep 03 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 Javascript
React+Redux实现简单的待办事项列表ToDoList
Sep 29 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
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
django实现分页的方法
2015/05/26 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
材料员岗位职责范本
2015/04/11 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android