一步步學習javascript基礎篇(9):ajax請求的回退


需求1:

  • ajax異步請求
  • url標識請求參數(也就是說復制url在新頁面打開也會是ajax后的效果)

ajax異步請求沒問題,問題一般出在刷新url后請求的數據沒了,這就是因為url沒有記錄參數。如果我們改變給url添加參數,這樣就改變了url,也就會重新請求整個url。這樣一來就沒有了ajax的優勢和作用了。那么,我們應該怎么保持參數而又不重新請求url呢?做過單頁面SPA (Single-page Application)的都知道,我們可以使用描點來實現(因為修改描點的時候,不會發送url的重新請求)。

如,博客園的分頁就是如此

 

demo1:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        ul {
            list-style: none;
        }

            ul li {
                float: left;
                margin-left: 10px;
            }
    </style>
</head>
<body>
    <div style="color: red; margin-left: 50px; ">demo1(默認的回退效果)</div>
    <div>
        <ul>
            <li><a href="#tab1">tab1</a></li>
            <li><a href="#tab2">tab2</a></li>
            <li><a href="#tab3">tab3</a></li>
            <li><a href="#tab4">tab4</a></li>
            <li><a href="#tab5">tab5</a></li>
        </ul>

    </div>
    <input style="margin-left:15px" type="button" value="回退" onclick="history.go(-1)" />
    <a href="home.html">主頁</a> 
    <div class="content" style="font-size:44px;color:red;margin-top:50px;text-align:center">

    </div>
    
    <script src="../../Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        $(function () {
            //刷新url時停留ajax的效果
            var hash = window.location.hash;
            $("ul").find("a[href='" + hash + "']").click();
        })
        $("ul").click(function (e) {

            if (e.target.localName != "a") return;

            var value = $(e.target).attr("href");
            $.get("temp.html", value, function (obj) {//ajax的get請求
                //請求發送成功后修改頁面元素內容
                $(".content").html("我是" + value);
            }, "text");
        });
    </script>
</body>
</html>

 

效果圖:

我們認真看上面的gif動態圖,會發現點擊tab的ajax異步加載完全沒問題,只是我們點擊回退的時候 雖然url的描點變了,可是內容沒變(博客園的分頁回退就是這個效果)這肯定是不太好的效果。(對history.go()不太了解的請戳

 

需求2:

  • ajax異步請求
  • url標識請求參數(也就是說復制url在新頁面打開也會是ajax后的效果)
  • 點擊“回退”頁面要可以回到“主頁”

通過觀察上面的gif動圖,我們發現回退的順序正是,url的改變記錄順序。那我們在每次點擊一個ajax請求累加一次計數,這樣是不是就可以一次性退回“主頁”呢?

demo2:

<input style="margin-left:15px" type="button" value="回退" onclick="go()" />
    <a href="home.html">主頁</a>
    <div class="content" style="font-size:44px;color:red;margin-top:50px;text-align:center">

    </div>
    <script src="../../Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        $(function () {
            //刷新url時停留ajax的效果
            var hash = window.location.hash;
            $("ul").find("a[href='" + hash + "']").click();
        })

        var num = -1;
        $("ul").click(function (e) {
            num--;
            if (e.target.localName != "a") return;

            var value = $(e.target).attr("href");
            $.get("temp.html", value, function (obj) {
                $(".content").html("我是" + value);
            }, "text");
        });

        function go() {
            history.go(num)
        }
    </script>

 

效果圖:

ok,效果是我們要的。可是需求又說了,感覺這樣還是不太好,回退應該是返回上一次的點擊效果。

 

需求3:

  • ajax異步請求
  • url標識請求參數(也就是說復制url在新頁面打開也會是ajax后的效果)
  • 點擊“回退”返回上一次的點擊效果

拿到需求開始頭痛了,怎么回退到上一次點擊效果呢?有沒有什么回退事件呢?還好H5給我們准備了 window.onpopstate url監聽事件。

demo3:

<input style="margin-left:15px" type="button" value="回退" onclick="history.go(-1)" />
    <a href="home.html">主頁</a>
    <div class="content" style="font-size:44px;color:red;margin-top:50px;text-align:center">

    </div>
    
    <script src="../../Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript">
        $(function () {
            //刷新url時停留ajax的效果
            var hash = window.location.hash;
            $("ul").find("a[href='" + hash + "']").click();
        })

        $("ul").click(function (e) {         

            if (e.target.localName != "a") return;//如果點擊的不是a標簽直接返回

            var value = $(e.target).attr("href");
            $.get("temp.html", value, function (obj) {
                $(".content").html("我是" + value);
            }, "text");
        });

        if (history.pushState) {            
            window.onpopstate = function () {
                var hash = window.location.hash;
                $("ul").find("a[href='" + hash + "']").click();
            }
        } 
    </script>

效果圖:

乍一看,好像很完美了(url和內容同時發生了對應的改變)。其實不然。我們debugger調試一看便知。

仔細看上圖,你會發現  $("ul").click( a標簽出現了兩次點擊事件(這明顯是有瑕疵的),首先直接點擊a標簽觸發,然后改變了url導致觸發onpopstate事件,然后在onpopstate事件里面又一次點擊a標簽,最后導致了兩次執行a標簽點擊事件。

那么如何,避免執行兩次a標簽的點擊事件呢?思路肯定是怎樣在修改url的時候不觸發onpopstate事件,只有在前進和回退的時候觸發。這里就要用到 history.pushState 了。

 

需求4:

  • ajax異步請求
  • url標識請求參數(也就是說復制url在新頁面打開也會是ajax后的效果)
  • 點擊“回退”返回上一次的點擊效果(但是不能執行多余代碼)
 <script type="text/javascript">
        $(function () {
            //刷新url時停留ajax的效果
            var hash = window.location.hash;
            $("ul").find("a[href='" + hash + "']").click();
        })

        $("ul").click(function (e) {
            debugger
            e.preventDefault();//不要執行與事件關聯的默認動作

            if (e.target.localName != "a") return;//如果點擊的不是a標簽直接返回

            var value = $(e.target).attr("href");
            $.get("temp.html", value, function (obj) {
                $(".content").html("我是" + value);
                if (e && e.clientX) //用來判斷是否是鼠標點擊觸發
                    history.pushState(null, value, location.href.split("#")[0] + value);//塞入歷史記錄,並改變當前url
            }, "text");
        });

        if (history.pushState) {
            window.onpopstate = function () {
                debugger;
                var hash = window.location.hash;
                $("ul").find("a[href='" + hash + "']").click();
                debugger
            }
        }
    </script>

(這需要注意  if (e && e.clientX) //用來判斷是否是鼠標點擊觸發 如果沒有這句,那么每次觸發onpopstate 的時候往歷史記錄里面塞進去一條,那樣就死循環出不來了。)

效果圖:

明顯可以看出只執行了一次a標簽的點擊事件,且回退功能也是正常。按道理,現在已經是完美了。不過,我們回過頭來想想,我們為什么一定要使用錨點來記錄參數呢。以前是因為修改錨點不會重新請求url而巧用了錨點。現在我們通過history.pushState把url塞入歷史記錄的時候,也改變了當前url且也沒有對url發送請求,那我們是不是沒有必要使用錨點了呢?答案是確定的。

 

需求4:

  • ajax異步請求
  • url標識請求參數(也就是說復制url在新頁面打開也會是ajax后的效果)
  • 點擊“回退”返回上一次的點擊效果(不使用描點)

其實,直接把上面代碼修改部分就可以了。

demo4:

 <script type="text/javascript">
        $(function () {
            //刷新url時停留ajax的效果
            var hash = location.href.split("?")[1];
            $("ul").find("a[href='" + hash + "']").click();
        })

        $("ul").click(function (e) {
            e.preventDefault();//不要執行與事件關聯的默認動作

            if (e.target.localName != "a") return;

            var value = $(e.target).attr("href");
            if (e && e.clientX) //用來判斷是否是鼠標點擊觸發
                history.pushState(null, null, location.href.split("?")[0] + "?" + value);//塞入歷史記錄,並改變當前url
            $.get("temp.html", value, function (obj) {
                document.title = value;
                $(".content").html("我是" + value);
            }, "text");
        });

        if (history.pushState) {
            window.addEventListener("popstate", function () {
                var hash = location.href.split("?")[1];
                $("ul").find("a[href='" + hash + "']").click();
            });
        }
    </script>

 

效果圖:

 

完整演示地址:http://hi.haojima.net/demo/history/home.html

 

以上內容都是胡說八道。

好了,關於ajax回退效果就分析到這里了。感謝您的閱讀,希望對您有一點點作用。

文章首鏈:http://www.cnblogs.com/zhaopei/p/5637889.html

 


免責聲明!

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



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