zoukankan      html  css  js  c++  java
  • JQuery日记 5.31 JQuery对象的生成

    JQuery对象的生成
    1 selector为不论什么可转换false的空值
      返回空JQuery对象
    2 selector为字符串
      2.1 selector为html字符串或有id属性的标签
          2.2.1 selector为html字符时
                转换html字符为DOM元素并放入当前JQuery的数组
                当context參数为js对象时,迭代器属性
                (1)当前属性相应此JQuery对象的某个函数时,调用此JQuery对象的此函数,參数为当前属性的值.
                (2)其它设置HTML属性
          2.2.2 selector有id时
                直接getElementById
      2.2 selector为选择器表达式
          修正context在context上调用find方法
    3 selector为DOM元素
      包装此DOM为JQuery对象
    4 selector为函数
      此函数作为ready时间监听器
    5 selector为函数及不满足前四个分支的情况
      将此selecotr放入当前JQuery对象数组中

    	init = jQuery.fn.init = function( selector, context ) {
    		var match, elem;
    
    		// HANDLE: $(""), $(null), $(undefined), $(false)
    		// 返回空JQuery对象
    		if ( !selector ) {
    			return this;
    		}
    
    		// Handle HTML strings
    		if ( typeof selector === "string" ) {
    			// 假设selector以'<'开头以'>'结尾而且长度大于3觉得其是HTML字符串,不进行rquickExpr匹配
    			if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
    				// Assume that strings that start and end with <> are HTML and skip the regex check
    				match = [ null, selector, null ];
    
    			} else {
    				match = rquickExpr.exec( selector );
    			}
    
    			// Match html or make sure no context is specified for #id
    			if ( match && (match[1] || !context) ) {
    
    				// HANDLE: $(html) -> $(array)
    				if ( match[1] ) {
    					// 假设context是jquery对象,取第一个DOM元素
    					context = context instanceof jQuery ? context[0] : context;
    					// scripts is true for back-compat
    					// Intentionally let the error be thrown if parseHTML is not present
    					// 将HTML转换后的DOM元素合并当到当前jquery对象
    					jQuery.merge( this, jQuery.parseHTML(
    						match[1],
    						context && context.nodeType ? context.ownerDocument || context : document,
    						true
    					) );
    
    					// HANDLE: $(html, props)
    					// 处理第一个參数为HTML字符串第二个參数为JS对象
    					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
    						// for-each context中元素
    						for ( match in context ) {
    							// Properties of context are called as methods if possible
    							// 假设当前JQuery对象match属性是函数
    							if ( jQuery.isFunction( this[ match ] ) ) {
    								// 运行match函数 
    								this[ match ]( context[ match ] );
    
    							// ...and otherwise set as attributes
    							// 否则,设置HTML属性
    							} else {
    								this.attr( match, context[ match ] );
    							}
    						}
    					}
    
    					return this;
    
    				// HANDLE: $(#id)
    				} else {
    					elem = document.getElementById( match[2] );
    
    					// Check parentNode to catch when Blackberry 4.6 returns
    					// nodes that are no longer in the document #6963
    					// Blackberry 4.6缓存过度,不在document中的node仍然查找的到
    					if ( elem && elem.parentNode ) {
    						// Inject the element directly into the jQuery object
    						this.length = 1;
    						this[0] = elem;
    					}
    					// 设置上下文对象为document
    					this.context = document;
    					this.selector = selector;
    					return this;
    				}
    
    			// HANDLE: $(expr, $(...))
    			// 处理没有context參数或context參数是JQuery对象
    			} else if ( !context || context.jquery ) {
    				// 假设没有context參数则在document范围内调用find方法查找
    				// 假设有context參数则在本context范围内查找
    				return ( context || rootjQuery ).find( selector );
    
    			// HANDLE: $(expr, context)
    			// (which is just equivalent to: $(context).find(expr)
    			// 处理selector为expr,第二个參数也为context的selector的情况
    			} else {
    				// 对context进行选择再find
    				return this.constructor( context ).find( selector );
    			}
    
    		// HANDLE: $(DOMElement)
    		// 将DOM元素包裹为JQuery对象
    		} else if ( selector.nodeType ) {
    			this.context = this[0] = selector;
    			this.length = 1;
    			return this;
    
    		// HANDLE: $(function)
    		// Shortcut for document ready
    		// 假设selector是function
    		// 将function绑定为ready监听,或马上运行(rootjQuery.ready === "undefined")
    		} else if ( jQuery.isFunction( selector ) ) {
    			return typeof rootjQuery.ready !== "undefined" ?
    				rootjQuery.ready( selector ) :
    				// Execute immediately if ready is not present
    				selector( jQuery );
    		}
    		// 假设selctor是函数或对象时。且有selector元素时
    		if ( selector.selector !== undefined ) {
    			this.selector = selector.selector;
    			this.context = selector.context;
    		}
    		// 将selector放入当前JQuery对象的数组里
    		return jQuery.makeArray( selector, this );
    	};


  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7217106.html
Copyright © 2011-2022 走看看