亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery.prototype.init選擇器構造函數源碼思路分析

2019-11-20 23:00:23
字體:
來源:轉載
供稿:網友
一、源碼思路分析總結
概要:
jQuery的核心思想可以簡單概括為“查詢和操作dom”,今天主要是分析一下jQuery.prototype.init選擇器構造函數,處理選擇器函數中的參數;
這個函數的參數就是jQuery()===$()執行函數中的參數,可以先看我之前寫的淺析jQuery基礎框架一文,了解基礎框架后,再看此文。
思路分析:
以下是幾種jQuery的使用情況(用于查詢dom),每種情況都返回一個選擇器實例(習慣稱jQuery對象(一個nodeList對象),該對象包含查詢的dom節點):
1、處理 $(""), $(null), $(undefined), $(false)
如果參數為以上非法值,jQuery對象不包含dom節點
2、處理 $(DOMElement)
如果參數為節點元素,jQuery對象包含該參數節點元素,并分別增加屬性值為參數節點元素、1的context、length屬性和用[]訪問jQuery對象中dom節點的用法
例2.1:
復制代碼 代碼如下:

var obj = document.getElementById('container'),
jq = $(obj);

console.log(jq.length); //1
console.log(jq.context); //obj
console.log(jq.[0]); //obj

3、處理$(HTML字符串)
如果第一個參數為HTML字符串,jQuery對象包含由jQuery.clean函數創建的fragment文檔碎片中的childnodes節點
例3.1:
復制代碼 代碼如下:

var jqHTML = $('<h1>文章標題</h1><p>內容</p>');
console.log(jqHTML); //[<h1>,<p>];

如果第一個參數(HTML字符串)為一個空的單標簽,且第二個參數context為一個非空純對象
例3.2:
復制代碼 代碼如下:

var jqHTML = $('<div></div>', { class: 'css-class', data-name: 'data-val' });

console.log(jqHTML.attr['class']); //css-class
console.log(jqHTML.attr['data-name']); //data-val

4、處理$(#id)
如果第一個參數是一個#加元素id,jQuery對象包含唯一擁有該id的元素節點,
并分別增加屬性值為document、參數字符串、1、的context、selector、length屬性和用[]訪問jQuery對象中dom節點的用法
例4.1:
復制代碼 代碼如下:

var jq = $('#container');

console.log(jq.[0]); //包含的dom節點元素
console.log(jq.length); //1
console.log(jq.context); //document
console.log(jq.selector); //container

5、處理$(.className)
如果第一個參數是一個.className,jQuery對象中擁有class名為className的標簽元素,并增加一個屬性值為參數字符串、document的selector、context屬性
實際執行代碼為:
復制代碼 代碼如下:

return jQuery(document).find(className);

6、處理$(.className, context)
如果第一個參數是.className,第二個參數是一個上下文對象(可以是.className(等同于處理$(.className .className)),jQuery對象或dom節點),
jQuery對象包含第二個參數上下文對象中擁有class名為className的后代節點元素,并增加一個context和selector屬性
實際執行代碼為:
復制代碼 代碼如下:

return jQuery(context).find(className);

例6.1:
html代碼:
復制代碼 代碼如下:

<div class="main">
<h2 class="title">主內容標題</h2>
<p>主標題</p>
</div>
<div class="sub">
<h2 class="title">次內容標題</h2>
<p>次標題</p>
</div>

JavaScript代碼:
復制代碼 代碼如下:

var jq, context;
context = '.sub';
var jq = $('.title', context);
console.log(jq.text()); //次內容標題
console.log(jq.context); //document
console.log(jq.selector); //.sub .title
context = $('.sub');
var jq = $('.title', context);
console.log(jq.text()); //次內容標題
console.log(jq.context); //document
console.log(jq.selector); //.sub .title
context = $('.sub')[0];
var jq = $('.title', context);
console.log(jq.text()); //次內容標題
console.log(jq.context); //className為sub的節點元素
console.log(jq.selector); //.title

7、處理$(fn)
如果第一個參數是fn函數,則調用$(document).ready(fn);
例7.1:
復制代碼 代碼如下:

$(function(e){
console.log('DOMContent is loaded');
})
//上面代碼等同于:
jQuery(document).ready(function(e) {
console.log('DOMContent is loaded');
});

8、處理$(jQuery對象)
如果第一個參數是jQuery對象,上面已經分析過如果在查詢dom時,參數是一個#加元素id,返回的jQuery對象會增加一個屬性值為參數字符串、document的selector、context屬性
例8.1:
復制代碼 代碼如下:

var jq = $('#container');
console.log(jq.selector); // #container
console.log(jq.context); // document

那么當出現$($('#container'))該如何處理呢?同樣的,返回的jQuery對象同情況5和6處理的情況一樣
例8.2:
復制代碼 代碼如下:

var jq2 = $($('#container'));
console.log(jq2.selector); // #container
console.log(jq2.context); // document

二、源碼注釋分析
[ 基于jQuery1.8.3 ]
復制代碼 代碼如下:

var rootjQuery = $(document),
rquickExpr = /^(?:[^#<]*(<[/w/W]+>)[^>]*$|#([/w/-]*)$)/;
jQuery.fn = jQuery.prototype = {
init: function( selector, context, rootjQuery ) {
var match, elem, ret, doc;
// Handle $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
// Handle HTML strings
if ( typeof selector === "string" ) {
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 = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #id
// match[1]不為null,則為html字符串,match[2]不為null,則為元素id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
doc = ( context && context.nodeType ? context.ownerDocument || context : document );
// scripts is true for back-compat
// selector是由文檔碎片中的childnodes組成的數組
selector = jQuery.parseHTML( match[1], doc, true );
// 如果match[1]為空的單標簽元素(如:<div><div>)且context為對象字面量
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
// 如果context對象不為空,則將對象中的屬性添加到selector數組中僅有的dom節點中
this.attr.call( selector, context, true );
}
// merge函數的參數應該為兩個數組,目的是將第二個數組中的項合并到第一個數組,而this并不是一個數組,
// this是選擇器init構造函數的實例對象,該對象繼承jQuery.prototype對象中的length屬性(默認為0),因此可以理解好merge函數源碼
// 將selector中的dom項合并到this對象中,并返回該對象
return jQuery.merge( this, selector );
// 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
if ( elem && elem.parentNode ) {
// Handle the case where IE and Opera return items
// by name instead of ID
// ie6,7和Opera存在此bug,當一個標簽name和一個標簽id值相等時,
// document.getElementById(#id)函數將返回提前出現的標簽元素
if ( elem.id !== match[2] ) {
// 如果存在以上Bug,則返回由find函數返回的document文檔的后代元素集合
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
}
// HANDLE: $(expr, $(...))
// context不存在或者context為jQuery對象
} else if ( !context || context.jquery ) {
return ( context || rootjQuery ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
// context為className或者dom節點元素
} else {
// 等同于jQuery(context).find(selector)
return this.constructor( context ).find( selector );
}
// 處理$(fn)===$(document).ready(fn)
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
// 處理$(jQuery對象)
if ( selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
// 當第一個參數selector為jQuery對象時,將selector中的dom節點合并到this對象中,并返回this對象
return jQuery.makeArray( selector, this );
}
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品美女| 欧美激情在线观看| 这里只有精品丝袜| 中国人与牲禽动交精品| 97超级碰碰碰久久久| 97碰在线观看| 一区二区三区天堂av| 久久精品国产清自在天天线| 日本不卡高字幕在线2019| 欧美一区二区三区免费视| 国产成人小视频在线观看| 欧美国产极速在线| 久久亚洲精品视频| 久久久久久69| 日韩免费av片在线观看| 国产精品老女人精品视频| 亚洲国模精品一区| 日韩美女中文字幕| 亚洲午夜精品久久久久久性色| 少妇精69xxtheporn| 日韩麻豆第一页| 久久久伊人欧美| 91精品视频播放| 成人免费视频在线观看超级碰| 亚洲综合色激情五月| 亚洲国产美女精品久久久久∴| 亚洲人av在线影院| 欧美黑人视频一区| 亚洲第一页中文字幕| 68精品久久久久久欧美| 国产国语videosex另类| 国产日韩在线播放| zzijzzij亚洲日本成熟少妇| 欧美日韩性生活视频| 国产性猛交xxxx免费看久久| 国产综合久久久久久| 成人黄色午夜影院| 国模视频一区二区三区| 精品久久久久久久久久| 亚洲区bt下载| 一区二区三区视频在线| 亚洲最大的成人网| 亚洲精品aⅴ中文字幕乱码| 国产亚洲精品激情久久| 亚洲国产精品久久久久秋霞不卡| 97香蕉超级碰碰久久免费软件| 日本一区二三区好的精华液| 欧美电影免费观看网站| 国产精品日韩久久久久| 日本精品一区二区三区在线播放视频| 伊人伊人伊人久久| 欧美精品生活片| 国产精品丝袜久久久久久高清| 粉嫩老牛aⅴ一区二区三区| 国产精品视频久久| 精品一区二区亚洲| 日韩大陆欧美高清视频区| 国产成人综合精品在线| 怡红院精品视频| 欧美大片第1页| 亚洲一区二区久久久久久| 欧美大奶子在线| 国产精品高潮呻吟久久av黑人| 91精品国产色综合久久不卡98口| 亚洲已满18点击进入在线看片| 亚洲午夜小视频| 久久久久久久成人| 成人美女av在线直播| 日本一区二三区好的精华液| 国产精品2018| www.日韩不卡电影av| 乱亲女秽乱长久久久| 亚洲网站在线播放| 欧美美女15p| 精品久久中文字幕| 日韩在线免费观看视频| 国产有码在线一区二区视频| 欧美日韩中文字幕在线| 在线成人一区二区| 国产91精品久久久久久| 欧美性生交大片免网| 日韩av理论片| 伊人伊成久久人综合网小说| 7777免费精品视频| 国产日韩在线精品av| 国产精品女人网站| 中文字幕日韩欧美在线视频| 中文字幕亚洲一区二区三区五十路| 福利一区视频在线观看| 国产精品成人一区二区三区吃奶| 久久视频国产精品免费视频在线| 欧美激情18p| 精品欧美一区二区三区| 在线日韩日本国产亚洲| 精品美女永久免费视频| 成人午夜在线影院| 国内偷自视频区视频综合| 欧美日韩成人在线观看| 亚洲人成欧美中文字幕| 国产亚洲一区二区精品| 国产xxx69麻豆国语对白| 九九热99久久久国产盗摄| 国产啪精品视频网站| 亚洲精品97久久| 欧美大片在线看免费观看| 久久久精品久久久久| 日韩在线视频网| 久久九九国产精品怡红院| 欧美激情在线观看| 欧美xxxx做受欧美| 久久久久久久999精品视频| 国产亚洲精品美女| 亚洲免费视频一区二区| 国产精品福利在线观看网址| 91久久夜色精品国产网站| 欧美激情第一页xxx| 亚洲天堂免费视频| 亚洲精品福利在线观看| 亚洲高清在线观看| 亚洲国产日韩精品在线| 精品欧美激情精品一区| 日韩激情视频在线| 97碰在线观看| 日韩欧美中文在线| 亚洲美女av在线| 午夜精品视频网站| 国外成人在线播放| 高清亚洲成在人网站天堂| 国产女人18毛片水18精品| 欧美色图在线视频| 成人精品久久一区二区三区| 热re91久久精品国99热蜜臀| 欧美性猛交xxxx免费看久久久| 欧美日韩精品在线观看| 俺去亚洲欧洲欧美日韩| 亚洲自拍偷拍色片视频| 亚洲aa在线观看| 久久免费精品日本久久中文字幕| 国产一区二区丝袜| 国产99久久精品一区二区| 亚洲国产小视频在线观看| 欧美黄色三级网站| 欧美黑人xxxx| 精品视频在线播放免| 亚洲精品suv精品一区二区| 69**夜色精品国产69乱| 国产大片精品免费永久看nba| 国产精品99久久久久久白浆小说| 国产成人久久久精品一区| 亚洲午夜av久久乱码| 日韩欧美中文第一页| 久久人人爽人人爽人人片亚洲| 精品视频在线播放色网色视频| 最近2019中文字幕mv免费看| xxxxx成人.com| 精品久久久中文| 国产成人精品免费视频| 日韩欧美a级成人黄色| 日韩av综合中文字幕| 国产日韩欧美中文| 日本aⅴ大伊香蕉精品视频| 4k岛国日韩精品**专区| 色偷偷av一区二区三区乱| 欧美日韩视频免费播放|