zoukankan      html  css  js  c++  java
  • jQuery ajax queue

    文如其名,介绍jQuery实现的ajax队列。

    有这个需求一般是同指向同一网址的同一个重复请求,比如注册的时候验证邮箱、用户名等,不用队列的话,单个客户端就可以频繁发出无数的ajax请求出去,我以前居然一直是用的一个我自己叫做ajaxlock的东西,(其实就是设一个变量,到ajax响应成功才把这个变量释放),这次了解了一下队列,用它的话方便多了,

    首先,模拟一个服务器页面,test.php

    <?PHP
    	sleep(5);
    	exit(time().'');
    ?>

    然后是前台页面,假设由一个元素触发:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    		<title>测试ajax队列</title>
    	</head>
    <body>
    	<div id="dtitle">点此触发</div>
    </body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script type="text/javascript" src="test.js"></script>
    </html>
    $(function(){
    	$("body").queue([]);
    	$("#dtitle").click(function(){
    	$("body").queue(function(n){$.get("test.php?t="+new Date().getMilliseconds(),function(){n();});});
    	});
    });

    才三句话,逐句解释:

    第一行,把一个队列绑定到任何一个dom元素上面去,我选择了body,而且队列初始化为空,并且队列名用了默认的"fx"

    第二行,绑定元素的click事件

    第三行,click执行的方法,,每次把fx队列添加一个新元素进去,参数n指向了队列中的下一个元素,我选择在了ajax请求完成后才执行这个n方法,这样就把jquery对于队列的自动执行和ajax请求成功给关联了起来。

    当然,我写得相当简练了,没用过的反而会感到不知所云,仔细阅读一下API吧

    下面是firebug下的执行结果,我连续对dtitle元素点击三次,如愿每5秒才发送一次请求。当然这只是演示的原理,既然发了三次请求,肯定要以最后一次为准,那么可以通过队列的length属性来轮循,一时length变为0了,就是全部请求结束了,你就可以执行你想要的逻辑了

    image

    好吧,送佛到西,把test.js文件改成:

    $(function(){
    	$("body").queue([]);
    	$("#dtitle").click(function(){
    		$("body").queue(function(n){$.get("test.php?t="+new Date().getMilliseconds(),function(){
    			n();
    			if($("body").queue().length==0) alert("done");
    		});});
    	});

    也就是只在n();方法后加了一个判断,上面是演示怎么判断队列为空的

    人总是懒的,我懒于为每一个队列起名字,当需要ajax请求的东西很多的时候,比如一个注册表单,你要验证邮箱,昵称,邀请码等,

    那么这么默认的队列名"fx"能用给每一个元素么?于是我把上面的test.js再次改成

    $(function(){
    	$("body").queue([]);
    	$("#dtitle").queue([]);
    	$("#dtitle").click(function(){
    		$("body").queue(function(n){$.get("test.php?t="+new Date().getMilliseconds(),function(){
    			n();
    			console.log("A:"+$("body").queue().length+","+$("#dtitle").queue().length);
    		});});
    		$(this).queue(function(n){$.get("test.php?t="+new Date().getMilliseconds(),function(){
    			n();
    			console.log("B:"+$("body").queue().length+","+$("#dtitle").queue().length);
    		});});
    	});
    });

    我给body和dtitle元素分别指定了一个队列,并且都用了默认的队列名,我连续触发了4次请求,看结果:

    image

    可见两个队列是独立的,这样我们要验证表单元素,只要每个元素绑定自己的队列就可以了。

  • 相关阅读:
    面试中遇到递归算法题别慌--常见递归算法题的解题思路
    Xml日志记录文件最优方案(附源代码)
    linux下源码安装软件
    文本比较算法Ⅴ——回顾贴,对前面几篇文章的回顾与质疑
    从内存中直接运行PE程序
    谈谈Linux内核驱动的coding style
    【全面解禁!真正的Expression Blend实战开发技巧】第六章 认识ListBox
    玩转C链表
    麻省理工《C内存管理和C++面向对象编程》笔记---第一讲:认识C和内存管理
    Dll注入技术之输入法注入
  • 原文地址:https://www.cnblogs.com/walkerwang/p/1916386.html
Copyright © 2011-2022 走看看