利用HTML5新特性改變瀏覽器地址后不刷新頁面


       作為一個程序員,上GitHub必然是很經常的一件事情。細心的同學會發現當我們在瀏覽項目源碼的時候,進入文件夾后Url地址發生改變后,內容很快就加載好了。起初還以為是刷新了頁面加載的,但刷新頁面速度也快的離譜了吧。於是F12監控下網絡請求,發現是進行了Ajax請求。很是神奇,Url地址發生改變不是會刷新頁面嗎(#號后面的除外啦)?什么情況?猜想肯定是HTML5這個東東里面的新特性。Google搜索下果然如此,是history.pushState 這個新東西。於是自動動手測試實現起來了。

 

  • 實現效果如圖,點擊面包屑導航下面的內容進行Ajax加載頁面內容。

  • MVC頁面代碼 ,Ajax 請求只是返回一個內容
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width" />
        <title>@ViewBag.Title</title>
        @Styles.Render( "~/Content/css" )
        @Scripts.Render( "~/bundles/modernizr" )
    </head>
    <body>
    
        <div>
            <a href="/">首頁</a> / <a href="/home/news">公司新聞</a>  / <a href="/home/news/1">新品速遞</a>
        </div>
        <br />
        <div id="page">
            @RenderBody()
        </div>
        @Scripts.Render( "~/bundles/jquery" )
        @RenderSection( "scripts", required: false )
    
        <script type="text/javascript">
            $(function () {
                window.onpopstate = function (e) {
                    //點擊瀏覽器的前進后退按鈕處理
                    if (e.state) {
                        document.title = e.state.title;
                        $.ajax({
                            type: "get",
                            url: e.state.url,
                            success: function (data) {
                                $("#page").html(data)
                            },
                            error: function (data) {
    
                            }
                        })
                    }
                }
    
                //處理點瀏覽器返回時候最后一個不刷新頁面內容問題
                var state = {
                    title: document.title,
                    url: document.location.href,
                    otherkey: null
                };
                history.replaceState(state, document.title, document.location.href);
    
    
                $("a").click(function () {
                    var _href = $(this).attr("href");
                    $.ajax({
                        type: "get",
                        url: _href,
                        success: function (data) {
    
                            //加入到歷史狀態里面
                            var state = {
                                title: data,
                                url: _href,
                                otherkey: null
                            };
                            history.pushState(state, data, _href);
                            
    
                            $("#page").html(data)
                        },
                        error: function (data) {
    
                        }
                    })
    
                    return false;
                })
            })
        </script>
    </body>
    </html>

     

  • 總結:剛查資料看到時候覺得就是調用一個js就可以搞定,但做demo的時候會發現存在一個一個問題,例如:瀏覽器前進后退時候頁面不更新,解決更新后又發現后退到進入的第一個頁面時候還是有問題,最后通過
    history.replaceState 這個去實現的,從而達到了類似github源碼文件加載類似效果。

 

demo源碼下載

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM