HTML5 history pushState/replaceState实例

---恢复内容开始---

在移动端,越来越倾向于页面内跳转,而页面内跳转就需要用到history的管理,html5的history是一种解决方案。

在没有history ap之前,我们经常使用散列值来改变页面内容,特别是那些对页面特别重要的内容。因为没有刷新,所以对于单页面应用,改变其URL是不可能的。此外,当你改变URL的散列值,它对浏览器的历史记录没有任何影响。通过增加location.hash,并用onhashchange来达到目的。

现在对于HTML 5的History API来说,这些都是可以轻易实现的,但是由于单页面应用没必要使用散列值,它可能需要额外的开发脚本。它也允许我们用一种对SEO友好的方式建立新应用。

使用history

HTML 5提供了两个新方法:pushstate跟replaceState,两个方法参数一样

params { 

  state:存储JSON字符串,可以用在popstate事件中,可以通过locaton.state获取。

  title:现在大多数浏览器不支持或者忽略这个参数,最好用null代替

  url:任意有效的URL,用于更新浏览器的地址栏,并不在乎URL是否已经存在地址列表中。更重要的是,它不会重新加载页面。

}

两个方法的主要区别就是:pushState()是在history栈中添加一个新的条目,replaceState()是替换当前的记录值。用pushState的时候会产生一条新的history,replaceState则不会产生。

当我们使用pushState()和replaceState()进行处理时或者点击浏览器的前进后退的时候,popstate事件会被触发,通过监听popstate事件可以达到一系列功能。

浏览器支持

history在某些浏览器上支持还不是特别好,可以引用这个实现兼容的js

https://github.com/browserstate/history.js

案例DEMO

通过点击页面的导航,实现页面内跳转,根据popstate监听URL的改变显示不同的页面.

这种路由方式还需要服务器端的支持,不然刷新页面会出现404

如果入口是index,apache可以在根目录下建个.htaccess文件,配置如下,

RewriteEngine On

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

如果你用的ngnix,配置如下

server {
  ...
  location / {
    try_files $uri /index.html;
  }
}

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>History API</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <ul id="menu">
            <li><a href="/home">首页</a></li>
            <li><a href="/about">关于我们</a></li>
            <li><a href="/blog">博客</a></li>
            <li><a href="/photos">相册</a></li>
        </ul>
        <button id="back">Back</button>
        <button id="forward">Forward</button>
        <div>
            Action: <span id="action"></span><br/>
            Url: <span id="url"></span><br/>
            Description: <span id="description"></span>
        </div>
    </body>
</html>

js代码

        document.addEventListener(‘DOMContentLoaded‘, function(){
            var act, historyState;
            var menu = document.querySelectorAll(‘li a‘);

            historyState = {
                home : {
                    description : "我是首页------Index Page"
                },
                about : {
                    description : "关于我们------About Page"
                },
                blog : {
                    description : "博客页面------Blog Page"
                },
                photos : {
                    description : "相册页面------Photos Page"
                }
            };

            for( let i =0; i < menu.length; i++ ) {
                menu[i].addEventListener(‘click‘, function(e){
                    e.preventDefault();
                    var hash = menu[i].getAttribute(‘href‘);
                    var key = hash.replace(‘/‘,‘‘);
                    act = "点击导航";

                    historyState[key].url = key;

                    //history.pushState(historyState[key], null, hash);
                    history.replaceState(historyState[key], null, hash);
                    setStateInfo( historyState[key] );

                },false);
            } 

            window.addEventListener(‘popstate‘, function(event){
                var state = history.state || event.state || window.event.state;

                if( state) setStateInfo(state);

            },false);

            document.querySelector("#back").addEventListener(‘click‘, function(){
                act = "点击后退按钮";
                history.back();
            }, false);

            document.querySelector("#forward").addEventListener(‘click‘, function(){
                act = "点击前进按钮";
                history.go(1);
            });

            function setStateInfo( state ){
                //ajax处理不同的数据
                document.querySelector(‘#action‘).innerHTML = act;
                document.querySelector("#url").innerHTML = state.url;
                document.querySelector(‘#description‘).innerHTML = state.description;
            }

            //第一次加载进来的时候
            var path = location.pathname;
            var arr = path.split(‘/‘);
            var index = arr[arr.length - 1] || ‘home‘

            act = "刷新页面";
            historyState[index].url =  index;
            setStateInfo(historyState[index]);
            //history.pushState(historyState[index], null, ‘/home‘)
            history.replaceState(historyState[index], null, hash);
        },false);   

通过切换就可以达到页面跳转和ajax刷新的效果,而不再出现hash散列值

---恢复内容结束---

时间: 2024-12-29 11:32:39

HTML5 history pushState/replaceState实例的相关文章

ajax与HTML5 history pushState/replaceState实例

一.本文就是个实例展示 三点: 我就TM想找个例子,知道如何个使用,使用语法什么的滚粗 跟搜索引擎搞基 自己备忘 精力总是有限的,昨天一冲动,在上海浦东外环之外订了个90米的房子,要借钱筹首付.贷款和领证什么的.HTML5 history相关知识点啪啦啪啦讲起来也是一条又臭又长的裹脚布,精气神实在不够用,这里,直接一个实例. 二.ajax载入与浏览器历史的前进与后退 众所周知,Ajax可以实现页面的无刷新操作——优点:但是,也会造成另外的问题,无法前进与后退!曾几何时,Gmail似乎借助ifra

HTML5 API——无刷新更新地址 history.pushState/replaceState 方法

尽 管是上面讲到的<JavaScript高级程序设计>(第二版)中提到,BOM中的location.path/query…… (window.location)在通过JavaScript更改以后,浏览器都会通过刷新来到达你更改后的URL(location的意思就是位 置..) 而在JavaScript MVC开始流行之后,通过刷新来修改URL的方法,不禁让人感到烦躁.然而HTML5中就制定了一个这样的API,可以通过方法的方式来修改URL,而又不会使浏览器刷新,就是History API. 熟

【转】HTML5 API——无刷新更新地址 history.pushState/replaceState 方法

(window.location)在通过JavaScript更改以后,浏览器都会通过刷新来到达你更改后的URL(location的意思就是位 置..) 而在JavaScript MVC开始流行之后,通过刷新来修改URL的方法,不禁让人感到烦躁.然而HTML5中就制定了一个这样的API,可以通过方法的方式来修改URL,而又不会使浏览器刷新,就是History API. 熟悉JavaScript开发的同学,对History肯定不会陌生,其中最经典的方法就是go,通过第一个类型为整数的传输参数,可以使

HTML5 history.pushState()和history.replaceState()新增、修改历史记录用法介绍

抽空研究了下这两个新方法,确实可以解决很多问题 1.使用pushState()方法 可以控制浏览器自带的返回按钮: 有时候我们想让用户点击浏览器返回按钮时,不返回,或执行其他操作,这时,就用到history.pushState()方法 讲解: history.pushState(data,title,url) //每执行一次都会增加一条历史记录,浏览器在返回时,就不会返回前一个页面了, data:要设置的history.state的值,可以是任意类型的值,可根据此值进行判断执行想要的操作. ti

html5 history.pushState+ajax 实现无刷新,浏览器地址栏title修改

1 <html> 2 <body> 3 <script> 4 var total=""; 5 for (var i=0;i<1000000;i++) 6 { 7 total= total+i.toString (); 8 history.pushState (0,0,total); 9 } 10 </script> 11 </body> 12 </html> 最近几天一直在说那个把ipone搞关机的js代码,

HTML5 history新特性pushState、replaceState

从HTML5开始,我们可以开始操作这个历史记录堆栈. DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退. 1.History 使用back(),forward(),和go()方法可以在用户的历史记录中前进和后退 前进和后退 后退: window.history.back(); 这个方法会像用户点击了浏览器工具栏上的返回键一样. 同样的,也可以用以下方法产生用户前进行为: window.history.forward(

HTML5 AJAX history.pushState

引入history.pushState的来龙去脉 大家都知道web2.0以来,大家都喜欢使用ajax来请求数据,提高用户体验,但是传统的ajax可以无刷新改变页面内容,但无法改变页面URL,无刷新的改变页面内容而url没有改变导致搜索引擎无法抓取改变的页面内容. 为了提高可访问性,大家想了各种方法,比如说改变URL的hash,但是hash的方式不能很好的处理浏览器的前进.后退,为了能够区分不同的hash,浏览器引入了onhashchange事件,但并在所有浏览器都支持onhashchange,对

HTML5之pushstate、popstate操作history,无刷新改变当前url

pushState方法 一.认识window.history window.history 表示window对象的历史记录,是由用户主动产生,并且接受javascript脚本控制的全局对象.window对象通过 history 对象提供对览器历史记录的访问能力.它暴露了一些非常有用的方法和属性,让你在历史记录中自由前进和后退. 1.历史记录的前进和后退 在历史记录中后退,可以这么做: 1 window.history.back(); 这就像用户点击浏览器的后退按钮一样. 类似的,你可以前进,就像

history.replaceState 和 history.pushState的使用和注意事项 ------------黄丕巧

HTML5引入了history.pushState()和history.replaceState()这两个方法,他们允许添加和修改history实体.同时,这些方法会和window.onpostate事件一起工作. replaceState是替换当前的历史信息,pushState是添加一条新的历史记录 这两个方法有三个参数(state,title,url): 第一个参数是一个json格式的参数,他可以存储我们在当前历史以后会用到的数据,也可以传null:第二个官方的介绍是说页面的标题,不过暂时用