jQuery自带的一些常用方法总结,jQuery之Deferred对象

时间:2019-07-25 18:15来源:2020欧洲杯冠军竞猜官方网站
本身方法($.each,$.map,$.contains,$ajax) jQuery自带的一些常用方法总结,jquery自带总结 本身方法($.each,$.map,$.contains,$ajax) 常用工具方法 (1)$.trim $.trim方法用于移除字符串头部和尾部多余

本身方法($.each,$.map,$.contains,$ajax)

jQuery自带的一些常用方法总结,jquery自带总结

本身方法($.each,$.map,$.contains,$ajax)

常用工具方法

(1)$.trim

$.trim方法用于移除字符串头部和尾部多余的空格。

复制代码 代码如下:

$.trim('   Hello   ') // Hello

(2)$.contains

$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。

复制代码 代码如下:

$.contains(document.documentElement, document.body);
// true
$.contains(document.body, document.documentElement);
// false

(3)$.each,$.map

$.each方法用于遍历数组和对象,然后返回原始对象。它接受两个参数,分别是数据集合和回调函数。

复制代码 代码如下:

$.each([ 52, 97 ], function( index, value ) {
  console.log( index ": " value );
});
// 0: 52
// 1: 97
var obj = {
  p1: "hello",
  p2: "world"
};
$.each( obj, function( key, value ) {
  console.log( key ": " value );
});
// p1: hello
// p2: world

需要注意的,jQuery对象实例也有一个each方法($.fn.each),两者的作用差不多。

$.map方法也是用来遍历数组和对象,但是会返回一个新对象。

复制代码 代码如下:

var a = ["a", "b", "c", "d", "e"];
a = $.map(a, function (n, i){
  return (n.toUpperCase() i);
});
// ["A0", "B1", "C2", "D3", "E4"]

(4)$.inArray

$.inArray方法返回一个值在数组中的位置(从0开始)。如果该值不在数组中,则返回-1。

复制代码 代码如下:

var a = [1,2,3,4];
$.inArray(4,a) // 3

(5)$.extend

$.extend方法用于将多个对象合并进第一个对象。

复制代码 代码如下:

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};
$.extend(o1,o2);
o1.p1 // "c"

$.extend的另一种用法是生成一个新对象,用来继承原有对象。这时,它的第一个参数应该是一个空对象。

复制代码 代码如下:

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};
var o = $.extend({},o1,o2);
o
// Object {p1: "c", p2: "b"}

默认情况下,extend方法生成的对象是“浅拷贝”,也就是说,如果某个属性是对象或数组,那么只会生成指向这个对象或数组的指针,而不会复制值。如果想要“深拷贝”,可以在extend方法的第一个参数传入布尔值true。

复制代码 代码如下:

var o1 = {p1:['a','b']};
var o2 = $.extend({},o1);
var o3 = $.extend(true,{},o1);
o1.p1[0]='c';
o2.p1 // ["c", "b"]
o3.p1 // ["a", "b"]

上面代码中,o2是浅拷贝,o3是深拷贝。结果,改变原始数组的属性,o2会跟着一起变,而o3不会。

(6)$.proxy

$.proxy方法类似于ECMAScript 5的bind方法,可以绑定函数的上下文(也就是this对象)和参数,返回一个新函数。

jQuery.proxy()的主要用处是为回调函数绑定上下文对象。

复制代码 代码如下:

var o = {
    type: "object",
    test: function(event) {
        console.log(this.type);
    }
};
$("#button")
  .on("click", o.test) // 无输出
  .on("click", $.proxy(o.test, o)) // object

上面的代码中,第一个回调函数没有绑定上下文,所以结果为空,没有任何输出;第二个回调函数将上下文绑定为对象o,结果就为object。

这个例子的另一种等价的写法是:

复制代码 代码如下:

$("#button").on( "click", $.proxy(o, test))

上面代码的$.proxy(o, test)的意思是,将o的方法test与o绑定。

这个例子表明,proxy方法的写法主要有两种。

复制代码 代码如下:

jQuery.proxy(function, context)
// or
jQuery.proxy(context, name)

第一种写法是为函数(function)指定上下文对象(context),第二种写法是指定上下文对象(context)和它的某个方法名(name)。

再看一个例子。正常情况下,下面代码中的this对象指向发生click事件的DOM对象。

复制代码 代码如下:

$('#myElement').click(function() {
    $(this).addClass('aNewClass');
});

如果我们想让回调函数延迟运行,使用setTimeout方法,代码就会出错,因为setTimeout使得回调函数在全局环境运行,this将指向全局对象。

复制代码 代码如下:

$('#myElement').click(function() {
    setTimeout(function() {
        $(this).addClass('aNewClass');
    }, 1000);
});

上面代码中的this,将指向全局对象window,导致出错。

这时,就可以用proxy方法,将this对象绑定到myElement对象。

复制代码 代码如下:

$('#myElement').click(function() {
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass');
    }, this), 1000);
});

(7)$.data,$.removeData

$.data方法可以用来在DOM节点上储存数据。

复制代码 代码如下:

// 存入数据
$.data(document.body, "foo", 52 );
// 读取数据
$.data(document.body, "foo");
// 读取所有数据
$.data(document.body);

上面代码在网页元素body上储存了一个键值对,键名为“foo”,键值为52。

$.removeData方法用于移除$.data方法所储存的数据。

复制代码 代码如下:

$.data(div, "test1", "VALUE-1");
$.removeData(div, "test1");

(8)$.parseHTML,$.parseJSON,$.parseXML

$.parseHTML方法用于将字符串解析为DOM对象。

$.parseJSON方法用于将JSON字符串解析为JavaScript对象,作用与原生的JSON.parse()类似。但是,jQuery没有提供类似JSON.stringify()的方法,即不提供将JavaScript对象转为JSON对象的方法。

$.parseXML方法用于将字符串解析为XML对象。

复制代码 代码如下:

var html = $.parseHTML("hello, <b>my name is</b> jQuery.");
var obj = $.parseJSON('{"name": "John"}');
var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>";
var xmlDoc = $.parseXML(xml);

(9)$.makeArray

$.makeArray方法将一个类似数组的对象,转化为真正的数组。

复制代码 代码如下:

var a = $.makeArray(document.getElementsByTagName("div"));
(10)$.merge

$.merge方法用于将一个数组(第二个参数)合并到另一个数组(第一个参数)之中。

复制代码 代码如下:

var a1 = [0,1,2];
var a2 = [2,3,4];
$.merge(a1, a2);
a1
// [0, 1, 2, 2, 3, 4]
(11)$.now

$.now方法返回当前时间距离1970年1月1日00:00:00 UTC对应的毫秒数,等同于(new Date).getTime()。

复制代码 代码如下:

$.now()
// 1388212221489

判断数据类型的方法

jQuery提供一系列工具方法,用来判断数据类型,以弥补JavaScript原生的typeof运算符的不足。以下方法对参数进行判断,返回一个布尔值。

jQuery.isArray():是否为数组。
jQuery.isEmptyObject():是否为空对象(不含可枚举的属性)。
jQuery.isFunction():是否为函数。
jQuery.isNumeric():是否为数组。
jQuery.isPlainObject():是否为使用“{}”或“new Object”生成的对象,而不是浏览器原生提供的对象。
jQuery.isWindow():是否为window对象。
2020欧洲杯冠军竞猜官方网站,jQuery.isXMLDoc():判断一个DOM节点是否处于XML文档之中。
下面是一些例子。

复制代码 代码如下:

$.isEmptyObject({}) // true
$.isPlainObject(document.location) // false
$.isWindow(window) // true
$.isXMLDoc(document.body) // false

除了上面这些方法以外,还有一个$.type方法,可以返回一个变量的数据类型。它的实质是用Object.prototype.toString方法读取对象内部的[[Class]]属性(参见《标准库》的Object对象一节)。

复制代码 代码如下:

$.type(/test/) // "regexp"

Ajax操作

$.ajax

jQuery对象上面还定义了Ajax方法($.ajax()),用来处理Ajax操作。调用该方法后,浏览器就会向服务器发出一个HTTP请求。

$.ajax()的用法有多种,最常见的是提供一个对象参数。

复制代码 代码如下:

$.ajax({
  async: true,
  url: '/url/to/json',
  type: 'GET',
  data : { id : 123 },
  dataType: 'json',
  timeout: 30000,
  success: successCallback,
  error: errorCallback,
  complete: completeCallback
})
function successCallback(json) {
    $('<h1/>').text(json.title).appendTo('body');
}
function errorCallback(xhr, status){
    console.log('出问题了!');
}
function completeCallback(xhr, status){
    console.log('Ajax请求已结束。');
}

上面代码的对象参数有多个属性,含义如下:

async:该项默认为true,如果设为false,则表示发出的是同步请求。
cache: 该项默认为true,如果设为false,则浏览器不缓存返回服务器返回的数据。注意,浏览器本身就不会缓存POST请求返回的数据,所以即使设为false,也只对HEAD和GET请求有效。
url:服务器端网址。这是唯一必需的一个属性,其他属性都可以省略。
type:向服务器发送信息所使用的HTTP动词,默认为GET,其他动词有POST、PUT、DELETE。
dataType:向服务器请求的数据类型,可以设为text、html、script、json、jsonp和xml。
data:向服务器发送的数据,如果使用GET方法,此项将转为查询字符串,附在网址的最后。
success:请求成功时的回调函数,函数参数为服务器传回的数据、状态信息、发出请求的原始对象。
timeout: 等待的最长毫秒数。如果过了这个时间,请求还没有返回,则自动将请求状态改为失败。
error:请求失败时的回调函数,函数参数为发出请求的原始对象以及返回的状态信息。
complete:不管请求成功或失败,都会执行的回调函数,函数参数为发出请求的原始对象以及返回的状态信息。
这些参数之中,url可以独立出来,作为ajax方法的第一个参数。也就是说,上面代码还可以写成下面这样。

复制代码 代码如下:

$.ajax('/url/to/json',{
  type: 'GET',
  dataType: 'json',
  success: successCallback,
  error: errorCallback
})

简便写法

ajax方法还有一些简便写法。

$.get():发出GET请求。
$.getScript():读取一个JavaScript脚本文件并执行。
$.getJSON():发出GET请求,读取一个JSON文件。
$.post():发出POST请求。
$.fn.load():读取一个html文件,并将其放入当前元素之中。
一般来说,这些简便方法依次接受三个参数:url、数据、成功时的回调函数。

(1)$.get(),$.post()

这两个方法分别对应HTTP的GET方法和POST方法。

复制代码 代码如下:

$.get('/data/people.html', function(html){
  $('#target').html(html);
});
$.post('/data/save', {name: 'Rebecca'}, function (resp){
  console.log(JSON.parse(resp));
});

get方法接受两个参数,分别为服务器端网址和请求成功后的回调函数。post方法在这两个参数中间,还有一个参数,表示发给服务器的数据。

上面的post方法对应的ajax写法如下。

复制代码 代码如下:

$.ajax({
    type: 'POST',
    url: '/data/save',
    data: {name: 'Rebecca'},
    dataType: 'json',
    success: function (resp){
      console.log(JSON.parse(resp));
    }
});

(2)$.getJSON()

ajax方法的另一个简便写法是getJSON方法。当服务器端返回JSON格式的数据,可以用这个方法代替$.ajax方法。

复制代码 代码如下:

$.getJSON('url/to/json', {'a': 1}, function(data){
    console.log(data);
});

上面的代码等同于下面的写法。

复制代码 代码如下:

$.ajax({
  dataType: "json",
  url: '/url/to/data',
  data: {'a': 1},
  success: function(data){
    console.log(data);
  }
});

(3)$.getScript()

$.getScript方法用于从服务器端加载一个脚本文件。

复制代码 代码如下:

$.getScript('/static/js/myScript.js', function() {
    functionFromMyScript();
});

上面代码先从服务器加载myScript.js脚本,然后在回调函数中执行该脚本提供的函数。

getScript的回调函数接受三个参数,分别是脚本文件的内容,HTTP响应的状态信息和ajax对象实例。

复制代码 代码如下:

$.getScript( "ajax/test.js", function (data, textStatus, jqxhr){
  console.log( data ); // test.js的内容
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
});

getScript是ajax方法的简便写法,因此返回的是一个deferred对象,可以使用deferred接口。

复制代码 代码如下:

jQuery.getScript("/path/to/myscript.js")
    .done(function() {
        // ...
    })
    .fail(function() {
        // ...
});

(4)$.fn.load()

$.fn.load不是jQuery的工具方法,而是定义在jQuery对象实例上的方法,用于获取服务器端的HTML文件,将其放入当前元素。由于该方法也属于ajax操作,所以放在这里一起讲。

复制代码 代码如下:

$('#newContent').load('/foo.html');

$.fn.load方法还可以指定一个选择器,将远程文件中匹配选择器的部分,放入当前元素,并指定操作完成时的回调函数。

复制代码 代码如下:

$('#newContent').load('/foo.html #myDiv h1:first',
    function(html) {
        console.log('内容更新!');
});

上面代码只加载foo.html中匹配“#myDiv h1:first”的部分,加载完成后会运行指定的回调函数。

Ajax事件

jQuery提供以下一些方法,用于指定特定的AJAX事件的回调函数。

.ajaxComplete():ajax请求完成。
.ajaxError():ajax请求出错。
.ajaxSend():ajax请求发出之前。
.ajaxStart():第一个ajax请求开始发出,即没有还未完成ajax请求。
.ajaxStop():所有ajax请求完成之后。
.ajaxSuccess():ajax请求成功之后。
下面是示例。

复制代码 代码如下:

$('#loading_indicator')
.ajaxStart(function (){$(this).show();})
.ajaxStop(function (){$(this).hide();});

返回值

ajax方法返回的是一个deferred对象,可以用then方法为该对象指定回调函数(详细解释参见《deferred对象》一节)。

复制代码 代码如下:

$.ajax({
  url: '/data/people.json',
  dataType: 'json'
}).then(function (resp){
  console.log(resp.people);
})

JSONP

由于浏览器存在“同域限制”,ajax方法只能向当前网页所在的域名发出HTTP请求。但是,通过在当前网页中插入script元素(<script>),可以向不同的域名发出GET请求,这种变通方法叫做JSONP(JSON with Padding)。

ajax方法可以发出JSONP请求,方法是在对象参数中指定dataType为JSONP。

复制代码 代码如下:

$.ajax({
  url: '/data/search.jsonp',
  data: {q: 'a'},
  dataType: 'jsonp',
  success: function(resp) {
    $('#target').html('Results: ' resp.results.length);
  }
});)

JSONP的通常做法是,在所要请求的URL后面加在回调函数的名称。ajax方法规定,如果所请求的网址以类似“callback=?”的形式结尾,则自动采用JSONP形式。所以,上面的代码还可以写成下面这样。

复制代码 代码如下:

$.getJSON('/data/search.jsonp?q=a&callback=?',
  function(resp) {
    $('#target').html('Results: ' resp.results.length);
  }
);

deferred对象是jQuery对Promises接口的实现。它是非同步操作的通用接口,可以被看作是一个等待完成的任务,开发者通过一些通过的接口对其进行设置。事实上,它扮演代理人(proxy)的角色,将那些非同步操作包装成具有某些统一特性的对象,典型例子就是Ajax操作、网页动画、web worker等等。

常用工具方法

jquery方面的技术材料等

当然是官方的文档了,其实你把api.jquery.com的内容看一遍,看懂了,掌握jQuery没啥问题。
中文的Sina爱问资料共享上有 [jQuery基础教程].(JonathanChaffer&KarlSwedberg).扫描版.pdf,此处不方便贴链接,你直接去搜一下吧。  

jQuery的所有Ajax操作函数,默认返回的就是一个deferred对象。

(1)$.trim

Html中常用的js就是jQuery??

js 是 javascript 的简称。
javascript 的历史和互联网的历史几乎一样长,有了 netscape 浏览器之后,javascript 就诞生了。

jquery 是 javascript 的一个库,或者说是一个框架,它在很大程度上简化了动态网页的开发。jquery 的 1.0 版本于 2006 年发布,目前最新版是1.4.2,还很年轻。  

本身方法($.each,$.map,$.contains,$ajax) 常用工具方法 (1)$.trim $.trim方法用于移除字符串头部和...

Promises是什么

$.trim方法用于移除字符串头部和尾部多余的空格。

由于JavaScript单线程的特点,如果某个操作耗时很长,其他操作就必需排队等待。为了避免整个程序失去响应,通常的解决方法是将那些排在后面的操作,写成“回调函数”(callback)的形式。这样做虽然可以解决问题,但是有一些显著缺点:

复制代码 代码如下:

1.回调函数往往写成函数参数的形式,导致函数的输入和输出非常混乱,整个程序的可阅读性差;
2.回调函数往往只能指定一个,如果有多个操作,就需要改写回调函数。
3.整个程序的运行流程被打乱,除错和调试的难度都相应增加。

$.trim('   Hello   ') // Hello

Promises就是为了解决这些问题而提出的,它的主要目的就是取代回调函数,成为非同步操作的解决方案。它的核心思想就是让非同步操作返回一个对象,其他操作都针对这个对象来完成。比如,假定ajax操作返回一个Promise对象。

(2)$.contains

复制代码 代码如下:

$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。

var promise = get('');

复制代码 代码如下:

然后,Promise对象有一个then方法,可以用来指定回调函数。一旦非同步操作完成,就调用指定的回调函数。

$.contains(document.documentElement, document.body);
// true
$.contains(document.body, document.documentElement);
// false

复制代码 代码如下:

(3)$.each,$.map

promise.then(function (content) {
  console.log(content)
})

$.each方法用于遍历数组和对象,然后返回原始对象。它接受两个参数,分别是数据集合和回调函数。

可以将上面两段代码合并起来,这样程序的流程看得更清楚。

复制代码 代码如下:

复制代码 代码如下:

$.each([ 52, 97 ], function( index, value ) {
  console.log( index ": " value );
});
// 0: 52
// 1: 97
var obj = {
  p1: "hello",
  p2: "world"
};
$.each( obj, function( key, value ) {
  console.log( key ": " value );
});
// p1: hello
// p2: world

get(' (content) {
  console.log(content)
})

需要注意的,jQuery对象实例也有一个each方法($.fn.each),两者的作用差不多。

在1.7版之前,jQuery的Ajax操作采用回调函数。

$.map方法也是用来遍历数组和对象,但是会返回一个新对象。

复制代码 代码如下:

复制代码 代码如下:

$.ajax({
    url:"/echo/json/",
    success: function(response)
    {
       console.info(response.name);
    }
});

var a = ["a", "b", "c", "d", "e"];
a = $.map(a, function (n, i){
  return (n.toUpperCase() i);
});
// ["A0", "B1", "C2", "D3", "E4"]

1.7版之后,Ajax操作直接返回Promise对象,这意味着可以用then方法指定回调函数。

(4)$.inArray

复制代码 代码如下:

$.inArray方法返回一个值在数组中的位置(从0开始)。如果该值不在数组中,则返回-1。

$.ajax({
    url: "/echo/json/",
}).then(function (response) {
    console.info(response.name);
});

复制代码 代码如下:

deferred对象的方法

var a = [1,2,3,4];
$.inArray(4,a) // 3

$.deferred()方法

(5)$.extend

作用是生成一个deferred对象。

$.extend方法用于将多个对象合并进第一个对象。

复制代码 代码如下:

复制代码 代码如下:

var deferred = $.deferred();

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};
$.extend(o1,o2);
o1.p1 // "c"

done() 和 fail()

$.extend的另一种用法是生成一个新对象,用来继承原有对象。这时,它的第一个参数应该是一个空对象。

这两个方法都用来绑定回调函数。done()指定非同步操作成功后的回调函数,fail()指定失败后的回调函数。

复制代码 代码如下:

复制代码 代码如下:

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};
var o = $.extend({},o1,o2);
o
// Object {p1: "c", p2: "b"}

var deferred = $.Deferred();
deferred.done(function(value) {
   alert(value);
});

默认情况下,extend方法生成的对象是“浅拷贝”,也就是说,如果某个属性是对象或数组,那么只会生成指向这个对象或数组的指针,而不会复制值。如果想要“深拷贝”,可以在extend方法的第一个参数传入布尔值true。

它们返回的是原有的deferred对象,因此可以采用链式写法,在后面再链接别的方法(包括done和fail在内)。

复制代码 代码如下:

resolve() 和 reject()

var o1 = {p1:['a','b']};
var o2 = $.extend({},o1);
var o3 = $.extend(true,{},o1);
o1.p1[0]='c';
o2.p1 // ["c", "b"]
o3.p1 // ["a", "b"]

这两个方法用来改变deferred对象的状态。resolve()将状态改为非同步操作成功,reject()改为操作失败。

上面代码中,o2是浅拷贝,o3是深拷贝。结果,改变原始数组的属性,o2会跟着一起变,而o3不会。

复制代码 代码如下:

(6)$.proxy

var deferred = $.Deferred();
deferred.done(function(value) {
   alert(value);
});
deferred.resolve("hello world");

$.proxy方法类似于ECMAScript 5的bind方法,可以绑定函数的上下文(也就是this对象)和参数,返回一个新函数。

一旦调用resolve(),就会依次执行done()和then()方法指定的回调函数;一旦调用reject(),就会依次执行fail()和then()方法指定的回调函数。

jQuery.proxy()的主要用处是为回调函数绑定上下文对象。

state方法

复制代码 代码如下:

该方法用来返回deferred对象目前的状态。

var o = {
    type: "object",
    test: function(event) {
        console.log(this.type);
    }
};
$("#button")
  .on("click", o.test) // 无输出
  .on("click", $.proxy(o.test, o)) // object

复制代码 代码如下:

上面的代码中,第一个回调函数没有绑定上下文,所以结果为空,没有任何输出;第二个回调函数将上下文绑定为对象o,结果就为object。

var deferred = new $.Deferred();
deferred.state();  // "pending"
deferred.resolve();
deferred.state();  // "resolved"

这个例子的另一种等价的写法是:

该方法的返回值有三个:

复制代码 代码如下:

1.pending:表示操作还没有完成。
2.resolved:表示操作成功。
3.rejected:表示操作失败。

$("#button").on( "click", $.proxy(o, test))

notify() 和 progress()

上面代码的$.proxy(o, test)的意思是,将o的方法test与o绑定。

progress()用来指定一个回调函数,当调用notify()方法时,该回调函数将执行。它的用意是提供一个接口,使得在非同步操作执行过程中,可以执行某些操作,比如定期返回进度条的进度。

这个例子表明,proxy方法的写法主要有两种。

复制代码 代码如下:

复制代码 代码如下:

 var userProgress = $.Deferred();
    var $profileFields = $("input");
    var totalFields = $profileFields.length
    userProgress.progress(function (filledFields) {
        var pctComplete = (filledFields/totalFields)*100;
        $("#progress").html(pctComplete.toFixed(0));
    });
    userProgress.done(function () {
        $("#thanks").html("Thanks for completing your profile!").show();
    });
    $("input").on("change", function () {
        var filledFields = $profileFields.filter("[value!='']").length;
        userProgress.notify(filledFields);
        if (filledFields == totalFields) {
            userProgress.resolve();
        }
    });

jQuery.proxy(function, context)
// or
jQuery.proxy(context, name)

then()

第一种写法是为函数(function)指定上下文对象(context),第二种写法是指定上下文对象(context)和它的某个方法名(name)。

then()的作用也是指定回调函数,它可以接受三个参数,也就是三个回调函数。第一个参数是resolve时调用的回调函数,第二个参数是reject时调用的回调函数,第三个参数是progress()方法调用的回调函数。

再看一个例子。正常情况下,下面代码中的this对象指向发生click事件的DOM对象。

复制代码 代码如下:

复制代码 代码如下:

deferred.then( doneFilter [, failFilter ] [, progressFilter ] )

$('#myElement').click(function() {
    $(this).addClass('aNewClass');
});

在jQuery 1.8之前,then()只是.done().fail()写法的语法糖,两种写法是等价的。在jQuery 1.8之后,then()返回一个新的deferred对象,而done()返回的是原有的deferred对象。如果then()指定的回调函数有返回值,该返回值会作为参数,传入后面的回调函数。

如果我们想让回调函数延迟运行,使用setTimeout方法,代码就会出错,因为setTimeout使得回调函数在全局环境运行,this将指向全局对象。

复制代码 代码如下:

复制代码 代码如下:

var defer = jQuery.Deferred();
defer.done(function(a,b){
            return a * b;
}).done(function( result ) {
            console.log("result = " result);
}).then(function( a, b ) {
            return a * b;
}).done(function( result ) {
            console.log("result = " result);
}).then(function( a, b ) {
            return a * b;
}).done(function( result ) {
            console.log("result = " result);
});
defer.resolve( 2, 3 );

$('#myElement').click(function() {
    setTimeout(function() {
        $(this).addClass('aNewClass');
    }, 1000);
});

在jQuery 1.8版本之前,上面代码的结果是:

上面代码中的this,将指向全局对象window,导致出错。

复制代码 代码如下:

这时,就可以用proxy方法,将this对象绑定到myElement对象。

result = 2
result = 2
result = 2

复制代码 代码如下:

在jQuery 1.8版本之后,返回结果是

$('#myElement').click(function() {
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass');
    }, this), 1000);
});

复制代码 代码如下:

(7)$.data,$.removeData

result = 2
result = 6
result = NaN

$.data方法可以用来在DOM节点上储存数据。

这一点需要特别引起注意。

复制代码 代码如下:

复制代码 代码如下:

// 存入数据
$.data(document.body, "foo", 52 );
// 读取数据
$.data(document.body, "foo");
// 读取所有数据
$.data(document.body);

$.ajax( url1, { dataType: "json" } )
.then(function( data ) {
    return $.ajax( url2, { data: { user: data.userId } } );
}).done(function( data ) {
  // 从url2获取的数据
});

上面代码在网页元素body上储存了一个键值对,键名为“foo”,键值为52。

上面代码最后那个done方法,处理的是从url2获取的数据,而不是从url1获取的数据。

$.removeData方法用于移除$.data方法所储存的数据。

利用then()会修改返回值这个特性,我们可以在调用其他回调函数之前,对前一步操作返回的值进行处理。

复制代码 代码如下:

复制代码 代码如下:

$.data(div, "test1", "VALUE-1");
$.removeData(div, "test1");

var post = $.post("/echo/json/")
    .then(function(p){
        return p.firstName;
    });
post.done(function(r){ console.log(r); });

(8)$.parseHTML,$.parseJSON,$.parseXML

上面代码先使用then()方法,从返回的数据中取出所需要的字段(firstName),所以后面的操作就可以只处理这个字段了。

$.parseHTML方法用于将字符串解析为DOM对象。

有时,Ajax操作返回json字符串里面有一个error属性,表示发生错误。这个时候,传统的方法只能是通过done()来判断是否发生错误。通过then()方法,可以让deferred对象调用fail()方法。

$.parseJSON方法用于将JSON字符串解析为JavaScript对象,作用与原生的JSON.parse()类似。但是,jQuery没有提供类似JSON.stringify()的方法,即不提供将JavaScript对象转为JSON对象的方法。

复制代码 代码如下:

$.parseXML方法用于将字符串解析为XML对象。

var myDeferred = $.post('/echo/json/', {json:JSON.stringify({'error':true})})
    .then(function (response) {
            if (response.error) {
                return $.Deferred().reject(response);
            }
            return response;
        },function () {
            return $.Deferred().reject({error:true});
        }
    );
myDeferred.done(function (response) {
        $("#status").html("Success!");
    }).fail(function (response) {
        $("#status").html("An error occurred");
    });

复制代码 代码如下:

always()

var html = $.parseHTML("hello, <b>my name is</b> jQuery.");
var obj = $.parseJSON('{"name": "John"}');
var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>";
var xmlDoc = $.parseXML(xml);

always()也是指定回调函数,不管是resolve或reject都要调用。

(9)$.makeArray

pipe方法

$.makeArray方法将一个类似数组的对象,转化为真正的数组。

pipe方法接受一个函数作为参数,表示在调用then方法、done方法、fail方法、always方法指定的回调函数之前,先运行pipe方法指定的回调函数。它通常用来对服务器返回的数据做初步处理。

复制代码 代码如下:

promise对象

var a = $.makeArray(document.getElementsByTagName("div"));
(10)$.merge

大多数情况下,我们不想让用户从外部更改deferred对象的状态。这时,你可以在deferred对象的基础上,返回一个针对它的promise对象。我们可以把后者理解成,promise是deferred的只读版,或者更通俗地理解成promise是一个对将要完成的任务的承诺。

$.merge方法用于将一个数组(第二个参数)合并到另一个数组(第一个参数)之中。

你可以通过promise对象,为原始的deferred对象添加回调函数,查询它的状态,但是无法改变它的状态,也就是说promise对象不允许你调用resolve和reject方法。

复制代码 代码如下:

复制代码 代码如下:

var a1 = [0,1,2];
var a2 = [2,3,4];
$.merge(a1, a2);
a1
// [0, 1, 2, 2, 3, 4]
(11)$.now

function getPromise(){
    return $.Deferred().promise();
}
try{
    getPromise().resolve("a");
} catch(err) {
    console.log(err);
}

$.now方法返回当前时间距离1970年1月1日00:00:00 UTC对应的毫秒数,等同于(new Date).getTime()。

上面的代码会出错,显示TypeError {} 。

复制代码 代码如下:

jQuery的ajax() 方法返回的就是一个promise对象。此外,Animation类操作也可以使用promise对象。

$.now()
// 1388212221489

复制代码 代码如下:

判断数据类型的方法

var promise = $('div.alert').fadeIn().promise();

jQuery提供一系列工具方法,用来判断数据类型,以弥补JavaScript原生的typeof运算符的不足。以下方法对参数进行判断,返回一个布尔值。

$.when()方法

jQuery.isArray():是否为数组。
jQuery.isEmptyObject():是否为空对象(不含可枚举的属性)。
jQuery.isFunction():是否为函数。
jQuery.isNumeric():是否为数组。
jQuery.isPlainObject():是否为使用“{}”或“new Object”生成的对象,而不是浏览器原生提供的对象。
jQuery.isWindow():是否为window对象。
jQuery.isXMLDoc():判断一个DOM节点是否处于XML文档之中。
下面是一些例子。

$.when()接受多个deferred对象作为参数,当它们全部运行成功后,才调用resolved状态的回调函数,但只要其中有一个失败,就调用rejected状态的回调函数。它相当于将多个非同步操作,合并成一个。

复制代码 代码如下:

复制代码 代码如下:

$.isEmptyObject({}) // true
$.isPlainObject(document.location) // false
$.isWindow(window) // true
$.isXMLDoc(document.body) // false

$.when(
    $.ajax( "/main.php" ),
    $.ajax( "/modules.php" ),
    $.ajax( "/lists.php" )
).then(successFunc, failureFunc);

除了上面这些方法以外,还有一个$.type方法,可以返回一个变量的数据类型。它的实质是用Object.prototype.toString方法读取对象内部的[[Class]]属性(参见《标准库》的Object对象一节)。

上面代码表示,要等到三个ajax操作都结束以后,才执行then方法指定的回调函数。

复制代码 代码如下:

when方法里面要执行多少个操作,回调函数就有多少个参数,对应前面每一个操作的返回结果。

$.type(/test/) // "regexp"

复制代码 代码如下:

Ajax操作

$.when(
    $.ajax( "/main.php" ),
    $.ajax( "/modules.php" ),
    $.ajax( "/lists.php" )
).then(function (resp1, resp2, resp3){
    console.log(resp1);
    console.log(resp2);
    console.log(resp3);
});

$.ajax

上面代码的回调函数有三个参数,resp1、resp2和resp3,依次对应前面三个ajax操作的返回结果。

jQuery对象上面还定义了Ajax方法($.ajax()),用来处理Ajax操作。调用该方法后,浏览器就会向服务器发出一个HTTP请求。

when方法的另一个作用是,如果它的参数返回的不是一个Deferred或Promise对象,那么when方法的回调函数将 立即运行。

$.ajax()的用法有多种,最常见的是提供一个对象参数。

复制代码 代码如下:

复制代码 代码如下:

$.when({testing: 123}).done(function (x){
  console.log(x.testing); // "123"
});

$.ajax({
  async: true,
  url: '/url/to/json',
  type: 'GET',
  data : { id : 123 },
  dataType: 'json',
  timeout: 30000,
  success: successCallback,
  error: errorCallback,
  complete: completeCallback
})
function successCallback(json) {
    $('<h1/>').text(json.title).appendTo('body');
}
function errorCallback(xhr, status){
    console.log('出问题了!');
}
function completeCallback(xhr, status){
    console.log('Ajax请求已结束。');
}

上面代码中指定的回调函数,将在when方法后面立即运行。

上面代码的对象参数有多个属性,含义如下:

利用这个特点,我们可以写一个具有缓存效果的异步操作函数。也就是说,第一次调用这个函数的时候,将执行异步操作,后面再调用这个函数,将会返回缓存的结果。

async:该项默认为true,如果设为false,则表示发出的是同步请求。
cache: 该项默认为true,如果设为false,则浏览器不缓存返回服务器返回的数据。注意,浏览器本身就不会缓存POST请求返回的数据,所以即使设为false,也只对HEAD和GET请求有效。
url:服务器端网址。这是唯一必需的一个属性,其他属性都可以省略。
type:向服务器发送信息所使用的HTTP动词,默认为GET,其他动词有POST、PUT、DELETE。
dataType:向服务器请求的数据类型,可以设为text、html、script、json、jsonp和xml。
data:向服务器发送的数据,如果使用GET方法,此项将转为查询字符串,附在网址的最后。
success:请求成功时的回调函数,函数参数为服务器传回的数据、状态信息、发出请求的原始对象。
timeout: 等待的最长毫秒数。如果过了这个时间,请求还没有返回,则自动将请求状态改为失败。
error:请求失败时的回调函数,函数参数为发出请求的原始对象以及返回的状态信息。
complete:不管请求成功或失败,都会执行的回调函数,函数参数为发出请求的原始对象以及返回的状态信息。
这些参数之中,url可以独立出来,作为ajax方法的第一个参数。也就是说,上面代码还可以写成下面这样。

复制代码 代码如下:

复制代码 代码如下:

function maybeAsync( num ) {
  var dfd = $.Deferred();
  if ( num === 1 ) {
    setTimeout(function() {
      dfd.resolve( num );
    }, 100);
    return dfd.promise();
  }
  return num;
}
$.when(maybeAsync(1)).then(function (resp){
  $('#target').append('<p>' resp '</p>');
});
$.when(maybeAsync(0)).then(function (resp){
  $('#target').append( '<p>' resp '</p>');
});

$.ajax('/url/to/json',{
  type: 'GET',
  dataType: 'json',
  success: successCallback,
  error: errorCallback
})

上面代码表示,如果maybeAsync函数的参数为1,则执行异步操作,否则立即返回缓存的结果。

简便写法

实例

ajax方法还有一些简便写法。

wait方法

$.get():发出GET请求。
$.getScript():读取一个JavaScript脚本文件并执行。
$.getJSON():发出GET请求,读取一个JSON文件。
$.post():发出POST请求。
$.fn.load():读取一个html文件,并将其放入当前元素之中。
一般来说,这些简便方法依次接受三个参数:url、数据、成功时的回调函数。

我们可以用deferred对象写一个wait方法,表示等待多少毫秒后再执行。

(1)$.get(),$.post()

复制代码 代码如下:

这两个方法分别对应HTTP的GET方法和POST方法。

$.wait = function(time) {
  return $.Deferred(function(dfd) {
    setTimeout(dfd.resolve, time);
  });
}

复制代码 代码如下:

使用方法如下:

$.get('/data/people.html', function(html){
  $('#target').html(html);
});
$.post('/data/save', {name: 'Rebecca'}, function (resp){
  console.log(JSON.parse(resp));
});

复制代码 代码如下:

get方法接受两个参数,分别为服务器端网址和请求成功后的回调函数。post方法在这两个参数中间,还有一个参数,表示发给服务器的数据。

$.wait(5000).then(function() {
  alert("Hello from the future!");
});

上面的post方法对应的ajax写法如下。

改写setTimeout方法

复制代码 代码如下:

在上面的wait方法的基础上,还可以改写setTimeout方法,让其返回一个deferred对象。

$.ajax({
    type: 'POST',
    url: '/data/save',
    data: {name: 'Rebecca'},
    dataType: 'json',
    success: function (resp){
      console.log(JSON.parse(resp));
    }
});

复制代码 代码如下:

(2)$.getJSON()

function doSomethingLater(fn, time) {
  var dfd = $.Deferred();
  setTimeout(function() {
    dfd.resolve(fn());
  }, time || 0);
  return dfd.promise();
}
var promise = doSomethingLater(function (){
  console.log( '已经延迟执行' );
}, 100);

ajax方法的另一个简便写法是getJSON方法。当服务器端返回JSON格式的数据,可以用这个方法代替$.ajax方法。

自定义操作使用deferred接口

复制代码 代码如下:

我们可以利用deferred接口,使得任意操作都可以用done()和fail()指定回调函数。

$.getJSON('url/to/json', {'a': 1}, function(data){
    console.log(data);
});

复制代码 代码如下:

上面的代码等同于下面的写法。

Twitter = {
  search:function(query) {
    var dfr = $.Deferred();
    $.ajax({
     url:"",
     data:{q:query},
     dataType:'jsonp',
     success:dfr.resolve
    });
    return dfr.promise();
  }
}

复制代码 代码如下:

使用方法如下:

$.ajax({
  dataType: "json",
  url: '/url/to/data',
  data: {'a': 1},
  success: function(data){
    console.log(data);
  }
});

复制代码 代码如下:

(3)$.getScript()

Twitter.search('intridea').then(function(data) {
  alert(data.results[0].text);
});

$.getScript方法用于从服务器端加载一个脚本文件。

deferred对象的另一个优势是可以附加多个回调函数。

复制代码 代码如下:

复制代码 代码如下:

$.getScript('/static/js/myScript.js', function() {
    functionFromMyScript();
});

function doSomething(arg) {
  var dfr = $.Deferred();
  setTimeout(function() {
    dfr.reject("Sorry, something went wrong.");
  });
  return dfr;
}
doSomething("uh oh").done(function() {
  alert("Won't happen, we're erroring here!");
}).fail(function(message) {
  alert(message)
});

上面代码先从服务器加载myScript.js脚本,然后在回调函数中执行该脚本提供的函数。

您可能感兴趣的文章:

  • jQuery的deferred对象使用详解
  • jQuery Deferred和Promise创建响应式应用程序详细介绍
  • 利用jQuery的deferred对象实现异步按顺序加载JS文件
  • jQuery源码分析-05异步队列 Deferred 使用介绍
  • jQuery $.extend()用法总结
  • jQuery插件开发的两种方法及$.fn.extend的详解
  • jQuery.extend 函数详解
  • 原生js实现复制对象、扩展对象 类似jquery中的extend()方法
  • jQuery.extend()的实现方式详解及实例
  • jQuery中的deferred对象和extend方法详解

getScript的回调函数接受三个参数,分别是脚本文件的内容,HTTP响应的状态信息和ajax对象实例。

复制代码 代码如下:

$.getScript( "ajax/test.js", function (data, textStatus, jqxhr){
  console.log( data ); // test.js的内容
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
});

getScript是ajax方法的简便写法,因此返回的是一个deferred对象,可以使用deferred接口。

复制代码 代码如下:

jQuery.getScript("/path/to/myscript.js")
    .done(function() {
        // ...
    })
    .fail(function() {
        // ...
});

(4)$.fn.load()

$.fn.load不是jQuery的工具方法,而是定义在jQuery对象实例上的方法,用于获取服务器端的HTML文件,将其放入当前元素。由于该方法也属于ajax操作,所以放在这里一起讲。

复制代码 代码如下:

$('#newContent').load('/foo.html');

$.fn.load方法还可以指定一个选择器,将远程文件中匹配选择器的部分,放入当前元素,并指定操作完成时的回调函数。

复制代码 代码如下:

$('#newContent').load('/foo.html #myDiv h1:first',
    function(html) {
        console.log('内容更新!');
});

上面代码只加载foo.html中匹配“#myDiv h1:first”的部分,加载完成后会运行指定的回调函数。

Ajax事件

jQuery提供以下一些方法,用于指定特定的AJAX事件的回调函数。

.ajaxComplete():ajax请求完成。
.ajaxError():ajax请求出错。
.ajaxSend():ajax请求发出之前。
.ajaxStart():第一个ajax请求开始发出,即没有还未完成ajax请求。
.ajaxStop():所有ajax请求完成之后。
.ajaxSuccess():ajax请求成功之后。
下面是示例。

复制代码 代码如下:

$('#loading_indicator')
.ajaxStart(function (){$(this).show();})
.ajaxStop(function (){$(this).hide();});

返回值

ajax方法返回的是一个deferred对象,可以用then方法为该对象指定回调函数(详细解释参见《deferred对象》一节)。

复制代码 代码如下:

$.ajax({
  url: '/data/people.json',
  dataType: 'json'
}).then(function (resp){
  console.log(resp.people);
})

JSONP

由于浏览器存在“同域限制”,ajax方法只能向当前网页所在的域名发出HTTP请求。但是,通过在当前网页中插入script元素(<script>),可以向不同的域名发出GET请求,这种变通方法叫做JSONP(JSON with Padding)。

ajax方法可以发出JSONP请求,方法是在对象参数中指定dataType为JSONP。

复制代码 代码如下:

$.ajax({
  url: '/data/search.jsonp',
  data: {q: 'a'},
  dataType: 'jsonp',
  success: function(resp) {
    $('#target').html('Results: ' resp.results.length);
  }
});)

JSONP的通常做法是,在所要请求的URL后面加在回调函数的名称。ajax方法规定,如果所请求的网址以类似“callback=?”的形式结尾,则自动采用JSONP形式。所以,上面的代码还可以写成下面这样。

复制代码 代码如下:

$.getJSON('/data/search.jsonp?q=a&callback=?',
  function(resp) {
    $('#target').html('Results: ' resp.results.length);
  }
);

您可能感兴趣的文章:

  • jQuery基础学习技巧总结
  • jQuery中的常用事件总结
  • Jquery 常用方法经典总结
  • JQuery的ajax获取数据后的处理总结(html,xml,json)
  • JQuery设置和去除disabled属性的5种方法总结
  • Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
  • jquery实现ajax提交form表单的方法总结
  • jquery查找父元素、子元素(个人经验总结)
  • jQuery实用函数用法总结
  • jquery学习总结(超级详细)

编辑:2020欧洲杯冠军竞猜官方网站 本文来源:jQuery自带的一些常用方法总结,jQuery之Deferred对象

关键词: 欧洲杯竞猜