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

首頁 > 編程 > JavaScript > 正文

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

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

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

如果第一個參數(shù)(HTML字符串)為一個空的單標簽,且第二個參數(shù)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)
如果第一個參數(shù)是一個#加元素id,jQuery對象包含唯一擁有該id的元素節(jié)點,
并分別增加屬性值為document、參數(shù)字符串、1、的context、selector、length屬性和用[]訪問jQuery對象中dom節(jié)點的用法
例4.1:
復制代碼 代碼如下:

var jq = $('#container');

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

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

return jQuery(document).find(className);

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

return jQuery(context).find(className);

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

<div class="main">
<h2 class="title">主內(nèi)容標題</h2>
<p>主標題</p>
</div>
<div class="sub">
<h2 class="title">次內(nèi)容標題</h2>
<p>次標題</p>
</div>

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

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

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

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

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

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

那么當出現(xiàn)$($('#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組成的數(shù)組
selector = jQuery.parseHTML( match[1], doc, true );
// 如果match[1]為空的單標簽元素(如:<div><div>)且context為對象字面量
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
// 如果context對象不為空,則將對象中的屬性添加到selector數(shù)組中僅有的dom節(jié)點中
this.attr.call( selector, context, true );
}
// merge函數(shù)的參數(shù)應該為兩個數(shù)組,目的是將第二個數(shù)組中的項合并到第一個數(shù)組,而this并不是一個數(shù)組,
// this是選擇器init構造函數(shù)的實例對象,該對象繼承jQuery.prototype對象中的length屬性(默認為0),因此可以理解好merge函數(shù)源碼
// 將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)函數(shù)將返回提前出現(xiàn)的標簽元素
if ( elem.id !== match[2] ) {
// 如果存在以上Bug,則返回由find函數(shù)返回的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節(jié)點元素
} 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;
}
// 當?shù)谝粋€參數(shù)selector為jQuery對象時,將selector中的dom節(jié)點合并到this對象中,并返回this對象
return jQuery.makeArray( selector, this );
}
}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲成人av片在线观看| 日韩视频在线你懂得| 在线观看国产精品日韩av| 国产手机精品在线| 日本视频网址| 秋霞影院午夜丰满少妇在线视频| 91精品国产入口| www.神马久久| 久久6免费视频| 免费高清视频在线观看| 亚洲精品一区二区三区影院| 日产日韩在线亚洲欧美| 国产不卡视频| 亚洲伦理在线观看| 成人日批视频| 亚洲精品日韩av| 欧美在线播放一区| 2222www色视频在线观看| 欧美一区二区三区视频免费| 夜夜狠狠擅视频| 男人天堂网站| 国产免费不卡| 污污网站免费观看| 亚州av一区| 欧美13一14另类| 亚洲激情一二三区| 国产丝袜欧美中文另类| 香蕉乱码成人久久天堂爱免费| 搞黄网站在线看| 99久久免费国产精精品| 一级黄色香蕉视频| 性欧美丰满熟妇xxxx性仙踪林| 欧美一级本道电影免费专区| 丁香婷婷在线观看| julia中文字幕久久亚洲蜜臀| 激情文学综合丁香| 午夜亚洲视频| 国产一区二区三区在线免费| 国产调教视频在线观看| 96sao在线精品免费视频| 嫩草嫩草嫩草| 国产真实乱在线更新| 久久久久久日本一区99| 日韩av密桃| 国产视频自拍一区| 无需播放器亚洲| 伊人伊成久久人综合网小说| 日韩国产精品亚洲а∨天堂免| 亚洲免费资源| 黄色av网址在线免费观看| 欧美日韩免费在线观看| 999精品视频在线观看| 国内不卡的二区三区中文字幕| 最新国产成人在线观看| 国产99久久精品一区二区永久免费| 午夜免费福利视频| 香蕉国产在线| 国产精品专区h在线观看| 国产成人一区二区三区别| 91插插插插插插插插| 91porn在线观看| 国产精品视频分类| 草裙成人精品一区二区三区| 精品国产一区二区三区不卡| 国产欧美精品在线播放| 精品黑人一区二区三区观看时间| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 国产精品入口麻豆九色| 色猫猫国产区一区二在线视频| 国产精品一区二区三区四区在线观看| 6080亚洲理论片在线观看| 欧洲在线视频一区| 日本一本二本在线观看| 精品免费视频一卡2卡三卡4卡不卡| 国产日韩欧美在线播放不卡| 国产乱理伦片在线观看夜一区| 国产精品成人观看视频国产奇米| 婷婷久久国产对白刺激五月99| 成人精品亚洲人成在线| 99av国产精品欲麻豆| 羞羞影院体验区| 国产视频三区| 一道本视频在线观看| 麻豆免费精品视频| 在线免费观看不卡av| 国产精品偷拍| shkd中文字幕久久在线观看| 欧洲精品中文字幕| 精品国产www| 欧美黑人性猛交xxx| 无码日韩人妻精品久久蜜桃| 久久精品中文| 国产盗摄一区二区三区| 亚洲成人一二三| 91麻豆精品国产91久久久使用方法| 国产精品嫩草av| 欧美一区二区日韩| 中国老太性bbbxxxx| 欧美国产一区二区在线观看| 中文字幕一区二区在线视频| 亚洲在线www| 成人公开免费视频| а天堂中文最新一区二区三区| 性色88av老女人视频| 国产毛片精品| 丁香视频免费观看| 中文字幕在线亚洲| 高清在线观看av| 欧美一区二区三区视频免费播放| 性欧美video另类hd尤物| 中文成人综合网| 俺去了亚洲欧美日韩| 国产精品国产精品88| 亚洲午夜一二三区视频| 偷拍视频一区二区| 影音先锋男人资源在线| 久久影视中文字幕| 亚洲综合无码一区二区| 最近更新的2019中文字幕| missav|免费高清av在线看| 久久性感美女视频| 国产精品一区二区午夜嘿嘿嘿小说| 国产天堂在线观看| 日韩经典一区二区| 国产成人在线观看免费网站| 欧美在线观看禁18| 意大利激情丛林无删减版dvd| 亚洲美女色视频| 538任你躁在线精品视频网站| 中文字幕国产一区| 国产精品免费区二区三区观看| 国产一区二区三区国产| 一区二区三区在线免费看| 伊人久久青青草| 亚洲自拍偷拍一区二区| 麻豆成人av| 欧美国产偷国产精品三区| 国产呻吟对白刺激无套视频在线| 久久久成人网| 欧美18hd| 中国成人一区| 高潮毛片7777777毛片| 日本激情综合网| 国产精品大陆在线观看| 91嫩草国产在线观看| 亚洲色图综合网| 66av99| 欧美日韩国产综合视频在线观看中文| 免费拍拍拍网站| 欧美国产先锋| 亚洲777理论| 欧洲有码在线视频| 男女视频网站在线观看| 亚乱亚乱亚洲乱妇| 三级在线观看免费大全| 精品成人私密视频| 久草视频免费在线| 精品国产乱子伦| 26uuu久久天堂性欧美| 在线观看成人毛片| 99re5久久在热线播放| 亚洲日韩欧美一区二区在线| 亚洲成人一级片| 91在线成人| 天天干天天舔| а√中文在线天堂精品| 中文字幕亚洲欧洲| 99这里有精品| 日韩人妻无码一区二区三区| 91av成人在线| 五月婷婷丁香网| 国产视频在线一区| 国产白丝精品91爽爽久久| 最好看的中文字幕| 亚洲一级在线观看| 天堂久久一区二区三区| 亚洲欧洲美洲av| 天堂av中文在线观看| www黄色在线| 加勒比色老久久爱综合网| 免费福利视频网站| 一区二区亚洲精品| 亚洲 国产 欧美一区| 大胆欧美熟妇xx| 亚洲成人免费电影| 伊人成色综合网| 欧美一区二区福利视频| 国产精品女同一区二区| 992tv在线成人免费观看| 蜜桃视频在线观看www社区| 九九热在线免费| 久热av在线| 欧美人在线观看| 欧美精品乱人伦久久久久久| 欧美成年人网站| 亚洲图区综合网| 国产一区一区| 日韩美女视频一区二区| 亚洲色图综合久久| jizz性欧美2| **亚洲第一综合导航网站| 欧美日韩不卡中文字幕在线| 久久久高清视频| 天堂中文av在线资源库| 一本久道久久综合狠狠爱| 国产精品毛片aⅴ一区二区三区| 日本在线视频www| 日本高清中文字幕二区在线| 欧美中文字幕在线观看| 免费cad大片在线观看| 99爱在线观看| 国产尤物在线视频| 男人在线资源站| 欧洲日本在线| 精品久久中文字幕久久av| 正在播放一区二区三区| 精选一区二区三区四区五区| 日本视频在线播放| 国产黄色一级网站| 一本二本三本亚洲码| 日本夜爽爽一二区| 欧美最猛性xxxx高清| 国产亚洲成av人片在线观黄桃| 国产成人精品av久久| 在线视频91| 欧美一区二区精品在线| 国产亚洲欧美日韩精品| 欧美精品videos| 最新精品国偷自产在线| 精品国产老师黑色丝袜高跟鞋| 亚洲成年人av| 欧美精品三级在线| 国产亚洲一区二区三区在线播放| 色老头一区二区三区| 国产最新自拍视频| 欧美日韩国产精品一区二区亚洲| 一呦二呦三呦国产精品| 91亚洲永久免费精品| 成人午夜在线视频| 欧美高清中文字幕| 激情综合色综合啪啪开心| 国产精品欧美经典| 91在线视频免费看| 成人激情视频在线| 女人高潮一级片| 中文字幕欧美专区| 99re在线视频免费观看| 八戒八戒神马在线电影| 国产理论在线| 视频一区二区免费| 欧美变态xxxx| 婷婷综合影院| 欧美电影免费观看网站| 日韩在线视频观看正片免费网站| 日韩欧美成人精品| 一区在线观看| 日本网站免费在线观看| 美国黑人一级大黄| 国产在线高清| 久久精品国产2020观看福利| 欧美一区二区三区在线观看免费| 欧美精品成人一区二区三区四区| 日韩福利视频导航| 欧美日韩123区| 午夜天堂精品久久久久| 美女黄视频在线观看| 亚洲v天堂v手机在线| 污视频在线免费观看一区二区三区| 欧美在线关看| 麻豆国产视频| 二区三区在线观看| 欧美极品影院| www.欧美国产| 狠狠操第一页| 宅男午夜视频| 久久99精品久久久久久水蜜桃| 美国成人毛片| 香蕉久久夜色| 成人激情综合网站| 老熟妇仑乱视频一区二区| 91亚洲视频| 国产一区精品在线| 妺妺窝人体色WWW精品| 91亚洲国产高清| 欧美性生活大片免费观看网址| 久久久久久综合网天天| eeuss影院www在线观看手机| 亚洲精品偷拍视频| 欧美久久久久久久| 成人的网站免费观看| 在线免费观看一区| 中文有码一区| 可以www视频| 亚洲成人黄色片| 中文字幕国产精品一区二区| 成人性生交大片免费看中文网站| 一区二区三区四区视频在线| 午夜精品久久久久久久第一页按摩| 韩日av一区二区| 嗯啊主人调教在线播放视频| 中文字幕国内自拍| 日韩视频在线视频| 无国产精品白浆是免费| 亚洲精品国产精品国自产网站按摩| 欧洲福利电影| 国产1区2区3区精品美女| 一区二区三区伦理片| 97成人超碰| 午夜影视日本亚洲欧洲精品| 国产乱子伦三级在线播放| 精华区一区二区三区| av中文字幕在线免费观看| 老司机2019福利精品视频导航| 欧美麻豆久久久久久中文| 久久精品国产亚洲AV无码麻豆| 高清不卡一区二区三区| 成年在线播放小视频| 国产香蕉在线视频| 亚洲欧美一区二区三区在线播放| 综合天堂av久久久久久久| 日韩伦理在线电影| 亚洲人成色777777精品音频| 久久久九九九热| 五月天婷婷综合社区| 亚洲日本在线天堂| jizz免费视频| 日韩最新免费不卡| 日韩成人在线观看视频|