jQuery 延迟对象解析

技术水平通常有限jquery延迟,如果有什么不对劲,希望你能原谅我。

ES6 已经实现了延迟对象 Promise,但昨晚主角是 JQ 上的延迟对象,尽管例程相似。让我们看一个更牵强的例子:





$(function(){
var dfd = new $.Deferred();
var add = $("#add");
var remove = $("#remove");
var content = $("#content");
add.click(function(){
var span = $("我是点击按钮创建的元素");
$("span").length==0&&$("body").append(span);
dfd.resolve();
})
remove.click(function(){
var span = $("span");
span&&span.remove();
})
dfd.done(function(){
$("span").css("color","red");
})
})

现在专注于函数,我们单击添加按钮以查看添加的 span 元素,但颜色变为红色。然后看看我们代码中的异构,从 var dfd = new $ 开始。延迟();和 添加风波函数中的 dfd.resolve();还有前面的dfd.done(function(){$(“span”).css(“color”,“red”); })。

$.Deferred() 是我们明天介绍的重点---JQ 中延迟的对象,所谓延迟就是之后它可以在一定的风速下运行。我们来看一下里面代码的一个处理流程,在前面的代码中我们调用了新创建的递延对象的 dfd.done() 方法的参数位置传递了一个匿名函数表达式,在点击风浪的处理函数执行时调用 dfd.resolve(),然后执行我们在 dfd.done() 中编写的匿名函数, 在这个过程中,我们可以看到 DFD 将上述功能放在解析中。DFD 是延迟对象,很明显它可以更改函数的执行顺序。

在看里面的代码,你会发现有一个毛茸茸的用法,我们把代码换颜色放在一个函数上jquery延迟,当你点击调用这个函数不好的时候,写得这么麻烦就有鸟用。事实上,在 AJAX 中应用了最延迟的对象。在上面的代码中,我们点击 Add,点击 Delete 并单击 Add,我们发现这个词并没有变成蓝色,因为状态改变后延迟对象的状态会无效,说白了就是一次性的。

挥之不去的对象使用情况

JQ 为我们实现了延迟对象的功能,我们通常称之为延迟或 Promise,确切地说,这基本上是一个从延迟派生的泛型。

我们使用的第一件事是创建一个延迟对象:var dfd = new $。延迟()。

延迟对象 DFD 有三种状态:挂起、已解决、已拒绝,我们此时可以使用 dfd 对象的 state 方法检查状态:dfd.state()。

创建 dfd 后,其状态

挂起,在调用解析模式:dfd.resolve() 后,它的状态将更改为已解决,然后 dfd.done() 中的函数将被执行,在 dfd 调用 reject(): dfd.reject() 之后,它的主体将被拒绝,然后执行 dfd.fail() 中的方法, 并且 dfd 对象从挂起更改为已解析或拒绝后没有变化, 这就是为什么我们代码中的代码只能在第一次点击后显示为红色。

我们来看看开头的代码,我们的 dfd.done() 定义了字体变红的函数,点击函数执行后,dfd 调用解析,然后 dfd 的状态从挂起变为已解决,上面的方式会执行 done 的方式,颜色会变成红色。

参数可以在 dfd.resolve() 和 dfd.done() 之间传递,所以让我们在开始时对代码进行一些更改:


//done里面的修改如下
dfd.done(function(color){$("span").css("color",color)})
//点击事件的处理函数修改如下
dfd.resolve("green");

单击后,字体颜色变为红色。

此外,dfd 总是有另一个函数:dfd.always(),dfd 的状态从挂起变为该状态,上面的函数将执行。

dfd 的每种方式都会返回一个延迟对象,如此完成,失败,总是可以有多个项目,并且可以直接写成链调用:dfd.done(function(){}).done(function(){}

).fail(function(){});

jquery延迟加载_jquery延迟

DFD 的 API 可以编写多个,我们可以考虑它的执行顺序是否得到保证。至此,我们可以放心,根据我们编写的顺序,DFD 函数的执行顺序是完全没问题的,请参见以下代码:


dfd.done(function(){
var span = $("我是点击按钮创建的元素");
$("span").length==0&&$("body").append(span);
})
.done(function(color){
$("span").css("color",color)});
})

第一个函数添加一个元素,第二个函数更改所添加元素的颜色。

每当执行 dfd 的三个 API 以上的函数时,dfd 的状态都会从挂起、异步和同步状态更改。更准确地说,在调用 dfd.resolve() 后已经由 dfd 执行的上述 done 函数将立即执行,对于在 dfd.resolve() 之后执行的函数,它将在程序出现时执行:


var dfd = new $.Deferred();
dfd.done(function(){console.log(1)});
dfd.done(function(){console.log(2)});
console.log("resolve before");
dfd.resolve();
console.log("resolve after");
dfd.done(function(){console.log(3)});
//resolve before,1,2,resolve after,3

延迟对象示例

当我们第一次使用JQ的AJAX时,我们通常把它写成:


$.ajax({
url:"x/y",
type:"post",
data:"{...}",
contentType:"application/json; charset=utf-8",
success:function(){},
error:function(){}
})

在 1.5 之后(好像是这个版本~),AJAX 会返回一个 Promise 对象,然后我们可以写出以下内容:


$.ajax({
url:"x/y",
type:"post",
data:"{...}",
contentType:"application/json; charset=utf-8",
}).done(function(){})
.fail(function(){})

它看起来更

烦人,我们可以添加多个 .done(function(){}),每个做不同的事情来让它看起来更清晰。

众所周知,如果我们有以下代码,延迟对象可以更改代码的执行顺序:

jquery延迟加载_jquery延迟


$.ajax({
url:"取数据",
type:"post",
contentType:"xxx"
}).done(function(data){
$.ajax({
url:"利用data取数据",
data:data,
type:"post",
contentType:"xxxx"
}).done(function(data){
use data to _do sth...
})
})

我们会注意到我们嵌套了太多,我们可以使用延迟对象来让它看起来更好一点:


var dfd = new $.Deferred();
$.ajax({
url:"取数据",
type:"post",
contentType:"xxx"
}).done(function(data){
dfd.resolve(data);
})
dfd.done(function(data){
$.ajax({
url:"利用data取数据",
data:data,
type:"post",
contentType:"xxxx"
}).done(function(data){
use data to _do sth...
})
})

没有延迟对象,我们可以

完成所需的功能,这个时候我们需要将我们的处理进程逐层嵌套,有了延时对象我们可以避免这种事情,可以轻松控制代码的执行顺序,让代码看起来更清晰。你可能会说我不能把封装函数调整到正确的地方,如果你看看你写的代码,没关系,但是和另一个人在一起,他的滚动条可能总是上下波动。

延迟对象的功能之一是合并 AJAX 调用,例如一个套接字获取数据 A,另一个套接字获取数据 B,AB 是在我们借助这些数据做自己喜欢的事情后获取的,我们可以借助延迟对象轻松实现它。此时,我们可以使用 JQ 的 $.when() 来实现这一点。$.when() 就像他的名字一样——当它是——他的参数可以是 Promise 对象或字符串(很少遇到没有引入),他的返回结果也是一个 Promise 对象,看一个小反例:


var allData = {};
var dataA = $.ajax({
url:"获取A的URL",
type:"post",
}).done(function(data){
allData.a = data;
});
var dataB = $.ajax({
url:"获取B的URL",
type:"post",
}).done(function(data){
allData.b = data;
});
$.when(dataA,dataB).done(function(){
use allData to _do sth...
});

allData 是保存所有数据的集合,dataA 是第一个 AJAX 返回的 Promise 对象,dataB 是第二个。$.when() 的 done 模式的唯一条件是 dataA 和 dataB 都成功执行。

补充:dfd 也有一对组合是 notify+progress 当 dfd 对象的状态为 pending 时,可以调用 dfd.nothfy(),调用后,dfd.progress() 中的函数就会被执行,只要 dfd 处于挂起状态,dfd.notify() 可以随时调用,参数也可以传递。

这次给大家带来jquery实现带复选框的表格的一步步解读。 jquery实现带复选框的表格有哪些注意事项?

通过jquery技术来操作表是一件简单的事情。 通过jquery句型,很容易完成表格的交错换色、浮动高亮,在实际应用中,表格中可能会有复选框jquery 复选框,删除时jquery 复选框,会显示勾选所在行的记录框所在位置被删除。 在这个地方,你可以添加一个特殊效果,单击一行并同时选中该行的复选框,该行的背景色也会突出显示。 这让人感觉非常好。

疗效如下:

我这里有两个功能:

功能 1. 单击某一行,该行的复选框被选中,同时背景颜色发生变化。

功能2、点击全选/取消全选标签后,改变该行的颜色。

我把这两个函数封装到了js文件中,使用时引入即可。

首先看CSS代码,我将其封装在一个css文件中

.selected{ 
background
:#FF6500; 
color:#fff; 
}

查看js文件的代码:

函数1的代码:

/** 
* 设置含有复选框的表格中的背景色 
*/ 
$(
document
).ready(function() 
{ 
/** 
* 表格行被单击的时候改变背景色 
*/ 
$("#tablight tr:gt(0)").click(function() //获取第2行后 
{ 
if ($(this).hasClass("selected"))//判断是否选中 
{ 
$(this).removeClass("selected").find(":checkbox").attr("checked",false);//选中移除样式 
} 
else//设置选中 
{ 
$(this).addClass("selected").find(":checkbox").attr("checked",true);//未选中添加样式 
} 
}); 
});

函数2的代码:

/** 
* 单击全选和反选之后改变背景色 
*/ 
function setColor()//设置tr的背景颜色 
{ 
var checkboxs = $("#tablight tr:gt(0) input[type=checkbox]");//得到所有的复选框 
var boxeds = $("#tablight tr:gt(0) input[type=checkbox]:checked");//得到被选择的复选框 
if(boxeds.length > 0) 
{ 
checkboxs.parent().parent().addClass("selected");//复选框在td里 
} 
else 
{ 
checkboxs.parent().parent().removeClass("selected"); 
} 
}

如果想让代码生效,需要在表单中添加id属性,属性值为“tablight”,同时全选/取消全选后调用setColor方法。

相信看完本文的案例,您已经掌握了方法。 更多精彩,请关注php英文网站其他相关文章!