日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入了解jQuery之整体架构

發布時間:2024/10/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入了解jQuery之整体架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是在閱讀了Aaron艾倫的jQuery源碼解析(地址:http://www.imooc.com/learn/172)后的個人體會以及筆記。在這里感謝艾倫老師深入淺出的講解!!

?

先來看看如何生成一個jQuery對象,源碼:

var jQuery = function( selector, context ) {return new jQuery.fn.init( selector, context );};

當我們使用jQuery('something')或者$('something')時,我們得到的是一個 jQuery.fn.init()對象。那么jQuery.fn是什么鬼?

jQuery.fn = jQuery.prototype = {// jQuery版本 jquery: version,constructor: jQuery, // 構造函數// Start with an empty selectorselector: "",// The default length of a jQuery object is 0length: 0,// 省略..... }

jQuery.fn 實際上是jQuery構造函數的原型對象的引用!! 所以我們以后看到 jQuery.fn時,把他當成jQuery構造函數的原型對象就可以了。

知道了jQuery.fn , 接下來看看jQuery.fn.init()函數

jQuery.fn.init = function( selector, context ) {// 省略....
return this;};
jQuery.fn.init.prototype = jQuery.prototype; // 注意這里! 這句代碼讓init對象可以使用jQuery的原型方法。

這樣,我們在創建jQuery對象時就不用使用new關鍵字了。

整體看一下源碼架構:

var $ = jQuery = function(selector,context){return new jQuery.fn.init(selector,context) // 返回一個jQuery.fn.init()對象 }jQuery.fn = jQuery.prototype = {constructor:jQuery,init:function(){// 省略.....return this;} } jQuery.fn.init.prototype = jQuery.fn

?

直觀的感受一下相互之間的關系:

?

調用jQuery函數,我們得到的是一個jQuery.fn.init實例,這個實例的原型對象被重新指向到了jQuery函數的原型對象,所以這個實例可以使用jQuery原型對象的屬性和方法,而如果我們給jQuery函數附加方法,那么這個方法就變成了靜態方法

然后來看一下jQuery.fn.init函數的源碼:

var rootjQuery,// A simple way to check for HTML strings// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)// Strict HTML recognition (#11290: must start with <)rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,// <any+>--任意個非右尖括號字符 或者 以#開頭的 init = jQuery.fn.init = function( selector, context ) {var match, elem;// HANDLE: $(""), $(null), $(undefined), $(false)if ( !selector ) {return this;}// Handle HTML stringsif ( typeof selector === "string" ) {// 如果selector的格式是字符串類型,且字符串長度大于等于3,并且內容格式為: <something>if ( selector[0] === "<" &&selector[ selector.length - 1 ] === ">" &&selector.length >= 3 ) {// Assume that strings that start and end with <> are HTML and skip the regex checkmatch = [ null, selector, null ];} else {match = rquickExpr.exec( selector );}// Match html or make sure no context is specified for #idif ( match && (match[1] || !context) ) {// HANDLE: $(html) -> $(array)if ( match[1] ) { // context = context instanceof jQuery ? context[0] : context;// Option to run scripts is true for back-compat// Intentionally let the error be thrown if parseHTML is not presentjQuery.merge( this, jQuery.parseHTML(match[1],context && context.nodeType ? context.ownerDocument || context : document,true) );// HANDLE: $(html, props)if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {for ( match in context ) {// Properties of context are called as methods if possibleif ( jQuery.isFunction( this[ match ] ) ) {this[ match ]( context[ match ] );// ...and otherwise set as attributes} else {this.attr( match, context[ match ] );}}}return this;// HANDLE: $(#id)} else {elem = document.getElementById( match[2] );// Support: Blackberry 4.6// gEBID returns nodes no longer in the document (#6963)if ( elem && elem.parentNode ) {// Inject the element directly into the jQuery objectthis.length = 1;this[0] = elem;}this.context = document;this.selector = selector;return this;}// HANDLE: $(expr, $(...))} else if ( !context || context.jquery ) {return ( context || rootjQuery ).find( selector );// HANDLE: $(expr, context)// (which is just equivalent to: $(context).find(expr)} else {return this.constructor( context ).find( selector );}// HANDLE: $(DOMElement)} else if ( selector.nodeType ) {this.context = this[0] = selector;this.length = 1;return this;// HANDLE: $(function)// Shortcut for document ready} else if ( jQuery.isFunction( selector ) ) {return typeof rootjQuery.ready !== "undefined" ?rootjQuery.ready( selector ) :// Execute immediately if ready is not present selector( jQuery );}if ( selector.selector !== undefined ) {this.selector = selector.selector;this.context = selector.context;}return jQuery.makeArray( selector, this );}; View Code

?

?配張思路圖:

?

轉載于:https://www.cnblogs.com/MnCu8261/p/6075489.html

總結

以上是生活随笔為你收集整理的深入了解jQuery之整体架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人公开视频 | 美女天天操 | 国产69精品久久久久久久 | 黄色网页免费在线观看 | 深田咏美中文字幕 | 成人在线免费视频播放 | 久久精品国内 | 免费人妻一区二区三区 | 精品xxxx | 欧美成人黑人xx视频免费观看 | 在线观看福利视频 | 久久aⅴ国产欧美74aaa | 亚洲天堂av一区 | 九色视频自拍 | 日韩一区二区影院 | 一区二区伊人 | 国产免费无遮挡吸奶头视频 | 污视频网站免费在线观看 | 亚洲国产日韩一区无码精品久久久 | 亚洲一区二区三区麻豆 | 正在播放木下凛凛xv99 | 成人高清免费 | 久久久看 | 99视频这里有精品 | 中国国产bdsm紧缚捆绑 | 久久99精品久久久久 | 久久久久麻豆v国产精华液好用吗 | hs在线观看| 依依成人综合网 | 五月天小说网 | 亚洲成人1区 | 欧美日韩中文字幕在线视频 | 一级黄色免费毛片 | 神马久久精品 | 国产无遮挡又黄又爽免费网站 | 伊人网影院 | 激情小说五月天 | 亚洲爽爽网| 囯产精品久久久久久 | www男人的天堂 | 亚洲欧美日韩中文字幕在线观看 | 精品国产理论 | 蜜臀精品 | 亚洲一区二区影院 | 婷婷丁香视频 | 91在线视频在线观看 | 图片区视频区小说区 | 久一国产| 日韩综合在线观看 | 精品一区二区三 | 日日人人 | 黄色av免费播放 | 欧美日韩一区精品 | 亚洲精品在线播放视频 | 懂色av蜜臀av粉嫩av分 | 国产精品久久久久久久妇 | 午夜福利视频一区二区 | 红桃视频91 | 色视频免费在线观看 | av片子在线观看 | 一区二区有码 | 波多野一区 | 青青艹在线视频 | 日日骚视频 | 麻豆婷婷 | 少女视频的播放方法 | 色综合天天网 | av中文字幕一区二区三区 | 中文字幕高清在线播放 | 波多野吉衣一区 | 日本a级在线| 九九精品热 | 性欢交69国产精品 | a√天堂资源在线 | 男女午夜爽爽爽 | 日韩精品在线视频观看 | 亚洲の无码国产の无码步美 | 国语粗话呻吟对白对白 | 国产精品久久久久久久久久久新郎 | 男人插女人免费视频 | 欧美亚洲二区 | 99re久久| 欧美高清视频一区二区 | 欧美日韩一区二区三区69堂 | 国产二区视频在线观看 | 日韩av中文在线观看 | 亚洲妇女无套内射精 | 波多野结衣视频免费看 | 中文字幕一区二区三区精彩视频 | 国内成人自拍视频 | 成人国产精品免费观看 | 久久艹久久| 九七影院在线观看免费观看电视 | 国产亚洲综合在线 | 精品国产乱码久久久久久1区2区 | 欧美人与野 | 欧美精品v | 在线黄色网 | 色综合av在线 |