jQuery中提供/封装了许多工具类的方法,个人认为比较重要的有:
parseJSON方法:
parseJSON: function( data ) { //只处理字符串数据 if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // 优先使用本地方法处理,很多现代浏览器中提供了JSON对象用于处理JSON(比如chrome) // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { //此句话等效于return eval("("+data+")"); //但是这样写能防止变量污染 //更多的功效是提供一些编译优化以及工具验证 //参见 http://stackoverflow.com/questions/2449220/jquery-uses-new-functionreturn-data-instead-of-evaldata-to-parse-j return (new Function( "return " + data ))(); } //error方法的实现十分简单,抛出一个msg就完了 jQuery.error( "Invalid JSON: " + data ); },
parseXML方法:
// parseXML 几乎没什么好说的。就是简单地调用内置对象来解析XML。 // Cross-browser xml parsing // (xml & tmp used internally) parseXML: function( data , xml , tmp ) { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } tmp = xml.documentElement; if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { jQuery.error( "Invalid XML: " + data ); } return xml; },
globalEval方法:
//该方法作用域为全局环境,一般用来加载外部脚本 globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // execScript 为IE专有,其执行环境为global // 更多参见 http://www.cnblogs.com/snandy/archive/2011/03/16/1986055.html // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } },
proxy方法:
//在文档中可以清晰看到proxy支持两种调用方式: //jQuery.proxy( function, context ) 和 jQuery.proxy( context, name ) proxy: function( fn, context ) { if ( typeof context === "string" ) { //这里对应jQuery.proxy( context, name ) var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // 为原始函数设置guid,以便我们可以移除用proxy绑定的事件。 // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; },
可能最后一个guid不太容易理解其用意,我们用下面一个简单的示例来说明:
var obj = { name : 'obj', method : function (){ alert(this.name); } } $("input#btn").click($.proxy(obj.method,window)).unbind('click',obj.method);
此时unbind是可以取消obj.method的绑定的,至于其具体实现,留至看事件处理代码时再做分析。
其他还有一些方法诸如trim,noop,inArray等的实现就比较简单了,在此就不一一分析了,源码中应该是一眼就能看明白的,至此,core.js的分析告一段落。