jQuery技术

第二章 jQuery技术解密 (三)(2)

字号+ 作者:H5之家 来源:H5之家 2017-11-11 11:32 我要评论( )

===== 总之,jQuery 对象其实就是 jQuery.fn.init 构造器创建的对象,而通过 jQuery.fn.init.prototype = jQuery.fn; 途径,再使用 jQuery 的原型对象去覆盖 jQuery.fn 的原型对象,使得 jQuery 对象的原型方法也就

=====  总之,jQuery 对象其实就是 jQuery.fn.init 构造器创建的对象,而通过 jQuery.fn.init.prototype = jQuery.fn; 途径,再使用 jQuery 的原型对象去覆盖 jQuery.fn 的原型对象,使得 jQuery 对象的原型方法也就被继承过来,从而形成了错综复杂但又井然有序的关系。 =====

2.3.3 jQuery 构造器

jQuery.fn.init() 负责对传入参数进行分析,然后生成并返回 jQuery 对象。jQuery.fn.init() 构造器的第一个参数是必须的,如果为空,则默认为 document 。

从本质上讲,使用 jQuery 选择器 (即 jQuery.fn.init() 构造器) 构建jQuery对象,就是在this 对象上附加 DOM 元素集合。附加的方式包括以下两类。

  • 如果是单个 DOM 元素,可以直接把 DOM 元素作为数组元素传递给 this 对象,还可以通过 ID 从 DOM 文档中查询元素。
  • 如果是多个 DOM 元素,则以集合形式附加,如 jQuery 对象、数组和对象等,此时可以通过 CSS 选择器匹配到所有 DOM 元素,然后过滤,最后构建类数组的数据结构。
  • 而 CSS 选择器,则是通过 jQuery().find(selector) 函数来完成的。通过 jQuery().find(selector) 可以分析选择器字符串,并在 DOM 文档树中查找到符合语法的元素集合。这个函数我们将在下面章节进行分析。该函数能够兼容 CSS1 ~ CSS3 选择器。

    下面就从 init() 初始化构造器函数开始,来分析 jQuery 选择器是如何工作的。为了方便解释,我们先结合源代码进行讲解。

    <script type="text/javascript"> (function(){ var window = this, jQuery = window.jQuery = window.$ = function(selector, context){ return new jQuery.fn.init(selector, context); }, quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/; // jQuery 原型对象 // 构造 jQuery 对象的入口 // 所有 jQuery 对象方法都通过 jQuery 原型对象来继承 jQuery.fn = jQuery.prototype = { // jQuery 对象初始化构造器,相当于 jQuery 对象的类型,由该函数负责创建 jQuery 对象 // 参数说明:selector: 选择器的符号,可以是任意数据类型。考虑DOM元素操作需要,该参数应该是包含DOM元素的任何数据 // context: 上下文,指定在文档DOM中哪个节点下开始进行查询,默认值为 document init: function(selector, context){ selector = selector || document; // 确保 selector 参数存在,默认值为document // 第一种情况,处理选择符为 DOM 元素,此时将忽略上下文,即忽略第二个参数 // 例如,$(document.getElementById("wrap")), jQuery(DOMElement) 匹配DOM元素。 // 先使用 selector.nodeType 判断当 selector 为元素节点,将 length 设置为 1, // 并且赋值给 context ,实际上 context 作为 init 的第二个参数, // 也意味着它的上下文节点就是 selector 该点,返回它的 $(DOMElement) 对象 if(selector.nodeType){ // 存在 nodeType 属性,说明选择符是一个 DOM 元素 this[0] = selector; // 直接把当前参数的 DOM 元素存入类数组中 this.length = 1; // 设置类数组的长度,以方便遍历访问 this.context = selector; // 设置上下文属性 return this; // 返回 jQuery 对象,即类数组对象 } // 如果选择符参数为字符串,则进行处理 // 例如,$("<div>hello,world</div>"), jQuery(html, [ownerDocument]) 匹配HTML字符串 if(typeof selector == "string"){ // 使用 quickExpr 正则表达式匹配该选择符字符串,决定是处理 HTML 字符串,还是处理 ID 字符串 // quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/ // quickExpr 匹配 包含 < > 的字符串 或 # 后跟 [a-zA-Z0-9_] 或 - 的字符串 var match = quickExpr.exec(selector); // 验证匹配的信息,任何情况下都不是 #id if (match && (match[1] || !context)){ // 第二种情况,处理 HTML 字符串,类似 $(html) -> $(array) if (match[1]){ //selector = jQuery.clean( [ match[1] ], context ); } // 第三种情况,处理 ID 字符串,类似 $("#id") else { var elem = document.getElementById(match[3]); // 获取该元素确保元素存在 // 处理在 IE 和 Opera 浏览器下根据 name,而不是 ID 返回元素 if(elem && elem.id != match[3]){ //return jQuery().find( selector ); // 默认调用 document.find() 方法 } // 否则将把 elem 作为元素参数直接调用 jQuery() 函数,返回 jQuery 对象 var ret = jQuery( elem || [] ); ret.context = document; // 设置 jQuery 对象的上下文属性 ret.selector = selector; // 设置 jQuery 对象的选择符属性 return ret; } }else{ // 第四种情况,处理 jQuery(expression, [context]) // 例如,$("div .red") 的表达式字符串 //return jQuery(context).find(selector); } } //else if ( jQuery.isFunction( selector ) ) // 第五种情况,处理 jQuery(callback),即 $(document).ready() 的简写 // 例如,$(function(){alert("hello,world");}), // 或者 $(document).ready(function(){alert("hello,world");}); // return jQuery( document ).ready( selector ); // 确保旧的选择符能够通过 if (selector.selector && selector.context){ this.selector = selector.selector; this.context = selector.context; } // 第六种情况,处理类似 $(elements) //return this.setArray(jQuery.isArray(selector)? selector: jQuery.makeArray(selector)); } }; })(); </script>进一步分析 init() 构造器函数的设计思路如下。

    (1) 第一步,当第一个参数为 DOM 元素,则废弃第二个参数,直接把 DOM 元素存储到 jQuery 对象的集合中,返回该 jQuery 对象。

    (2) 第二步,如果第一个参数是字符串,则可能存在三种情况。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • jquery常用技术总结

      jquery常用技术总结

      2017-11-11 11:33

    • 每日学习心得:$.extend()方法和(function($){...})(jQuery)详解

      每日学习心得:$.extend()方法和(function($){...})(jQuery)详解

      2017-11-10 18:05

    • jQuery的豆瓣API插件 jQuery Douban

      jQuery的豆瓣API插件 jQuery Douban

      2017-11-10 18:00

    • jQuery基础学习遍历 closest()方法

      jQuery基础学习遍历 closest()方法

      2017-11-09 14:01

    网友点评