热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jQuery是怎样工作的我们来弄懂它背后的机制

jQuery是时下最为流行的JavaScript库。它使用CSS选择器样式语法获取文档对象模型(DOM)中的元素到已包装的对象集合中,然后使用jQuery方法操纵这些元素来达到不同的效果。尽管jQuery的使用是非常方便和直观的,我们还是需要弄懂它背后的机制来更好的掌握它。
介绍

  jQuery是时下最为流行的Javascript库。它使用CSS选择器样式语法获取文档对象模型(DOM)中的元素到已包装的对象集合中,然后使用jQuery方法操纵这些元素来达到不同的效果。尽管jQuery的使用是非常方便和直观的,我们还是需要弄懂它背后的机制来更好的掌握它。

  jQuery中的基本概念

  在我们深入研究jQuery库前,需要了解一些jQuery中的一些基本概念。

  $/jQuery对象和$()/jQuery()方法

  $/jQuery对象是一个全局对象,通过它来访问所有的jQuery方法。

  


 

  它也是一个方法对象,所以使用它最通常的方法是通过$/jQuery()方法。$/jQuery()方法可以用来选择DOM中的一组元素。它也是一个包装函数,一个$/jQuery()方法的简单例子:

 

  $(“#ABC”);

  or

  jQuery(“#ABC”);

 

  传给$/jQuery()方法的参数是选择器( selector)。选择器是一个有CSS选择器样式语法的表达式。在上面的例子中,我要选择id等于 #ABC 的元素

  包装集合(Wrapped set)

  包装集合是一个类似数组的结构,里面包含了所有已选择的DOM元素。上面的$("#ABC")返回了一个包装集合。你可以像遍历数组那样访问包装集合或者通过索引访问。更重要的是,你可以在所有被选择的元素上应用jQuery方法。


 

  jQuery $()/jQuery()方法在后台是怎么工作的

  因为大多数jQuery方法调用都是以$()/jQuery()开头的,所以我们有必要弄懂在这后面发生了什么。在深入讨论前,我们先看看$()/jQuery()对象是在哪定义的。$/jQuery对象是jQuery方法的访问点,是在jQuery中定义的一个全局方法变量。这是在jQuery源码中定义它的那一行:

 

  // Expose jQuery to the global object

  window.jQuery = window.$ = jQuery;

 

  window对象代表浏览器中打开的窗口,把$/jQuery放到window下,它就得定义为一个全局对象并且可以在当前打开的窗口中访问

  但是,上面一行源码最的"jQuery"是什么?它被声明在jQuery库开始的地方。

  var jQuery = (function() {

  …

  这所有的魔法都发生在jQuery对象的声明表达式中,如果你直接往里面看,可能会迷茫,所以让我来简化它吧。

  简化版jQuery库源代码

  警告:简化版本仅仅为了研究目的,它不并具有jQuery提供的所有功能,不要把它用在真实环境中。

 

  var jQuery = (function ()

  {

  // Define a local copy of “k”

  var k = function (selector, context)

  {

  // The k object is actually just the init constructor 'enhanced'

  var kobj = new k.fn.init(selector, context);

  return kobj;

  };

  //Define k’s fn prototype, specially contains init method

  k.fn = k.prototype = {

  init: function (selector, context)

  {

  if (!selector)

  {

  return this;

  }

  }

  };

  // Give the init function the “k” prototype for later instantiation

  k.fn.init.prototype = k.fn;

  // Return “k” to the global object

  return k;

  })();

 

  从上面的额源码你可以看到jQuery函数变量被定义为一个匿名方法的执行结果。

  小贴士:怎样定义匿名函数 在Javascript中你可以定义一个匿名函数并马上调用它 例如, (function () { alert(“hello world”); })(); 通过把函数表达式 function() { alert(“hello word”); } 放进括号中 (function() { alert(“hello world”); }) 你可以在外面再加个括号马上调用它

  在这个匿名函数内部定义了一个函数,它有这样的形式:

  function (selector, context)

  第一个参数是selector,第二个参数是context。在原始的jQuery源码中,函数k实际上被命名为jQuery,这会和外面大多数jQuery函数变量混淆。

  在函数k内一个匿名函数类定义为k的prototype,Prototype是Javascript函数类的一个特殊的,被用来指向另一个函数对象。所以,所有那个函数类的实例都可以访问在prototype函数类中定义的函数。在这里,init函数可以被函数类k的所有实例访问。init方法有如下的形式:1function (selector, context)

  k的prototype里已经初始化成员方法,与此同时,init函数的prototype又被赋值为k的prototype。这是一个循环引用,正常编程实践中应该避免。但是,jQuery就是采用这种方式使init函数的返回值可以访问k中定义的方法。

  小贴士:在Javascript中函数是实体类 Javascript是函数式编程语言,但是函数并不是传统中那样纯粹的函数。函数可以动态定义,可以拥有属性和方法,并且可以作为参数传递给另一个函数。如果你想以传统的方式执行函数,可以这样: function display() { alert(“hello world”); } display(); 如果你想把函数当做类使用,可以这样: function Car(model) { this.Model = model; this.Drive = function() { alert(“Go”) } } var car = new Car(“Ford”); 在这里,function实际上是用来定义一个Car“类”,Car类有一个可以用函数类的参数初始化的属性Model和方Drive方法。所以,你可以随便创建任意多个Car类的对象。然而,Javascript的类并不是真正的类,因为它并没有面向对象语言中类的三个主要特征。

  定义k的prototype函数的方法被称作function literal,这在jQuery中广泛使用。

  小贴士:Javascript中定义方法的各种方式 1.使用function statement: function open() { //open logic } 2.使用function literal你可以用下面的方式定义最简单的函数: var o = { } 你还可以用literal定义一个函数“类”: var apple = { type: “macintosh”, color: “red”, getInfo: function() { return this.color + ‘ ‘ + this.type + ‘ apple’; } } 3.使用Function对象定义函数 Function对象是Javascript中内建的对象,在Javascript中,可以这样 var add = new Function(a, b, “return a + b;”); 来定义一个函数“add”。Function会把开始的两个参数“a”和"b"当做函数的参数,最后一个参数“return a + b”当做函数体。

  这样,内部的函数k就返回给了外部变量jQuery。jQuery得到的不仅是函数k,而且还有函数k所在的闭包(closure)。

  小贴士:Javascript中的closure是什么? closure是把内部函数返回到外部时Javascript创建的一个上下文(context),所以内部的函数还是可以访问那些本地变量。 closure的一个例子: var addition = function(numberA) { return function(numberB) { alert (numberA + numberB); }} 这样,你就可以直接指定numberA的值来创建一个addition的实例。 var add2 = addition(2); var add3 = addition(3); add2(3); // it will display 5 add3(3); // it will display 6

  最后,函数k被返回到了全局jQuery函数那里。

  jQuery函数库错综复杂的设计是为了使扩展和使用这个库简单容易。你可以附加自定义函数到jQuery.fn来添加你自己的业务逻辑。这个自定义的函数可以像内置函数那样被调用,比如:

 

  // Define a plugin function Test

  jQuery.fn.Test = function () { alert("Test"); }

  // Invoke Test function via jQuery() function

  jQuery().Test();

 

  总结

  通过了解jQuery是如何工作的,我们可以更好地掌握这个Javascript库。 我在这篇文章中显示的仅仅是jQuery库的框架。在掌握了基本的设计原则和jQuery库机制后,你可以深入研究jQuery库的原始源代码来更多的了解jQuery如何发挥Javascript语言的优势,实现简单和可扩展性的目标。


推荐阅读
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • HTML前端开发:UINavigationController与页面间数据传递详解
    本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
  • 使用 jQuery 实现页面加载进度条
    页面加载进度条是提升用户体验的重要工具,通过在页面头部显示一个加载状态,并在页面完全加载后隐藏,可以有效减少用户的等待焦虑。本文将详细介绍如何使用 jQuery 实现这一功能。 ... [详细]
  • 轮播图(Carousel)是网页设计中常见的元素,用于展示图片或内容滚动。本文精选了超过40个高质量的jQuery轮播图插件及教程,帮助开发者实现各种动态展示效果。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 本文探讨了在网站编辑器中使用JavaScript实现优酷视频播放器自适应宽度的方法。尽管尝试过多种CSS解决方案,但都存在一定的局限性,因此最终决定采用JavaScript来动态调整视频播放器的尺寸。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 深入解析 JavaScript 代码执行流程:理解执行上下文与变量提升机制
    本文深入探讨了JavaScript代码的执行流程,重点解析了执行上下文和变量提升机制。通过详细分析代码解析过程,帮助开发者更好地理解JavaScript中的作用域和执行环境,为编写高效、无误的代码提供理论支持。 ... [详细]
  • 软件开发史上最具影响力的十位编程大师(附图解)
    在软件开发领域,有十位编程大师对行业发展产生了深远影响。本文基于国外知名社区的一项评选,通过图文并茂的形式,详细介绍了这十位杰出人物,包括游戏开发先驱John Carmack等,为读者呈现了他们卓越的技术贡献与创新精神。 ... [详细]
  • 在《JavaScript进阶之旅:第三阶段深入探索》中,我们将通过一系列复杂的代码示例,深入探讨JavaScript的高级特性与应用技巧。本阶段将重点讲解如何利用用户输入进行动态交互,例如通过提示框获取1到9之间的正整数,并基于此实现更多功能。此外,还将介绍如何优化代码结构,提升程序的可读性和维护性。 ... [详细]
author-avatar
真心AI你fd_352
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有