javascript介绍ajax,javascript的ajax请求的回退介绍

本章给大家带来javascript的ajax请求的回退介绍,让大家可以了解关于ajax的一些知识。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

需求1:ajax异步请求

url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果)

ajax异步请求没问题,问题一般出在刷新url后请求的数据没了,这就是因为url没有记录参数。如果我们改变给url添加参数,这样就改变了url,也就会重新请求整个url。这样一来就没有了ajax的优势和作用了。那么,我们应该怎么保持参数而又不重新请求url呢?做过单页面SPA (Single-page Application)的都知道,我们可以使用描点来实现(因为修改描点的时候,不会发送url的重新请求)。

a8ef35f0e8bfd28d20bff3be7898cb0e.png

代码:

ul {

list-style: none;

}

ul li {

float: left;

margin-left: 10px;

}

demo1(默认的回退效果)

主页

$(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");

});

效果图:

1d9cef2fe1d566c584a9c2116537b3b5.gif

我们认真看上面的gif动态图,会发现点击tab的ajax异步加载完全没问题,只是我们点击回退的时候 虽然url的描点变了,可是内容没变。这肯定是不太好的效果。

需求2:ajax异步请求

url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果)

点击“回退”页面要可以回到“主页”

通过观察上面的gif动图,我们发现回退的顺序正是,url的改变记录顺序。那我们在每次点击一个ajax请求累加一次计数,这样是不是就可以一次性退回“主页”呢?

代码:

主页

$(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)

}

效果图:

baefdaac70bc56e64c020b6aeb7bb48f.gif

ok,效果是我们要的。可是需求又说了,感觉这样还是不太好,回退应该是返回上一次的点击效果。

需求3:ajax异步请求

url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果)

点击“回退”返回上一次的点击效果

拿到需求开始头痛了,怎么回退到上一次点击效果呢?有没有什么回退事件呢?还好H5给我们准备了 window.onpopstate url监听事件。

代码:

主页

$(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();

}

}

效果图:

2133ed7e13385ae12c9c78218effdac9.gif

乍一看,好像很完美了(url和内容同时发生了对应的改变)。其实不然。我们debugger调试一看便知。

fcf418e2f4563c21fc2da08869d0c286.gif

仔细看上图,你会发现 $("ul").click( a标签出现了两次点击事件(这明显是有瑕疵的),首先直接点击a标签触发,然后改变了url导致触发onpopstate事件,然后在onpopstate事件里面又一次点击a标签,最后导致了两次执行a标签点击事件。

854854c82d72d827340dfafd9c2692f2.png

那么如何,避免执行两次a标签的点击事件呢?思路肯定是怎样在修改url的时候不触发onpopstate事件,只有在前进和回退的时候触发。这里就要用到 history.pushState 了。

需求4:ajax异步请求

url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果)

点击“回退”返回上一次的点击效果(不使用描点)

代码:

$(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();

});

}

效果图:

c73c7fb18641d720f57910aab84c0c95.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值