一. 工具方法(以$…或jquery…这种方式调用方法)
1. $.type()
:判断参数的类型;
原生js判断数据类型:1. arr instanceof Array;
(不能准确判断是Array还是Object)
2. arr. constructor==Arraay;
(对于判断iframe里的元素,不能准确判断是Array还是Object,例如$('iframe')[0].contentWindow.arr.constructor==Array)
3. Object.prototype.toString.call(arr);
(可以准确判断参数类型)
2. $.trim()
:消去两边的空格
3. $.proxy()
改变this指向,返回一个改变 this指向后的函数。参数一:function;参数二:希望this指向谁;也可以继续传参数,表示改变this指向后的函数的参数。例如:
function show(grade ,number)
{
console.log(grade);
console.log(number);
}
var obj={
name='aimee';
}
例1. var fn=$.proxy(show,obj);
fn(2014,20140001);
fn(2014,20140002);
fn(2014,20140003);
例2. $.proxy(show,obj,2014,20140001)();
$.proxy(show,obj,2014,20140002)();
$.proxy(show,obj,2014,20140003)();
例3.(柯里化) var fn=$.proxy(show,obj,2014);
fn(20140001);
fn(20140002);
fn(20140003);
4. $.extend()
:扩展方法;
$.extend(dest,src1,src2,src3...)
返回值为合并后的dest,由此可以看到该方法合并后是修改了dest
的结构的。
var result=$.extend({},{name:"Tome",age:21},{name:"Jerry",sex:"Boy"});
合并后结果:result={name:"Jerry",age:21,sex:"Boy"};
由此可以看出,后面的参数如果和前面的参数存在的相同的名称,那么后面的会覆盖前面的参数;。jquery.extend(str1,str2)‘此覆盖过程是浅拷贝过程,拷贝过去的是地址也就是改变str2里面的引用值,则已经覆盖过的里面对应的值也改变,若想深度拷贝则需要加一个true例如jquery. extend( true, str1,str2)’
$.extend(src)
:该方法就是将src合并到jquery的全局对象中去,就是将hello方法合并到jquery的全局对象中,及jQuery的工具方法,使用时直接$.hello。
$.extend({
hello:function(){alert('hello');}
});
$.hello();
$.fn.extend(src)
:该方法将src合并到jquery的实例对象中去,就是将hello方法合并到jquery的实例对象中。
$.fn.extend({
hello:function(){alert('hello');}
});
$.('div').hello();
5. $.Callbacks()
:回调函数,返回回调函数对象。
var cb=$.Callbacks();
function fn1(){
console.log("fn1");
}
function fn2(){
console.log("fn2");
}
cb.add(fn1);//给回调函数添加函数;
cb.add(fn2);
//也可以:cb.add(fn1,fn2);或cb.add([fn1,fn2]);
cb.fire();//触发添加的函数,重复调用fire,会重复执行
结果:
- 当
$.Callbacks('once')
时,即使有多个fire()也会执行一次fire; - 当
$.Callbacks('unique')
时,若add里出现重复的函数,只执行这些重复的函数里的一个,如:cd.add(aa,aa,aa);只执行一个aa; - 当
$.Callbacks('memory‘)
时,只要前面出现过fire();即使后面再有add();不需再调用fire()也可以执行fire; - 当
$.Callbacks('stopOnFalse')
时,结合着return false;一起用,只会执行到return false之前,其后不会执行。
var cb=$.Callbacks('stopOnFalse');
function fn1(){
console.log("fn1");
}
function fn2(){
console.log("fn2");
return false;
}
function fn3(){
console.log("fn3");
}
cb.add(fn1,fn2,fn3);
cb.fire();
结果:
6. $.Deferred()
延迟对象相对于一状态的Callbacks()
当服务器返回成功就执行成功的函数,当服务器返回错误则执行失败的函数。
var dtd=$.Deferrd();
- 触发函数:
- dtd.resolve()相当于模拟服务器返回成功的回调函数
- dtd.reject()相当于模拟服务器返回失败的回调函数
- dtd.notify()相当于加载过程中
- 添加函数
-
done(function(){})执行成功的函数
-
fail(function(){})执行失败的函数
-
progress(function(){})执行加载中的函数
- 若为resolve状态,则之后不会再改变一直为resolve状态除非人为改变状态。reject同理;但是当为nofity时,成功失败的结果还没出现,所以nofity函数触发后,done和fail还会再触发一个。
var dtd=$.Deferred();
function aa(){
setInterval(function(){dtd.notify()},500);
setInterval(function(){dtd.resolve()},1000);
setInterval(function(){dtd.reject()},2000);
}
aa();
dtd
.done(function(){
console.log("ok");
})
.fail(function(){
console.log("error");
})
.progress(function(){
console.log("doing");
})
结果:
验证了定理3,但这样写的缺点:很容易受到外界的干扰,如图:
var dtd=$.Deferred();
function aa(){
setInterval(function(){dtd.notify()},500);
setInterval(function(){dtd.resolve()},1000);
setInterval(function(){dtd.reject()},2000);
}
aa();
dtd.reject();
dtd
.done(function(){
console.log("ok");
})
.fail(function(){
console.log("error");
})
.progress(function(){
console.log("doing");
})
结果:
- $.Deferred.promise():不在触发函数(只读状态)
- 模拟网络请求:(不受外界干扰)
function aa(){
var dtd=$.Deferred();
setInterval(function(){dtd.notify()},500);
setInterval(function(){dtd.resolve()},1000);
setInterval(function(){dtd.reject()},2000);
return dtd.promise();
}
var cb=aa();
cb.reject();//此处会报错
cb
.done(function(){
console.log("ok");
})
.fail(function(){
console.log("error");
})
.progress(function(){
console.log("doing");
})
证明了$.Deferred.promise();不再触发请求,处于只读状态。
7. $.when();
返回的是一个延迟对象,参数也是延迟对象,当参数延迟对象全部触发done的时候最后会触发when返回延迟对象done函数,及调用done函数,当有一个参数延迟对象触发的是reject则调用fail函数,当触发notify时则不会调用任何函数。
例如:
function aa(){
var dtd=$.Deferred();
dtd.resolve();
return dtd.promise();
}
function bb(){
var dtd=$.Deferred();
dtd.reject();
return dtd.promise();
}
var cb=aa();
var cb2=bb();
$.when(cb,cb2)
.done(function(){
console.log("ok");
})
.fail(function(){
console.log("error");
})
.progress(function(){
console.log("doing");
})