jQuery构造函数init参数分析续

2020-05-22 16:37:04易采站长站整理

if ( selector.charAt(0) === "<" && selector.charAt( 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 = quickExpr.exec( selector );
}
console.log(match); // [null, "<div>", null];

下面我们修改一下参数改为$(‘#div’)然后再看一下结果


[“#div”, undefined, “div”, index: 0, input: “#div”]

还有一种比较特殊的情况$(‘<div>123′)然后我们再看一下结果


[“<div>dewrwe”, “<div>”, undefined, index: 0, input: “<div>dewrwe”]

我们可以看到id总是在第三个元素而标签值在第二个元素保存着,对于最后一种情况而言跟$(‘<div>’)是没有什么区别的因为生成dom元素时是不会处理第一个元素的。基于这个结果可以接着来分析下一个判断了。

接下来的会根据match的结果分为三种情况


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

...

} else if ( !context || context.jquery ) {

...

} else {

...

}

第一种情况满足的条件是match一定要有值,match[1]就是第二个元素就是保存标签的这个有值或者不存在上下文,但是好像没有id什么事啊?其实不是的通过分析match的结果可以知道第二个元素没有值肯定就是id选择器得到的结果,而id是唯一的,不需要写上下文(其实写了上下文也会正常执行只不过会使用Sizzle而不是在这里处理了跟body是一样的)。好了第一个条件进来的情况就是

1.标签 

$(‘<div>’)  $(‘<div>123′)  $(‘<div>23213213</div>’)…

2.没有上下文的id  $(‘#div’)

第一个条件内部又进行了细分:


// HANDLE: $(html) -> $(array)
if ( match[1] ) {

...

// HANDLE: $("#id")

}else{

}

很显然if是处理标签的else是处理id的,先来看看是怎么处理标签的吧


context = context instanceof jQuery ? context[0] : context;
doc = ( context ? context.ownerDocument || context : document );

// If a single string is passed in and it's a single tag
// just do a createElement and skip the rest
ret = rsingleTag.exec( selector );

if ( ret ) {
if ( jQuery.isPlainObject( context ) ) {
selector = [ document.createElement( ret[1] ) ];
jQuery.fn.attr.call( selector, context, true );

} else {
selector = [ doc.createElement( ret[1] ) ];
}

} else {
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );