简易基础版单页面应用

写在开头:

在网上看到一篇介绍实现简易基础版单页面应用的分享,贴上原地址:  
[https://segmentfault.com/a/1190000003786176](https://segmentfault.com/a/1190000003786176)。
先是跟着文章中一步步实现,后面又加上了一些自己想法。

基础代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
</head>
<body>
    <div id="app">
        <nav id="nav"></nav>
        <div id="container"></div>
    </div>
    <script type="text/javascript" src="js/jQuery.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
</body>
</html>

app.js

var $nav = $("#nav");
var sLi = ["home", "about", "article", "history"].reduce(function(pre, n) {
    return pre + "<li><a href='/" + n + "'>" + n + "</a></li>";
}, "");
var sUl = "<ul>" + sLi + "</ul>";
$nav.html(sUl);

var $container = $("#container");
$("#nav ul li").on("click", function() {
    var route = $(this).find("a").text();
    history.pushState({ title: route }, route, route);
    show();
    return false;
});

function show() {
    var route = window.location.pathname;
    if (route === "/home" || route === "/") {
        $.get("/api/home", function(data) {
            $container.html(data.join("") + "!");
        });
    } else {
        $container.html("这是" + route + "区域哦");
    }
}
show();
window.addEventListener("popstate", show);

test.json

{
    "lis": ["今", "天", "是", "个", "好", "天", "气"]
}

发现问题

    当地址栏的地址为:[http://127.0.0.1:8011/home]或者其他的时候刷新页面,页面显示404。因为我并没有home.html。所以对app.js做了一些调整
var $nav = $("#nav");
var sLi = ["home", "about", "article", "history"].reduce(function(pre, n) {
    return pre + "<li><a href='/" + n + "'>" + n + "</a></li>";
}, "");
var sUl = "<ul>" + sLi + "</ul>";
$nav.html(sUl);

var $container = $("#container");
$("#nav ul li").on("click", function() {
    var route = $(this).find("a").text();
    history.pushState({ title: route }, null, "#/" + route);
    show();
    return false;
});

function show() {
    var route = window.location.hash;
    if (route === "#/home" || route === "" || route === "#/") {
        $.get("data/test.json", function(data) {
            $container.html(data.lis.join("") + "!");
        });
    } else {
        $container.html("这是" + route + "区域哦");
    }
}
show();
window.addEventListener("popstate", show);

分析修改内容

1. history.pushState({ title: route }, null, "#/" + route);
   把地址改为"/#/XXX"。这是参考网易云音乐的pc网站,加了“#”,刷新的就是当前页面。

2. var route = window.location.hash;
   地址改为"/#/XXX"之后,window.location.pathname获取得到的全部都是"/",window.location.hash获取的是"#/XXX"
原文地址:https://www.cnblogs.com/my93/p/5694697.html