本文共 3176 字,大约阅读时间需要 10 分钟。
在2012年12月14日,我观看了这段视频。如今,jQuery的版本已经升级到1.8.3,因此与视频中的内容相比,可能会有一些差异。以下是部分与当前稳定版本相比的差异说明。大部分他提到的代码都可以在speed/jquery-basic.js(版本1.4.2)中找到。
时间:1:16
在匿名函数中,传入window对象以便更快地访问对象。这种方式的优势在于,window对象被缓存起来,因此访问速度更快。与传统的全局变量不同,匿名函数中的变量是局部变量,存储在栈中。而全局变量则存储在全局/静态存储区中。
(function(window, undefined) { // 在这里做一些事情})(window); 此外,最后一个参数通常设置为undefined,以防止浏览器中的undefined对象被高级类型检查器覆盖,避免了"a**hole effect"问题。
时间:7:45
setInterval并不是在预期的时间点执行操作的,因为当操作耗时超过预定时间时,可能会出现问题。以下是一个示例:
(function() { doStuff(); // 会等待doStuff完成 setTimeout(arguments.callee, 100); // 100ms后再次调用函数})(); 注意:arguments.callee在ES5严格模式下已废弃。建议使用命名函数:
(function loopback() { doStuff(); // 会等待doStuff完成 setTimeout(loopback, 100); // 100ms后再次调用函数})(); noconflict()时间:12:34
noconflict()功能在当前版本中并未直接支持。该功能在1.4.x中用于解决一些兼容性问题,具体实现可以在speed/jquery-basic.js中查找。
时间:14:15
jQuery.props用于桥接DOM属性,主要用于处理class和htmlFor属性,并进行一些驼峰转换。以下是一个示例:
jQuery.props.dt = "data-type";$("#something").attr("dt"); // 获取对应的data-type属性 时间:18:01
jQuery.fx.speeds对象用于定义动画速度常量,例如"fast"和"slow"。如果没有找到对应的速度,jQuery会使用默认值。
jQuery.fx.speeds.kilo = 1024; // 定义一个新的速度,1024ms时长$("#something").fadeIn("kilo"); // 使用自定义速度 时间:21:21
在jQuery 1.4.x中,DOM就绪回调通过jQuery.bindReady实现,但在当前版本1.8.3中,该功能已被移除。最接近的实现是jQuery.ready.promise。实现细节如下:
DOMContentLoadedEvent是否存在,使用它。document.attachEvent是否存在,用于处理旧IE的onreadystatechange事件。doScrollCheck,通过不断滚动页面(每隔1ms尝试一次)直到没有异常发生,表示页面就绪。getScript()时间:24:41
当前版本使用XMLHttpRequest实现getScript(),而1.4.x中的实现可以在speed/jquery-basic.js中找到。
时间:33:23
在1.4.x中,以下两种选择在性能上有显著差异:
// 慢$("#id tag.thing")// 快$("#id").find("tag.thing") 原因在于前者需要在JavaScript层面遍历,而后者则在DOM层面遍历。当前版本基于Sizzle.js实现,可能已经优化了这一点。
此外,:password选择器比input:password更慢,因为它需要遍历所有可能的标签。
时间:38:46
jQuery使用浏览器的内置JSON.parse方法进行解析。如果浏览器不支持,jQuery会自行创建一个函数来解析字符串:
// 检查是否支持内置解析if (typeof window.JSON === 'object') { window.JSON.parse(json);} else { // 创建一个新的函数来解析 (new Function('return ' + jsonSrc))();} 时间:42:15
jQuery.unique()用于去重,主要用于处理DOM元素数组。目前版本的实现与1.4.x基本一致,但对非DOM元素的支持有限。
示例:
// DOM元素var div = document.createElement("div");div.innerHTML = '';var ar1 = $(div).find("span").get(); // 结果为:[, ]ar1.concat($(div).find("span").get()); // 结果为:[, , , , ]jQuery.unique(ar1); // 结果为:[, , ]// 非DOM元素var arr = [1, 2, true, "hi", 3, 3, true, 2, 1, "hi"];jQuery.unique(arr); // 结果为:[3, "hi", true, 2, 1]// 注意:`false`和`undefined`不支持 时间:46:58
在1.4.x中,delay()需要结合queue()使用:
$(elem).queue(function() { $(elem).delay(2000).fadeOut();}); 在当前版本中,可以直接使用delay(),无需包装。
时间:48:12
jQuery.support用于检测浏览器特性,具体实现在src/support.js中。
时间:49:53
jQuery由多个模块构成。如今,推荐使用CDN获取jQuery文件,而不是自行构建,因为自行构建会导致 CDN 缓存优化的缺失。
时间:1:17
jQuery初始化时,首先在局部变量中创建实例,并在完成后将window.jQuery赋值回去。
时间:5:59
通过数据属性赋值,可以实现动态的数据绑定。以下是一个示例:
时间:13:04
通过创建一个容器元素,可以测试特定标签是否存在。这种方法并非jQuery检测IE的标准方法。
时间:18:07
jQuery.cssHooks用于定义浏览器不支持的CSS属性的后续处理。例如,IE6不支持opacity,因此需要通过cssHooks实现。
时间:25:45
使用.css()方法时,jQuery会自动处理前缀,例如-webkit-等。这种方法适用于需要跨浏览器兼容的情况。
时间:26:53
jQuery.fn实际上是jQuery.prototype,因此可以通过扩展jQuery.fn来创建新的插件。
以上内容整理自:YouTube视频 和 Paul Irish的博客。
转载地址:http://iljfk.baihongyu.com/