国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

jquery選擇器原理介紹($()使用方法)

2024-05-06 16:03:14
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了jquery選擇器原理介紹($()使用方法),需要的朋友可以參考下

每次申明一個jQuery對象的時候,返回的是jQuery.prototype.init對象,很多人就會不明白,init明明是jQuery.fn的方法啊,實際上這里不是方法,而是init的構造函數,因為js的prototype對象可以實現繼承,加上js的對象只是引用不會是拷貝,new jQuery,new jQuery.fn和new jQuery.fn.init的子對象是一樣的,只是有沒有執行到init的不同。

當我們使用選擇器的時候$(selector,content),就會執行init(selectot,content),我們看看inti中是怎樣執行的:

復制代碼 代碼如下:


if ( typeof selector == "string" )
{
 //正則匹配,看是不是HTML代碼或者是#id
    var match = quickExpr.exec( selector );
    //沒有作為待查找的 DOM 元素集、文檔或 jQuery 對象。
 //selector是#id的形式
 if ( match && (match[1] || !context) )
 {
  // HANDLE: $(html) -> $(array)
  //HTML代碼,調用clean補全HTML代碼
  if ( match[1] ){
   selector = jQuery.clean( [ match[1] ], context );
  }
  // 是: $("#id")
  else {
   //判斷id的Dom是不是加載完成
   var elem = document.getElementById( match[3] );
   if ( elem ){
    if ( elem.id != match[3] )
    return jQuery().find( selector );
    return jQuery( elem );//執行完畢return
   }
   selector = [];
  }
  //非id的形式.在context中或者是全文查找
 }
 else{
  return jQuery( context ).find( selector );
 }
}


這里就說明只有選擇器寫成$('#id')的時候最快,相當于執行了一次getElementById,后邊的程序就不用再執行了。當然往往我們需要的選擇器并不是這么簡單,比如我們需要id下的CSS為className, 有這樣的寫法$('#id.className')和$('#id').find('.className');這兩種寫法的執行結果都是一樣的,比如<div id=”id”><span class=”className”></span></div>,返回的肯定都是<span class=”className”></span>,但是執行的效率是完全不一樣的。

在分析一下上邊的代碼,如果不是$('#id')這樣的簡單選擇器的話,都會執行find函數,那我們再看看find到底是做用的:

復制代碼 代碼如下:


find: function( selector ) {
 //在當前的對象中查找
 var elems = jQuery.map(this, function(elem){
  return jQuery.find( selector, elem );
 });
 //下邊的代碼可以忽略,只是做一些處理
 //這里應用了js的正則對象的靜態方法test
 //indexOf("..")需要了解一下xpath的語法,就是判斷selector中包含父節點的寫法
 //本意就是過濾數組的重復元素
 return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
  jQuery.unique( elems ) :
  elems );
}


如果這樣寫$('#id .className'),就會執行到擴展的find('#id .className',document),因為當前的this是document的jQuery數組,那我們在看看擴展的find他的實現,代碼比較 多,就不列出來,總之就是從第二個參數傳遞進行的dom第一個子節點開始找,遇見#比對id,遇見.比對ClassName,還有:<+-等處理。 那我們要優化,是不是就要想辦法讓第二個參數context的范圍最小,那樣遍歷是不是就很少了?

如果我們這樣寫$('#id').find('.className'),那程序只這樣執行 的,第一次init的時候執行一步getElementById,就return了,接著執行 find('.className',divDocument),divDocument就是我們第一次選擇的是div標簽,如果document下有很 多dom對象的時候,這次只遍歷divDocument是不是少了很多次,而且在第一次選擇id的速度也要比遍歷快的多。

現在大家應該是明白了吧。就是說第一層選擇最好是ID,而是簡單選擇器,目的就是定義范圍,提高速度。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 湄潭县| 潞城市| 西峡县| 松原市| 乌拉特前旗| 新安县| 康乐县| 日喀则市| 延寿县| 新野县| 安图县| 宜兰市| 兴宁市| 乌拉特后旗| 龙江县| 鹤壁市| 逊克县| 明溪县| 延庆县| 安陆市| 孟村| 杭州市| 远安县| 晴隆县| 大厂| 西安市| 扎赉特旗| 建平县| 宣化县| 晋江市| 二手房| 恩施市| 吴桥县| 天等县| 南和县| 鹤岗市| 万全县| 三台县| 晋江市| 报价| 河北区|