博客
关于我
Notes on Paul Irish's "Things I learned from the jQuery source" casts
阅读量:796 次
发布时间:2023-02-16

本文共 3176 字,大约阅读时间需要 10 分钟。

11个我从jQuery源码中学到的知识

在2012年12月14日,我观看了这段视频。如今,jQuery的版本已经升级到1.8.3,因此与视频中的内容相比,可能会有一些差异。以下是部分与当前稳定版本相比的差异说明。大部分他提到的代码都可以在speed/jquery-basic.js(版本1.4.2)中找到。


第1集

匿名函数

时间: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中查找。

jQuery属性

时间:14:15

jQuery.props用于桥接DOM属性,主要用于处理classhtmlFor属性,并进行一些驼峰转换。以下是一个示例:

jQuery.props.dt = "data-type";$("#something").attr("dt"); // 获取对应的data-type属性

jQuery动画速度

时间:18:01

jQuery.fx.speeds对象用于定义动画速度常量,例如"fast""slow"。如果没有找到对应的速度,jQuery会使用默认值。

jQuery.fx.speeds.kilo = 1024; // 定义一个新的速度,1024ms时长$("#something").fadeIn("kilo"); // 使用自定义速度

DOM就绪回调

时间: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更慢,因为它需要遍历所有可能的标签。

    jQuery.parseJSON

    时间:38:46

    jQuery使用浏览器的内置JSON.parse方法进行解析。如果浏览器不支持,jQuery会自行创建一个函数来解析字符串:

    // 检查是否支持内置解析if (typeof window.JSON === 'object') {  window.JSON.parse(json);} else {  // 创建一个新的函数来解析  (new Function('return ' + jsonSrc))();}

    jQuery.unique()

    时间: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(),无需包装。

    jQuery支持(特性检测)

    时间:48:12

    jQuery.support用于检测浏览器特性,具体实现在src/support.js中。

    jQuery模块化与构建

    时间:49:53

    jQuery由多个模块构成。如今,推荐使用CDN获取jQuery文件,而不是自行构建,因为自行构建会导致 CDN 缓存优化的缺失。


    第2集

    jQuery初始化

    时间:1:17

    jQuery初始化时,首先在局部变量中创建实例,并在完成后将window.jQuery赋值回去。

    数据与JSON

    时间:5:59

    通过数据属性赋值,可以实现动态的数据绑定。以下是一个示例:

    获取元素

    时间:13:04

    通过创建一个容器元素,可以测试特定标签是否存在。这种方法并非jQuery检测IE的标准方法。

    jQuery.cssHooks

    时间:18:07

    jQuery.cssHooks用于定义浏览器不支持的CSS属性的后续处理。例如,IE6不支持opacity,因此需要通过cssHooks实现。

    .css自动前缀

    时间:25:45

    使用.css()方法时,jQuery会自动处理前缀,例如-webkit-等。这种方法适用于需要跨浏览器兼容的情况。

    jQuery.fn

    时间:26:53

    jQuery.fn实际上是jQuery.prototype,因此可以通过扩展jQuery.fn来创建新的插件。


    以上内容整理自:YouTube视频Paul Irish的博客

    转载地址:http://iljfk.baihongyu.com/

    你可能感兴趣的文章
    mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
    查看>>
    MySQL高级-MySQL并发参数调整
    查看>>
    MySQL高级-视图
    查看>>
    MySQL:判断逗号分隔的字符串中是否包含某个字符串
    查看>>
    Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
    查看>>
    Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Nacos配置中心集群原理及源码分析
    查看>>
    nacos配置自动刷新源码解析
    查看>>
    Nacos集群搭建
    查看>>
    nacos集群搭建
    查看>>
    Navicat for MySQL 查看BLOB字段内容
    查看>>
    Neo4j电影关系图Cypher
    查看>>
    Neo4j的安装与使用
    查看>>
    Neo4j(2):环境搭建
    查看>>
    Neo私链
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>