AJax技术

一步步学习javascript基础篇(9):ajax请求的回退

字号+ 作者:H5之家 来源:H5之家 2017-04-25 08:01 我要评论( )

需求1:ajax异步请求url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果)ajax异步请求没问题,问题一般出在刷新url后请求的数据没了,这就是因为

需求1:

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

    如,博客园的分页就是如此

     

    demo1:

    ul { list-style ul li { float margin-leftdemo1(默认的回退效果)tab1tab2tab3tab4tab5主页 $(function () { window.location.hash; $().click(); }) $( (e) { ; ); $.get( value); }, ); });

     

    效果图:

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

      需求2:

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

    demo2:

    主页 $(function () { window.location.hash; $().click(); }) ; $( (e) { num--; ; ); $.get( (obj) { $( value); }, ); }); function go() { history.go(num) }

     

    效果图:

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

      需求3:

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

    demo3:

    主页 $(function () { window.location.hash; $().click(); }) $( (e) { ); $.get( (obj) { $( value); }, ); }); if (history.pushState) { window.onpopstate = function () { window.location.hash; $().click(); } }

     

    效果图:

    乍一看,好像很完美了。其实不然。我们debugger调试一看便知。

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

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

      需求4:

    $(function () { window.location.hash; $().click(); }) $( (e) { debugger e.preventDefault();); $.get( (obj) { $( value); ); }); if (history.pushState) { window.onpopstate = function () { debugger; window.location.hash; $().click(); debugger } }

     

    (这需要注意  if (e && e.clientX) //用来判断是否是鼠标点击触发 如果没有这句,那么每次触发onpopstate 的时候往历史记录里面塞进去一条,那样就死循环出不来了。)

    效果图:

    明显可以看出只执行了一次a标签的点击事件,且回退功能也是正常。按道理,现在已经是完美了。不过,我们回过头来想想,我们为什么一定要使用锚点来记录参数呢。以前是因为修改锚点不会重新请求url而巧用了锚点。现在我们通过history.pushState把url塞入历史记录的时候,也改变了当前url且也没有对url发送请求,那我们是不是没有必要使用锚点了呢?答案是确定的。

     

    需求4:

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

    demo4:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评