原生JS实现单页应用:基于Hash路由的三级联动示例
本文介绍如何利用原生JavaScript和URL Hash值模拟单页应用,解决多级页面跳转体验差的问题。通过监听hashchange事件,结合DOM操作与状态管理,实现如省份-城市-区域或车品牌-车型-车系等三级联动选择功能,无需引入第三方框架即可提升用户体验。
原生JS单页应用背景与思路
近期在工作中遇到一个涉及三级跳转的需求,场景类似于地址选择中的“省份-市-区”层级。若采用传统的多页面跳转方式,用户交互体验较差;而引入大型前端框架来构建单页应用又显得过于繁琐。因此,利用JavaScript实现轻量级的单页应用效果成为更优解决方案。
核心思路
主要机制是通过修改URL的hash值来切换不同的功能模块。初始状态下,默认模块可见,其余模块隐藏。为各个模块分配独立的hash标识,当用户点击默认模块中的选项时,更新hash值,并在window对象上监听hashchange事件以执行相应的跳转逻辑。这种方式既能模拟浏览器的前进与后退功能,又能保持良好的用户交互体验。
具体场景示例中,选择流程设定为:“车牌子-车型-车系”。
HTML结构设计与初始化
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>
JavaScript逻辑实现细节
JavaScript逻辑控制部分
首先定义一个变量对象,用于存储三个模块中各自的选择数据、对应的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();
}
以上即为本文介绍的全部内容,希望这些内容能对各位的学习或工作有所帮助,同时也欢迎大家继续支持本站。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
