zoukankan      html  css  js  c++  java
  • 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');
        });
  • 相关阅读:
    Android Service学习之AIDL, Parcelable和远程服务
    数据结构&算法实践—【排序|交换排序】地精排序及改进
    Android: INSTALL_FAILED_UPDATE_INCOMPATIBLE错误解决措施
    重构改善既有代码的设计:对象之间移动特性的八种方法(五)
    重构改善既有代码的设计:简化条件表达式(七)
    [Innost]Android深入浅出之Binder机制
    Android: R cannot be resolved to a variable
    Python xml属性/节点/文本的增删改[xml.etree.ElementTree]
    数据结构&算法实践—【排序|插入排序】插入排序
    重构改善既有代码的设计:简化函数调用 (八)
  • 原文地址:https://www.cnblogs.com/zouxinping/p/5441940.html
Copyright © 2011-2022 走看看