•多个ajax请求同时发送普京网址:,也就是新的请求

•多个ajax请求同时发送,相互无依赖。
•多个ajax请求相互依赖,必须有先后顺序。
•多个请求被同时发送,只需要最后一个请求。
第1种case
应用场景:
这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序。
处理方案:
直接用jquery的ajax函数。这个用的非常多,这里从略,可看后面的代码中例子。
第2种case
应用场景:
多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如:
用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然不是太恰当,但基本就是这个意思了)。
处理方法:
1.
利用ajax参数async设置为false,进行同步操作。(这个方法只适合同域操作,跨域需使用下面两种方法)

假期里没事就想着改进下,改得地方不多,主要有以下三点:
complete回调在jquery1.5以后可以是一个函数数组,按数组顺序调用。
如果前一个请求未返回,新的请求发出,那么撤销前一个请求,也就是新的请求“覆盖”原请求。
写成面向对象的形式,再用一个AjaxManage进行简单的管理。
代码如下,详细可看注释:

复制代码 代码如下:

因公司需要做一个仿百度搜索框,并且带Value值的, 网上找了下只有Text,
都没带Value的 所以做了个.
直接贴代码。

  1. 利用ajax嵌套(这个同第1种情况)
  2. 利用队列进行操作
    jquery ajax队列操作核心代码:

复制代码 代码如下:

// 创建 XHR 对象
var xhr;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
xhr = new ActiveXObject(“Msxml2.XMLHTTP”);
}
else {
throw new Error(“Ajax is not supported by this browser”);
}
function ready()
{
alert(“Start……”);
// 通过事件来处理异步请求
xhr.onreadystatechange = function()
{
if( xhr.readyState == 4 )
{
alert( “Ready.”);
if( xhr.status == 200 )
{
alert(“成功获得服务器返回的结果.”);
// 请求结束之后,可以获取服务器返回的内容
alert( xhr.responseText );
// 获取服务器返回的 json 对象
var alice = eval( “(” + xhr.responseText + “)” );
alert( alice.name );
}
}
};
// 设置请求参数
xhr.open(“get”, “data.json” );
xhr.send( null );
}

复制代码 代码如下:

复制代码 代码如下:

;(function($) {
// override:新的请求是否要覆盖之前的请求
function AjaxQueue(override) {
this.override = !!override;
};
AjaxQueue.prototype = {
requests: new Array(),
offer: function(options) {
var _self = this;
var xhrOptions = $.extend({}, options, {
complete: function(jqXHR, textStatus) {
// 支持complete是函数数组的情况
if($.isArray(options.complete)) {
var funcs = options.complete;
for(var i = 0, len = funcs.length; i < len; i++)
funcs[i].call(this, jqXHR, textStatus);
} else {
if(options.complete)
options.complete.call(this, jqXHR, textStatus);
}
// 处理结束,从队列中发出下一个ajax请求
_self.poll();
},
beforeSend: function(jqXHR, settings) {
if(options.beforeSend)
var ret = options.beforeSend.call(this, jqXHR, settings);
// 如果当前ajax请求因为某些原因被撤销了,那么去发下一个ajax请求
if(ret === false) {
_self.poll();
return ret;
}
}
});
// 如果支持覆盖,那么调用replace
if(this.override) {
// console.log(‘go override’);
this.replace(xhrOptions);
// 反之放入队列
} else {
// console.log(‘go queue’);
this.requests.push(xhrOptions);
if(this.requests.length == 1) {
$.ajax(xhrOptions);
}
}
},
// 撤销前一个请求,发送新的请求
replace: function(xhrOptions) {
var prevRet = this.peek();
if(prevRet != null) {
// jquery源码中可以看到此方法
prevRet.abort();
}
this.requests.shift();
this.requests.push($.ajax(xhrOptions));
},
// 轮询队列 发送下一个请求
poll: function() {
if(this.isEmpty()) {
return null;
}
var processedRequest = this.requests.shift();
var nextRequest = this.peek();
if(nextRequest != null) {
$.ajax(nextRequest);
}
return processedRequest;
},
// 返回队列头部的请求
peek: function() {
if(this.isEmpty()) {
return null;
}
var nextRequest = this.requests[0];
return nextRequest;
},
// 判断队列是否为空
isEmpty: function() {
return this.requests.length == 0;
}
};
var queue = {};
// 管理AjaxQueue的简单对象
var AjaxManager = {
// 创建新的ajaxQueue
createQueue: function(name, override) {
return queue[name] = new AjaxQueue(override);
},
// 清除对应name的ajaxQueue
destroyQueue: function(name) {
if(queue[name]) {
queue[name] = null;
delete queue[name];
}
},
// 根据name得到对应的ajaxQueue
getQueue: function(name) {
return ( queue[name] ? queue[name] : null);
}
};
// 跟jQuery关联起来,给个简称,方便调用
$.AM = AjaxManager;
})(jQuery);

jQuery 简单地包装了对 xhr 对象的使用,通过对 jQuery
对象增加常用的访问方法,然后,提供给 jQuery 对象来使用。

(function($) {
var timeid;
var lastValue;
var options;
var c;
var d;
var t;
$.fn.autoComplete = function(config) {
c = $(this);
var defaults = {
width: c.width(), //提示框的宽度 默认跟文本框一样
maxheight: 150, //提示框的最大高度
top: 6, //与文本框的上下距离
url: “”, //ajax 请求地址
type: “post”, //ajax 请求类型
async: false, //是否异步请求
autoLength: 0, //文本长度大于0 就请求服务器
getValue: function(value){ }, //当回车 或 鼠标点击选中值的时候执行
clearValue: function(){ }, //当重新请求时清空Value值
getText: function(text){ } //当回车 或 鼠标点击选中值的时候执行
};
options = $.extend(defaults, config);
var p = c.position();
d = $(‘<div id=”autoComplete_Group”></div>’);
c.after(d);
d.css({ “left”: p.left, “top”: p.top + c.height() + options.top,
“width”: options.width, “max-height”: options.maxheight });
t = $(‘<table cellspacing=”0″ cellpadding=”2″></table>’);
d.append(t);
d.append(‘<input style=”display:none” />’);
c.bind(“keydown”, keydown_process);
c.bind(“keyup”, keyup_process);
c.bind(“blur”, blur_process);
d.bind(“focus”, focus_div);
d.bind(“mouseout”, mouseout_div);
}
function blur_process()
{
timeid = setTimeout(function(){
d.hide();
},200);
}
function mouseout_div()
{
t.find(“.nowRow”).removeClass(“nowRow”);
}
function focus_div()
{
clearTimeout(timeid);
c.focus();
}
function keydown_process(e)
{
if(d.is(“:hidden”)){
return;
}
switch(e.keyCode)
{
case 38:
e.preventDefault();
var p = t.find(“.nowRow”).prev();
if(p.length > 0){
d.setScroll(options.maxheight, p);
p.mouseover();
}else{
p = t.find(“tr:last”);
if(p.length > 0){
d.setScroll(options.maxheight, p);
p.mouseover();
}
}
break;
case 40:
e.preventDefault();
var n = t.find(“.nowRow”).next();
if(n.length > 0){
d.setScroll(options.maxheight, n);
n.mouseover();
}else{
n = t.find(“tr:first”);
if(n.length > 0){
d.setScroll(options.maxheight, n);
n.mouseover();
}
}
break;
case 13:
e.preventDefault();
var n = t.find(“.nowRow”);
if(n.length > 0){
options.getValue(n.find(“input:hidden”).val());
c.val(n.text());
options.getText(c.val());
lastValue = “”;
d.hide();
}
break;
}
}
function keyup_process(e)
{
if(e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode ==
37 || e.keyCode == 39){
return;
}
if(c.val().length > options.autoLength){
if(c.val() == lastValue){
return; //判断是否跟上一次的值相等, 考虑到用户正在打字
避免相同的值多次请求
}
lastValue = c.val(); //记录请求值
options.clearValue(); //清空值
getData(c, function(data){
if(data.length == 0){
d.hide();
return;
}
t.find(“tr”).remove();
$.each(data, function(){
t.append(‘<tr><td>’ + this.text + ‘<input type=”hidden”
value=”‘ + this.value + ‘” /></td></tr>’);
});
var rows = t.find(“tr”);
rows.mouseover(function(){
t.find(“.nowRow”).removeClass(“nowRow”);
$(this).addClass(“nowRow”);
});
rows.click(function(){
options.getValue($(this).find(“input:hidden”).val());
c.val($(this).text());
options.getText(c.val());
lastValue = “”;
d.hide();
});
c.setPosition();
d.show();
});
}else{
lastValue = “”;
d.hide();
}
}
function getData(o,process)
{
$.ajax({
type: options.type,
async: options.async, //控制同步
url: options.url,
data: o.attr(“id”) + “=” + o.val(),
dataType: “json”,
cache: false,
success: process,
Error: function(err) {
alert(err);
}
});
}
$.fn.resetEvent = function()
{
c.bind(“keydown”, keydown_process);
c.bind(“keyup”, keyup_process);
c.bind(“blur”, blur_process);
d.bind(“focus”, focus_div);
d.bind(“mouseout”, mouseout_div);
}
$.fn.setPosition = function()
{
var p = c.position();
d.css({ “left”: p.left, “top”: p.top + c.height() + options.top });
}
$.fn.setScroll = function(h, o)
{
var offset = o.offset();
if(offset.top > h){
$(this).scrollTop(offset.top – h);
}else{
if(offset.top < 25){ //项的高度 对应样式表 td height:25px
$(this).scrollTop(0);
}
}
}
})(jQuery);

(function ($) {
var ajaxRequest = {};
$.ajaxQueue = function (settings) {
var options = $.extend({ className: ‘DEFEARTNAME’ }, $.ajaxSettings,
settings);
var _complete = options.complete;
$.extend(options, {
complete: function () {
if (_complete)
_complete.apply(this, arguments);
if ($(document).queue(options.className).length > 0) {
$(document).dequeue(options.className);
} else {
ajaxRequest[options.className] = false;
}
}
});
$(document).queue(options.className, function () {
$.ajax(options);
});
if ($(document).queue(options.className).length == 1 &&
!ajaxRequest[options.className]) {
ajaxRequest[options.className] = true;
$(document).dequeue(options.className);
}
};
})(jQuery);

其实也想再加上done,fail,always等配置,但或许会变得有点复杂,就先保持简单
这里有两个我的jsfiddle页面,一个是覆盖效果的,一个是队列效果的,可以直接测试运行。
就到这里,如有问题,欢迎指出,thanks。

复制代码 代码如下:

复制代码 代码如下:

第3中case
应用场景:
比较典型的是autocomplete控件的操作,这个我们可以使用第2种情况的处理方法,但我们可能只需要最后次按键后返回的结果,这样利用第2种处理方法未免有些浪费。
处理方法: 保留最后一次请求,cancel之前的请求。

您可能感兴趣的文章:

  • jQuery中clearQueue()方法用法实例
  • jQuery中dequeue()方法用法实例
  • jQuery中queue()方法用法实例
  • jquery队列queue与原生模仿其实现方法分享
  • jQuery 源码分析笔记(7)
    Queue
  • jQuery队列控制方法详解queue()/dequeue()/clearQueue()
  • jQuery中队列queue()函数的实例教程

// 主要的扩展在 jQuery.ajax 中。
jQuery.extend({ // #6299
// 请求的默认参数
ajaxSettings: {
url: location.href,
type: “GET”,
contentType: “application/x-www-form-urlencoded”,
data: null,
xhr: window.XMLHttpRequest && (window.location.protocol !== “file:” ||
!window.ActiveXObject) ?
function () {
return new window.XMLHttpRequest();
} :
function () {
try {
return new window.ActiveXObject(“Microsoft.XMLHTTP”);
} catch (e) { }
}
},
// 用来设置 jQuery.ajaxSettings ,设置请求的参数
ajaxSetup: function (settings) {
jQuery.extend(jQuery.ajaxSettings, settings);
},
ajax: function (origSettings) { // 实际的 ajax 函数
var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
// 创建 xhr 对象
xhr = s.xhr();
// 回调函数
var onreadystatechange = xhr.onreadystatechange = function (isTimeout)
{
if (xhr.readyState === 4) {
if (xhr.status == 200) {
s.success.call(origSettings, xhr.responseText);
}
}
};
// 设置请求参数
xhr.open(s.type, s.url);
// Send the data 发出请求
xhr.send(s.data);
// return XMLHttpRequest to allow aborting the request etc.
return xhr;
},
// 使用 get 方式发出 ajax 请求的方法
get: function (url, data, callback, type) {
// shift arguments if data argument was omited
if (jQuery.isFunction(data)) {
type = type || callback;
callback = data;
data = null;
}
return jQuery.ajax({
type: “GET”,
url: url,
data: data,
success: callback,
dataType: type
});
}

#autoComplete_Group {
border: 1px solid #817F82;
position: absolute;
overflow-y:auto;
overflow-x:hidden;
display:none;
}
#autoComplete_Group table {
background: none repeat scroll 0 0 #FFFFFF;
cursor: default;
width: 100%;
}
#autoComplete_Group td {
color: #000000;
font: 14px/25px arial;
height: 25px;
padding: 0 8px;
}
#autoComplete_Group .nowRow {
background-color:#EBEBEB;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章