历史相关API
一、history对象

①history.back()移动到上一个访问页面,等同于浏览器的后退键。
②history.forward()动到下一个访问页面,等同于浏览器的前进键。
③history.go()接受一个整数作为参数,移动到该整数指定的页面,相对当前,跳出多少条记录,前进参数为正,后退参数为负,另外history.go(0)相当于刷新当前页面。
二、HTML5新增history相关API
①history.pushState(state,title,url) 追加历史浏览历史纪录
- state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。
- title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。
- url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。
②history.replaceState(state,title,url)替换修改浏览历史中当前纪录(参数和上面相同)
③window.onpopstate=function( ){ } 监听历史切换事件
注意:调用history.pushState( )或者history.replaceState( )不会触发popstate事件. popstate事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮,或者在JavaScript中调用history.back( )、history.forward( )、history.go( )方法
三、单页面应用程序(Single Page Application,SPA)
①在一个页面上实现网站的大部分功能,就是单页面应用程序,是一种常见的网页开发模式。即整个网站就只有一个Html文件,每次在切换页面时,不需要请求服务器,只要通过本地的js来切换即可。这样可以减小服务器压力、增强用户体验,增加app的使用流畅性。
②实现SPA主要有两种方案:
- 哈希(路由)方案:使用location.hash和hashchange事件实现路由。实际开发辨认的话就是出现“#”,比如:



- historyAPI方案:就是利用上述HTML5新增的API来实现。使用这种方案的特点是改变地址栏是不会跳转的。传统的ajax渲染,同时会更改地址栏,优点就是性能好,可以提高用户体验,缺点就是不利于SEO(搜索引擎收录的是源码)。解决方案就是同时更改地址栏,并且地址栏在服务端一定有对应的页面。这样,既可以实现ajax的异步加载,同时也利于SEO优化,并且可以使用前进后退按钮切换数据,下面就用例子来说明这种解决方案。
四、网易云案例
①文件需要使用域名打开,所以首先需要配置一个域名

②目录文件

③代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>网易云音乐案例</title>
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<header>
<div class="wrapper">
<h1>网易云音乐</h1>
<ul>
<li data-page="index" class="<?php echo $page=='index'?'now':''; ?>"><a href="index.php">发现音乐</a></li>
<li data-page="my" class="<?php echo $page=='my'?'now':''; ?>"><a href="my.php">我的音乐</a></li>
<li data-page="friend" class="<?php echo $page=='friend'?'now':''; ?>"><a href="friend.php">朋友</a></li>
</ul>
</div>
</header>
<div class="content">
<?php echo $html ?>
</div>
<script src="js/jquery.min.js"></script>
<script src="js/index.js"></script>
</body>
</html>
template.html
<?php
$html='发现音乐网页内容';
$page='index';
include 'template.html';
?>
index.php.php
<?php
$html='朋友网页内容';
$page='friend';
include 'template.html';
?>
friend.php
<?php
$html='我的网页内容';
$page='my';
include 'template.html';
?>
my.php
<?php
header("Content-type:text/html;charset=utf-8");
$page='index';
$html='发现音乐网页内容';
if(array_key_exists('page',$_GET)){
$page=$_GET['page'];
}
if($page=='friend'){
$html='朋友网页内容';
}
if($page=='my'){
$html='我的音乐网页内容';
}
echo '{"html":" '.$html.' ","page":" '.$page.' "}';
?>
data.php
*{
padding:;
margin:;
}
body{
background-color: #f7f7f7;
font-family: Arial, Helvetica, sans-serif;
}
header{
background: #242424;
border-bottom: #000;
}
.wrapper{
width: 1100px;
height: 70px;
margin: 0 auto;
}
.wrapper h1{
float: left;
width: 176px;
height: 69px;
background: url("../images/topbar.png") no-repeat 0 0;
font-size:;
}
.wrapper ul{
list-style: none;
}
.wrapper ul li{
float: left;
height: 70px;
}
.wrapper ul li.now,
.wrapper ul li:hover{
background: red;
}
.wrapper ul li a{
padding: 0 20px;
display: block;
color: #fff;
line-height: 70px;
text-decoration: none;
}
.content{
width: 1100px;
margin: 0 auto;
font-size: 100px;
text-align: center;
}
index.css
// 1.ajax异步加载,渲染页面
// 2.渲染什么页面需要和后台提供的地址保持一致
// 3.切换历史渲染页面
$('.wrapper').on('click','a',function(){
//渲染页面
var page=$(this).parent().data('page');
render(page);
// 地址保持一致,追加地址,而且这个地址后台一定要存在
var historyUrl=$(this).attr('href');
history.pushState(null,null,historyUrl);
return false;
});
// 监听切换历史
window.onpopstate=function(){
// 获取地址栏信息
var pathname=this.location.pathname;
var page='index';
//根据信息判断需要加载什么页面内容
if(pathname.indexOf('index.php')>-1){
page='index';
}else if(pathname.indexOf('my.php')>-1){
page='my';
}else if(pathname.indexOf('friend.php')>-1){
page='friend';
}
render(page);
}
// 调用ajax函数 (请求方式,请求地址,请求参数)
var render=function(page){
$.ajax({
type:'get',
url:'api/data.php',
data:{page:page},
dataType:'json',
success:function(data){
// 渲染页面
$('[data-page]').removeClass('now');
$('[data-page="'+data.page+'"]').addClass('now');
$('.content').html(data.html);
}
});
}
index.js
④效果展示

历史相关API的更多相关文章
- JBPM4.4_核心概念与相关API
1. 核心概念与相关API(Service API) 1.1. 概念:Process definition, process instance , execution 1.1.1. Process ...
- FreeRTOS-05任务相关API函数
根据正点原子FreeRTOS视频整理 单片机:STM32F207VC FreeRTOS源码版本:v10.0.1 任务相关API函数: 1. main.c /* * */ #include " ...
- OpenGL FrameBufferCopy相关Api比较(glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D)
OpenGL FrameBufferCopy相关Api比较 glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D 标题所述 ...
- QQ音乐的各种相关API
QQ音乐的各种相关API 分类: oc2014-01-29 15:34 2676人阅读 评论(2) 收藏 举报 基本上论坛里做在线音乐的都在用百度的API,进来发现百度的API不仅歌曲的质量不可以保证 ...
- addChildViewController相关api深入剖析
注:本文根据个人的实践和理解写成,若有不当之处欢迎斧正和探讨! addChildViewController是一个从iOS5开始支持的api接口,相关的一系列的接口是用来处理viewcontrolle ...
- [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题
关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...
- TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现
题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
随机推荐
- 10 查询字符串,X字段必须包含(不包含)XX;_all原理
指定某个字段,必须要包含XX字符 GET /beauties/my/_search?q=Name:Chang Wei 搜出 某个字段不包含XX字符 的所有内容 GET /beauties/my/_ ...
- 【转载】Asp.net网站安全:去除网站根目录下的备份文件防止代码泄露
很多网站运维人员在更新网站版本的时候,喜欢直接在网站目录文件夹中直接压缩原来的网站文件,如果这个备份压缩文件没有移动出去,这样是非常不安全的,有些网站攻击者可能会尝试访问你网站下有没有对应名字的压缩备 ...
- stage1----航空票务系统需求分析报告
航空票务管理系统需求分析报告 题 目 航空票务管理系统需求分析报告 学 院 信息科学与工程学院 专 业 计算机科学与技术 组 员 ...
- MongoDB 4.2.1 安装失败,提示 verify that you have sufficient privileges to start system services 解决
官网下载地址:https://www.mongodb.com/download-center/community 问题: 解决:直接安装在根目录 测试:
- Node学习之(第二章:http模块)
前言 继续上一节的探讨,今天我们来聊聊Node中怎么搭建一个简单的web服务器.平时大家在撸码的过程中,经常需要向服务器发送请求,然后服务器接受请求,响应数据.今天我们就来自己手写一个简单服务器,根据 ...
- 如何打包ANE
来源:http://blog.sina.com.cn/s/blog_6471e1bb01012aql.html 首先先说一下打包ANE必须的部件: 1.ActionScript扩展库SWC 2.本机扩 ...
- 微信小程序之生成图片分享 二维码分享 canvas绘制
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 添加画布 首先,在小程序里进行绘图操作需要用到<canvas>组件,步骤大致分为以 ...
- 【hadoop】hadoop3.2.0的安装并测试
前言:前段时间将hadoop01的虚拟机弄的崩溃掉了,也没有备份,重新从hadoop02虚拟上克隆过来的,结果hadoop-eclipse插件一样的编译,居然用不起了,找了3天的原因,最后还是没有解决 ...
- Spring Boot 笔记 (8) - H2 数据库
Maven 依赖 <dependency> <groupId>com.h2database</groupId> <artifactId>h2</a ...
- Linux下使用shell脚本自动备份和移动数据到大容量存储
自动备份数据库,并将备份前一天的数据移动拷贝到存储上. 需求来源是因为linux系统层的磁盘存储容量过小,数据库自动备份之后日积月累数据越来越多,而且还不想删除旧数据.那解决方法就是在linux系统主 ...