jQuery 源码剖析-4 init 函数分析

47  // Handle HTML strings

48  if ( typeof selector === "string" ) {

49     // Are we dealing with HTML string or an ID?

50     var match = quickExpr.exec( selector );

51

52     // Verify a match, and that no context was specified for #id

53     if ( match && (match[1] || !context) ) {

54

55         // HANDLE: $(html) -> $(array)

56         if ( match[1] )

57            selector = jQuery.clean( [ match[1] ], context );

58

59         // HANDLE: $("#id")

60         else {

61            var elem = document.getElementById( match[3] );

62

63            // Handle the case where IE and Opera return items

64            // by name instead of ID

65            if ( elem && elem.id != match[3] )

66                return jQuery().find( selector );

67

68            // Otherwise, we inject the element directly into the jQuery object

69            var ret = jQuery( elem || [] );

70            ret.context = document;

71            ret.selector = selector;

72            return ret;

73         }

74

75     // HANDLE: $(expr, [context])

76     // (which is just equivalent to: $(content).find(expr)

77     } else

78         return jQuery( context ).find( selector );

79

80  // HANDLE: $(function)

81  // Shortcut for document ready

82  } else if ( jQuery.isFunction( selector ) )

 

48 行通过 typeof 判断参数是否为一个字符串,字符串又有三种可能。

 

在第 50 行通过正则表达式来判断字符串是否为一个 ID 或者一个 HTML 的串。match 保存匹配的结果。

53 行判断是否为 HTML 串,通过判断是否满足正则表达式的第一个分组来判断,是通过 jQuery.clean 进行处理。返回结果保存在 selector 中。

否则的话,说明满足了第三个分组,字符串是一个 ID,从 61 行开始,进行 ID 的处理,首先使用标准的 document.getElementById 通过 ID 来获取对象的引用。但是,这个方法在 IE Opera 下有一个问题,浏览器在没有找到指定 ID 的对象的时候,会再次寻找 name 属性为这个 ID 的对象,如果有的话,会返回 name 属性为 ID 的对象,这样就不一定是我们希望的结果了。在第 65 行进行判断,如果找到的对象不是我们期望的对象,那么重新使用 find 进行处理。

 

如果 ID 没有问题,那么将结果创建成一个 jQuery 对象,69 行说明如果没有找到对象就使用一个数组对象来表示。再次使用 jQuery() 函数,这次调用函数的参数就是一个对象的引用,如果找到了,那么这个参数就是找到的对象,如果没有找到,参数就使一个数组对象。

如果找到了,那么这个对象就一定有 nodeType 属性,在上边的分析中 41-46行)可以看到,jQuery 函数将返回一个 jQuery 对象,这个对象属性为 0 的成员值就是找到的对象,还有一个 length 的成员为 1, 另外有一个 context 的成员同样指向这个找到的对象。

如果没有找到对象,那么传递一个数组对象,这个对象的 length 属性将为 0

对于数组的处理将在下面看到。

69 行中 ret 将表示这个 jQeury 对象,然后,设置 context 属性为 当前的文档对象 document selector 为当前结果的选择器。最后在第 72 行返回这个对象。

 

77 行的 else 用来处理字符串的第三种可能,它对应 53 行的用来判断 selector 是否为 ID 或者 HTML 串的 if 语句,也就是说不是 HTML 串,也不是 ID的字符串,那么,只有一种可能,就是这是一个 CSS 的选择串。那么通过第 78 行进行处理,直接返回。

 

82  } else if ( jQuery.isFunction( selector ) )

83     return jQuery( document ).ready( selector );

 

82 83 行处理第三种可能:函数。

如果参数为一个函数,那么,首先通过 jQuery( document ) 获取一个表示 document jQuery 对象,然后将函数设置这个对象的 ready 事件处理。

 

84

85  // Make sure that old selector state is passed along

86  if ( selector.selector && selector.context ) {

87     this.selector = selector.selector;

88     this.context = selector.context;

89  }

90

91  return this.setArray(jQuery.isArray( selector ) ?

92     selector :

93     jQuery.makeArray(selector));

94},

 

86 行的 selector 为第 57 行所获得的通过 HTML 串得到的对象。如果这个对象有 selector 属性和 context 属性,那么复制到当前的对象上来。

91 行判断这个 selector 对象是否为数组对象,如果是,将这个对象上的数组成员复制到当前对象上来,如果不是的话,首先通过 93 行的 makeArray 创建成数组对象。然后再复制到当前对象上来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值