jQuery进阶(二)

128 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

Jquery的事件对象,最简单也最容易被忽略。学会了原生的事件,对于封装一些工具类就很方便了

二、延迟对象

E. deferred.promise([type],[target])

概述

该方法返回一个 Promise 对象用来观察当某种类型的所有行动绑定到集合,排队与否还是已经完成。

.promise()方法返回一个动态生成的Promise对象用来观察当某种类型的所有行动绑定到集合,排队与否还是已经完成。

默认情况下, type是"fx" ,这意味着当选定的元素已完成所有动画是返回的Promise是解决的。

解决上下文和唯一的参数是哪个集合到.promise()被调用。

如果target是提供.promise()将附加到它的方法,然后返回这个对象,而不是创建一个新的。这对在已经存在的对象上附加Promise的行为非常有用。

参数

target是一个Object,绑定 promise 方法的对象。

描述

一个集合上使用promise,而没有动画解决的promise。

代码

var div = $( "<div />" );
div.promise().done(function( arg1 ) {
alert( this === div && arg1 === div );

F. deferred.always(alwaysCallbacks,[alwaysCallbacks])

概述

当递延对象是解决或拒绝时被调用添加处理程序。

一个函数,或者函数数组,当递延对象是解决或拒绝时被调用。

参数

alwaysCallbacks,附加可选的一个函数,或者函数数组,当递延对象是解决或拒绝时被调用。

描述

jQuery.get()方法返回一个来自一个延迟的对象的jqXHR对象,我们可以附加一个成功和错误使用deferred.always()方法的回调。

代码

$.get("test.php").always( function() {
  alert("$.get completed with success or error callback arguments");
});

三、应用

A. 请求先后的顺序的问题

可以处理有先后顺序或者依赖的多个Ajax请求

var promise = $.ajax("/myServerScript1");
function getStuff() {
   return $.ajax("/myServerScript2");
}
promise.then(getStuff).then(function(myServerScript2Data){
   // Do something
});

B. 为多个操作指定回调函数

Deferred对象允许为多个事件指定一个回调函数,这是新增的功能。

$.when($.ajax("test1.html"), $.ajax("test2.html"))
 .done(function(){ 
     alert("哈哈,成功了!"); 
 })
 .fail(function(){ 
     alert("出错啦!"); 
 });

可以看到这个方法先执行两个操作 $.ajax("test1.html") 和 $.ajax("test2.html") ,如果全部成功,就运行done()指定的回调函数;如果有一个失败或都失败了,就执行fail()指定的回调函数。

$.when()的参数只能是deferred对象,反之,则done会立即执行:

var wait = function(){
     var tasks = function(){
        alert("执行完毕!");
     };
     setTimeout(tasks,5000);
};
$.when(wait())
 .done(function(){ alert("哈哈,成功了!"); })
 .fail(function(){ alert("出错啦!"); });