jQuery 的一些常用静态方法
前言
jQ的api中有很多静态方法,但是小编是随着代码逐行进行阅读的,所以先介绍如下几个
正文
本篇主要来看下以下几个API:
- $.error();
- $.trim();
- $.parseJSON();
- $.proxy();
- $.now();
$.error()
//抛出一个错误
error: function( msg ) {
throw new Error( msg );
}
这个逻辑很简单,只是调用了系统原生的异常对象;
$.trim()
// 除去字符串左右空白,如果window.trim存在则使用原生的
// 低版本就用自身的正则进行匹配
trim: trim ? function( text ) {
return text == null ? "" : trim.call( text );
} : function( text ) {
// 在ie低版本下还要在增强对 \xA0【不间断空格】 的匹配
return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
/*
trimLeft = /^\s+/,trimRight = /\s+$/ 顶部进行了定义
在900多行,为了兼容IE低版本进行了再次赋值:
rnotwhite = /\S/;
if ( rnotwhite.test( "\xA0" ) ) {
trimLeft = /^[\s\xA0]+/;
trimRight = /[\s\xA0]+$/;
}
*/
}
$.parseJSON()
这个也不用多解释了哦,逻辑清晰,不难理解【该解释的已做注释】
//jQ解析JSON逻辑
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// 去除左右空白
data = jQuery.trim( data );
// 使用win自带的json解析
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
/*
检测逻辑借助于 json2.js , 以下正则在头部定义了
用于匹配转义字符
rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g
用于匹配有效字符值 'str' true false null Number
rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g
用于匹配正确的左方括号
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g
用于检测字符串中知否只含有执行字符 ] , : { }
rvalidchars = /^[\],:{}\s]*$/
检测传入的字符串是一个 切实 的 JSON 数据
先把转义字符替换成@,
再把有效字符替换为"]",
在删除正确的左方括号,
最后检测剩下的字符串是否指包含指定的几个字符。
特别说明:
此处注释出自 @高云 的书中原文【小编能力有限,解释不清这些正则的意思】
*/
if ( rvalidchars.test( data.replace( rvalidescape, "@" ).replace( rvalidtokens, "]" ).replace( rvalidbraces, "")) ) {
//原来这样也可以…… 比eval更安全
//通过这种形式我们可以动态的将字符串作为函数体来进行执行;
return ( new Function( "return " + data ) )();
}
//如果正则规范自然抛异常哈,window.JSON也会抛异常的.保持一致
jQuery.error( "Invalid JSON: " + data );
}
$.proxy()
// function,obj 将fun绑定到obj的作用域上
// obj,'obj.fnName' 将obj自身的fun绑定到obj上
proxy: function( fn, context ) {
if ( typeof context === "string" ) {
// obj,'obj.fnName' 情况处理
var tmp = fn[ context ];
context = fn;
fn = tmp;
}
//这个检测在之前的文章中我们已经介绍过了~
if ( !jQuery.isFunction( fn ) ) {
return undefined;
}
// slice = Array.prototype.slice 数组截取
var args = slice.call( arguments, 2 ),
proxy = function() {
//如有绑定的参数则优先被传递
return fn.apply( context, args.concat( slice.call( arguments ) ) );
};
// proxy.guid 是jQ的一个全局计数器
// jQuery事件系统中,如果为dom绑定了事件监听函数的代理函数,也可以通过guid来进行移除。
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
//通过这样的方式,我们可以很好的控制this确实是绑定到了某个作用域中,防止this不好控制。
return proxy;
}
$.now()
这个API的作用还得很大的,看读者们自己需求吧【小编有时候更习惯自己动手去指定this】
// 获取当前时间的: 时间戳*1000 【毫秒】
now: function() {
return ( new Date() ).getTime();
}
这个API好像没有开放到文档当中,不过在jQ内部中使用处还是挺多的。
感谢您的阅读,欢迎留言 交流 提问 斧正 O(∩_∩)O哈哈~
</>
</>