<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 21:38:19
        文檔

        jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery

        jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery:如果selector是其他字符串情況就比較多了比較復雜了 // Handle HTML strings if ( typeof selector === string ) {...} 開始分不同的情況處理 // Are we dealing with HTML string or an ID? if (
        推薦度:
        導讀jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery:如果selector是其他字符串情況就比較多了比較復雜了 // Handle HTML strings if ( typeof selector === string ) {...} 開始分不同的情況處理 // Are we dealing with HTML string or an ID? if (

        如果selector是其他字符串情況就比較多了比較復雜了

        開始分不同的情況處理

        If里面先判斷第一個字符是“<”最后一個字符是“>”并且長度大于3就假設此時的selector是html簡單標簽 ,比如$(‘')但是記住僅僅是假設”assume”比如$(‘')這樣的也會走這里。然后把match數(shù)組修改成[null,selector,null],這里的match是在init函數(shù)里面聲明的變量,主要是用來作為區(qū)分是參數(shù)類型的工具稍后在將可能情況列出,下面是源碼中聲明的四個變量

        如果不滿足if的條件就會調(diào)用一個正則去得到match的結(jié)果,quickExpr是jQuery構(gòu)造函數(shù)里面聲明的變量

        這個正則主要是為了區(qū)別html字符串和id字符串的,第二個注釋中講到了為了避免基于 location.hash的 XSS 攻擊,于是在 quickExpr 中增加了 #(#9521)的意思是我們可以在jQuery官網(wǎng)找到相關解釋。

        首先訪問http://bugs.jquery.com/然后搜索對應的值即可

        quickExpr.exec( selector )執(zhí)行的結(jié)果可以是一個數(shù)組,數(shù)組的第一個元素是匹配的元素,剩下的分別是分組匹配的元素,這個正則有兩個分組(<[\w\W]+>)[^>]和([\w\-]*)一個是標簽一個是id值。最終會把結(jié)果交給match。下面就來分析下match的各種情況首先單標簽不用正則式是 [ null, selector, null ]的形式,下面在代碼中證明:

        
        
         
         
         
        輸出得到的match結(jié)果:

        下面我們修改一下參數(shù)改為$(‘#div')然后再看一下結(jié)果

        代碼如下:
        ["#div", undefined, "div", index: 0, input: "#div"]

        還有一種比較特殊的情況$(‘123')然后我們再看一下結(jié)果

        代碼如下:
        ["dewrwe", "", undefined, index: 0, input: "dewrwe"]

        我們可以看到id總是在第三個元素而標簽值在第二個元素保存著,對于最后一種情況而言跟$(‘')是沒有什么區(qū)別的因為生成dom元素時是不會處理第一個元素的。基于這個結(jié)果可以接著來分析下一個判斷了。

        接下來的會根據(jù)match的結(jié)果分為三種情況

        第一種情況滿足的條件是match一定要有值,match[1]就是第二個元素就是保存標簽的這個有值或者不存在上下文,但是好像沒有id什么事啊?其實不是的通過分析match的結(jié)果可以知道第二個元素沒有值肯定就是id選擇器得到的結(jié)果,而id是唯一的,不需要寫上下文(其實寫了上下文也會正常執(zhí)行只不過會使用Sizzle而不是在這里處理了跟body是一樣的)。好了第一個條件進來的情況就是

        1.標簽

        $(‘') $(‘123') $(‘23213213')...

        2.沒有上下文的id $(‘#div')

        第一個條件內(nèi)部又進行了細分:

        很顯然if是處理標簽的else是處理id的,先來看看是怎么處理標簽的吧

        首先修正一下context的值,如果是jQuery對象就把他變成dom元素就是使用下標的方法這個原理之前說過了,然后有處理了doc變量,如果context不存在就把document賦值給doc如果存在且有ownerDocument屬性那就是dom元素了這個值還是document如果不是dom元素比如普通的js對象的話那就把這個對象賦值給doc變量。緊接著對selector又進行了一個正則判斷,這個正則也是在jQuery構(gòu)造函數(shù)里面聲明的目的是判斷單標簽 比如這樣的

        代碼如下:
        // Match a standalone tag
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,

        然后把結(jié)果交給ret變量,基于ret的值又進行劃分按照單標簽和復雜標簽分開處理ret值存在那就是匹配到了單標簽然后再根據(jù)context是不是普通對象又分為兩種情況isPlainObject是檢測是不是普通對象的方法,如果是普通對象,就利用js原生方法createElement傳入標簽創(chuàng)建元素并放在一個數(shù)組里面,之所以這樣是為了以后跟jquery對象合并方便,然后把數(shù)組賦值給selector,后采用對象冒充的方法調(diào)用attr方法,這里attr居然有3個參數(shù),而平常我們使用的api里面是兩個參數(shù),其實jQuery中有很多類似的情況,同樣的方法有著對內(nèi)對外兩個接口。第二個參數(shù)就是對象形式的上下文,因為attr可以像

        代碼如下:
        $("img").attr({ src: "test.jpg", alt: "Test Image" });

        這給我們的其實就是我們以后可以$(‘',{id:'div'})這樣寫了也是支持的。如果不是對象就直接創(chuàng)建元素不考慮屬性。還是把創(chuàng)建的元素放在數(shù)組里面。如果ret沒有值那就是復雜的標簽了比如$(‘231')這樣的這個時候原生的js就搞不定啦需要調(diào)取另外一個方法jQuery.buildFragment來處理,這個方法實現(xiàn)以后在學習吧,總之最后都會創(chuàng)建dom元素。最后返回合并后的結(jié)果

        代碼如下:
        return jQuery.merge( this, selector );

        不像之前的return this這里是返回merge執(zhí)行后的結(jié)果其實他的任務就是把放在數(shù)組里面的創(chuàng)建好的的dom元素合并到jquery元素中去,最終變成{0:div,length:1...}這樣的對象形式。這樣的話簡標簽情況就處理完畢。

        然后else里面處理的是id的情況

        很簡單直接調(diào)用原生js的id選擇器但是有一些系統(tǒng)會出現(xiàn)bug

        注釋說的很清楚黑莓系統(tǒng),就是元素已經(jīng)不存在了但是依然能夠匹配得到所以再加上父節(jié)點,不存在的元素肯定沒有父節(jié)點的。還有一種情況就是ie和opera瀏覽器會出現(xiàn)按name值匹配的情況所以在做了一個判斷

        if ( elem.id !== match[2] ) {

        如果真的不幸出現(xiàn)了那就不能使用原生方法而是用find方法也就是使用sizzle引擎了,在大多數(shù)正常情況下就直接將獲取到的元素放到this里面就可以啦然后修改下context的值。Ok終于把第一個大分支分析完了。然后再看根據(jù)match的第二個分支

        這里是如果沒有上下文或者上下文是jquery對象的時候這個比較簡單就是直接用find方法了rootjQuery 就是$(document)

        最后字符串的情況上面都不屬于的話

        代碼如下:
        return this.constructor( context ).find( selector );

        This.constructor就是jQuery其實還是使用find方法。

        以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery

        jQuery構(gòu)造函數(shù)init參數(shù)分析續(xù)_jquery:如果selector是其他字符串情況就比較多了比較復雜了 // Handle HTML strings if ( typeof selector === string ) {...} 開始分不同的情況處理 // Are we dealing with HTML string or an ID? if (
        推薦度:
        標簽: 參數(shù) ini jQuery
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 小草在线看片免费人成视久网| 亚洲乱码中文字幕小综合| 欧美日韩亚洲精品| 亚洲精品乱码久久久久久中文字幕| 亚洲中文字幕久久精品蜜桃| 亚洲三级在线免费观看| 亚洲高清资源在线观看| 日日麻批免费40分钟日本的| 亚洲免费视频在线观看| 亚洲黄色免费网站| 亚洲国产成人精品电影| 成人午夜免费福利视频| 国产精品亚洲精品青青青| 日韩电影免费在线观看网址| 亚洲国产综合精品一区在线播放| 免费人成再在线观看网站| 亚洲中文字幕久久精品无码喷水 | 亚洲国产精品综合一区在线| 日本一区二区在线免费观看| 亚洲午夜av影院| 国产精成人品日日拍夜夜免费| 亚洲专区先锋影音| 天天摸天天操免费播放小视频| 色窝窝亚洲AV网在线观看| 中文字幕在线亚洲精品| 每天更新的免费av片在线观看| 国产成人精品日本亚洲11| 免费v片在线观看无遮挡| 免费久久人人爽人人爽av| 亚洲最大在线观看| 国产日产成人免费视频在线观看| 亚洲同性男gay网站在线观看| 成年美女黄网站色大免费视频| 最新亚洲人成无码网站| 亚洲最大激情中文字幕| 222www免费视频| 免费精品久久久久久中文字幕 | 亚洲男人的天堂在线播放| 毛片免费观看的视频| 中文字幕在线视频免费观看| 亚洲成人黄色在线观看|