8. H5 pushState/popstate + ajax开发无刷新页面

css

*{ margin: 0; padding: 0; }
.m-a{ float: left; width: 100px; }
.m-a a{ display: block; height: 30px; line-height: 30px; text-align: center; border: 1px solid #000; }
.m-a a.on{ background-color: #ccc; }
.con{ float: left; width: 300px; height: 300px; border: 2px solid green; }

html

<div class="m-a" id="J_a">
    <a href="ajax.php?area=suzhou">苏州</a>
    <a href="ajax.php?area=wuxi">无锡</a>
    <a href="ajax.php?area=changzhou">常州</a>
    <a href="ajax.php?area=zhenjiang">镇江</a>
    <a href="ajax.php?area=nanjing">南京</a>
    <a href="ajax.php?area=yangzhou">扬州</a>
    <a href="ajax.php?area=nantong">南通</a>
    <a href="ajax.php?area=huaian">淮安</a>
    <a href="ajax.php?area=taizhou">泰州</a>
    <a href="ajax.php?area=lianyungang">连云港</a>
    <a href="ajax.php?area=yancheng">盐城</a>
    <a href="ajax.php?area=suqian">宿迁</a>
    <a href="ajax.php?area=xuzhou">徐州</a>
</div>
<div class="con" id="J_con"></div>

Js

var cityCon = [
        {con: '苏州 苏州'},
        {con: '无锡 无锡'},
        {con: '常州 常州'},
        {con: '镇江 镇江'},
        {con: '南京 南京'},
        {con: '扬州 扬州'},
        {con: '南通 南通'},
        {con: '淮安 淮安'},
        {con: '泰州 泰州'},
        {con: '连云港 连云港'},
        {con: '盐城 盐城'},
        {con: '宿迁 宿迁'},
        {con: '徐州 徐州'}
    ];

    var eleMenuOn = null;
    var eleMenu = $('#J_a a').on('click', function(event) {
        var $this = $(this),
            $oCon = $('#J_con'),
            query = this.href.split('?')[1];
        eleMenuOn && eleMenuOn.removeClass('on');
        eleMenuOn = $this.addClass('on');

        $oCon.html(cityCon[$this.index()].con);

        /*
        * ajax请求
        * */

        // history处理
        var title = this.innerHTML;
        document.title = title;
        // history.pushState({}, '页面标题', 'xxx.html')
        // history.pushState(state, title, url) => 向浏览器添加记录
        // state:要跳转的url对应的信息
        // title:页面标题
        // url:要跳转的url地址,不能跨域
        if (event && /d/.test(event.button)) {         // 判断鼠标事件
            history.pushState({title: title}, title, location.href.split('?')[0] + '?' + query);
        }
        event.preventDefault();
    });

    // popstate history.go和history.back(包括用户按浏览器历史前进后退按钮)触发,并且页面无刷的时候(由于使用pushState修改了history)会触发popstate事件,事件发生时浏览器会从history中取出URL和对应的state对象替换当前的URL和history.state。通过event.state也可以获取history.state。
    window.addEventListener('popstate', function() {
        var query = location.href.split('?')[1], eleTarget = null;
        eleMenu.each(function() {
            if (this.href.split('?')[1] == query) {
                eleTarget = this;
                $(this).trigger('click');
            }
        });
        $(eleTarget).trigger('click');
    });
原文地址:https://www.cnblogs.com/zouxinping/p/5441940.html