【21~58】 定义变量和函数(一)
源码笔记:
var
rootjQuery,// JQ的根目录,在866行进行赋值操作rootjQuery = jQuery(document);
readyList,// 和DOM加载有关
core_strundefined = typeof undefined,// 得到"undefined"
location = window.location,// 其实不存也可用,但是存了便于压缩成一个字符
document = window.document,
docElem = document.documentElement,// 网址信息,document和页面节点的html标签
_jQuery = window.jQuery,// 防冲突的,以防其他库也有$
_$ = window.$,
class2type = {},// 使用$.type()时要用到的,用于类型判断
// 最终会存成class2type = { '[Object String]' : 'string' , '[Object Array]' : 'array' }
core_deletedIds = [],// 之前版本里和缓存数据有关
// 该版本的数据存储改成面向对象的写法了,已经用不上了,只是简单的空数组
core_version = "2.0.3",// 版本
core_concat = core_deletedIds.concat,// 对常用的数组、字符串、对象自变量下的方法进行存储,便于使用和压缩
core_push = core_deletedIds.push,
core_slice = core_deletedIds.slice,
core_indexOf = core_deletedIds.indexOf,
core_toString = class2type.toString,
core_hasOwn = class2type.hasOwnProperty,
core_trim = core_version.trim,// 去字符串前后空格 IE6~8不可用
备注:
**1.core_strundefined = typeof undefined, **
window.a == undefined;
typeof window.a == undefined;//二者功能大致相同。
//但,IE6~9下前者判断不出XML的方法和属性是否为undefined。后者全兼容。
2._jQuery = window.jQuery, 与 _$ = window.$,
var $ = 10;
<script src="jQuery.js"></script>
// 前面把$另作他用,但当加载了JQ时,会把这个值为10的$赋给_$,避免与JQ的$冲突。
// 如无另用$,则加载了JQ时,window.$不存在,_$里存的值为undefind。
// 具体防冲突的方法在349~817。
【21~58】 定义变量和函数(二)
源码笔记:
jQuery = function( selector, context ) {// $(),jQuery()调用的都是这个函数
return new jQuery.fn.init( selector, context, rootjQuery );
},// 96行 jQuery.fn = jQuery.prototype
备注:
普通面向对象的写法:
function Aaa() { }
Aaa.prototype.init = function () {};// 初始化
Aaa.prototype.css = function () {};
var a1 = new Aaa();// 得用new
a1.init();//使用时得先调用初始化方法
a1.css();
JQ的做法:
function jQuery(){
return new jQuery.prototype.init();// 返回构造函数
}
jQuery.prototype.init = function () {};// 初始化
jQuery.prototype.css = function () {};
jQuery.prototype.init.prototype = jQuery.prototype;// 283行有这句话
//作用:使二者为引用关系,互影响。没有这句,会找不到jQuery.prototype.css。
jQuery().css();// 不需调用初始化方法,更直观。
// 使用jQuery()即可,不需用new了
【66~94】 定义变量和函数(三)
源码笔记:
core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,//css方法时会用到
core_rnotwhite = /\S+/g,// 用于匹配单词(单词间有空格)
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,// 匹配<p>aaaa 或 #div1
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,// 匹配空标签,如<p></p>
// 驼峰转法
rmsPrefix = /^-ms-/,// ms是IE的前缀,IE是这样的M为大写,如MsMarginLeft,需特殊处理
rdashAlpha = /-([\da-z])/gi,// 转大小写,带数字的也可转,如-2d --> 2d,把横杆去掉
fcamelCase = function( all, letter ) {// 转驼峰的回调函数
return letter.toUpperCase();
},
completed = function() {// document加载成功触发的回调函数
document.removeEventListener( "DOMContentLoaded", completed, false );
window.removeEventListener( "load", completed, false );
jQuery.ready();
};
备注:
1.rquickExpr = /^(?:\s(<[\w\W]+>){FNXX==XXFN}|#([\w-]*))$/, **
rquickExpr = 匹配标签 | 匹配ID
一些网站如:www.xxx.com/#ID,会通过修改#ID来跳转页面。
过去黑客会针对这个漏洞来进行XSS(注入木马的方式),通过location的哈希值注入。
比如修改#ID为#<div>。
现在这个正则会识别真正的ID而不是带<>的标签,是可以防止注入的。
2.rmsPrefix = /^-ms-/,
margin-left --> js中写magrinLeft
-webkit-margin-left --> js中写webkitMagrinLeft
但IE是这样
-ms-margin-left --> js中写MsMagrinLeft 首字母是大写
所以IE要特殊对待一下
网友评论