单页面实现之hash

至学了angularJs后,发现这个单页面应用不知道在没有angularJs的情况下怎么实现。

所以就此对这个思考与资料并行,终于知道这个的实现基本原理。

首先angularJs的实现是hash值的变化,就是url#后的内容,但angularJs是对其进行了处理的,所以

观察不到#这个值,然后是每次点击导航都会转换页面,angularJs是在一个类名是ng-view的div容器中实现的。

所以angularJs是删除类名为ng-view里的内容后添加内容,那我们是不是可以简单的,显示和隐藏内容呢?

所以就是动手实现。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hash深入</title>
    <style>
    html,body{
        width: 100%;
        height: 100%;
    }
    *{
        margin: 0;
        padding: 0;
    }
    ul{
        overflow: hidden;
        list-style: none;
    }
    ul li{
        float: left;
        margin-left: 10px;
    }
    .div{
        display: none;
        width: 100%;
        height: 100%;
    }
    .div1{
        background: red;
    }
    .div2{
        background: blue;
    }
    .div3{
        background: pink;
    }
    .div4{
        background: skyblue;
    }
    </style>
</head>
<body>
<!-- 需要自定义属性来实现关联 -->
    <ul>
        <li><a href="javascript:;" data-hash="one">首页</a></li>
        <li><a href="javascript:;" data-hash="two">页面一</a></li>
        <li><a href="javascript:;" data-hash="three">页面二</a></li>
        <li><a href="javascript:;" data-hash="four">页面三</a></li>
    </ul>
    <div class="div1 div" data-hash="one">首页</div>
    <div class="div2 div" data-hash="two">页面二</div>
    <div class="div3 div" data-hash="three">页面三</div>
    <div class="div4 div" data-hash="four">页面四</div>
    <script>
        var aNav=document.querySelectorAll("ul li a");
        var aPage=document.querySelectorAll(".div");
        for(var i=0;i<aNav.length;i++){
            aNav[i].onclick=function(){
                // dataset获取自定义属性
                    hash=this.dataset.hash;
                    for(var i=0;i<aPage.length;i++){
                        if(hash==aPage[i].dataset.hash){
                            // 显示匹配的页面
                            aPage[i].style.display="block";
                            // 改变url路径的hash
                            window.location.hash=hash;
                        }else{
                            // 隐藏其他页面
                            aPage[i].style.display="none";
                        }
                    }
                }
        }
        // 因刷新等有hash但不能显示目标页面而实现目标的显示
        refresh();
        function refresh(){
            var currentHash=window.location.hash.substr(1) || "one";
            for(var i=0;i<aPage.length;i++){
                        if(currentHash==aPage[i].dataset.hash){
                            aPage[i].style.display="block";
                            window.location.hash=currentHash;
                        }else{
                            aPage[i].style.display="none";
                        }
                    }
        }
        // 监听hash的变化,触发事件
        window.onhashchange=function(){
            // refresh()
            window.location.reload();
        }
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/zhangzhicheng/p/6195418.html