淺談jQuery功能及原理

awttt1發表於2020-03-28

jQuery 如何獲取元素

jQuery的基本設計思想和主要用法,就是"選擇某個網頁元素,然後對其進行某種操作"

使用jQuery的第一步,往往就是將一個選擇表示式,放進建構函式jQuery()。建構函式接受一個選擇器或者陣列,進而呼叫不同的功能。原理大致是這樣的(超級簡化版):

window.$ =window.jQuery = function(selectorOrArray){
  let elements
  if(typeof selectorOrArray === 'string'){
    elements = document.querySelectorAll(selectorOrArray)
  }else if(selectorOrArray instanceof Array){
    elements = selectorOrArray
  }
  return {//編寫各種功能的介面
}複製程式碼

jQuery選擇網頁元素的方法:

$(document) //選擇整個文件物件
$('#myId') //選擇ID為myId的網頁元素
$('div.myClass') // 選擇class為myClass的div元素
$('input[name=first]') // 選擇name屬性等於first的input元素
$('a:first') //選擇網頁中第一個a元素
$('tr:odd') //選擇表格的奇數行
$('#myForm :input') // 選擇表單中的input元素
$('div:visible') //選擇可見的div元素
$('div:gt(2)') // 選擇所有的div元素,除了前三個
$('div:animated') // 選擇當前處於動畫狀態的div元素
複製程式碼

jQuery 的鏈式操作是怎樣的 

鏈式操作是jQuery經典的設計思想,就是最終選中網頁元素以後,可以對它進行一系列操作,並且所有操作可以連線在一起,以鏈條的形式寫出來,比如:

$('div').find('h3').eq(2).html('Hello');
//分解開就是下面的意思
$('div') //找到div元素
.find('h3') //選擇其中的h3元素
.eq(2) //選擇第3個h3元素
.html('Hello'); //將它的內容改為Hello複製程式碼

那實現的原理也是比較容易理解的,只是非常不容易想到如此騷的操作,這裡舉個例子:比如我們要編寫一個叫addClass的新增屬性的函式,只要在最後返回這個函式本身,當函式執行完又可以接著進行操作了。

 "addClass":function(className){
       for( var i=0;i<elements.length;i++){         
            elements[i].classList.add(className);
       }
       return this; 複製程式碼

再使用最開始的例子

$('div').find('h3').eq(2).html('Hello');
//比方說函式執行到了$('div').find('h3'),這裡執行完返回到最開始的$,
//那麼我就可以繼續呼叫後面的eq()或html(),如果返回的不是$,就無法接著進行後面的操作複製程式碼

jQuery 如何建立元素 

建立新元素的方法非常簡單,只要把新元素直接傳入jQuery的建構函式就行了:

$('<p>Hello</p>'); 
$('<li class="new">new list item</li>'); 
$('ul').append('<li>list item</li>');複製程式碼

原理是呼叫了DOM的原生api:

 elements=[createElement(selectorOrArrayOrTemplate)]
function createElement(string){
    const container = document.createElement("template");
    container.innerHTML = string.trim();
    return container.content.firstChild;
  }

複製程式碼

jQuery 如何移動元素 

jQuery設計思想之五,就是提供兩組方法,來操作元素在網頁中的位置移動。一組方法是直接移動該元素,另一組方法是移動其他元素,使得目標元素達到我們想要的位置。

假定我們選中了一個div元素,需要把它移動到p元素後面。

第一種方法是使用.insertAfter(),把div元素移動p元素後面:

$('div').insertAfter($('p'));複製程式碼

第二種方法是使用.after(),把p元素加到div元素前面:

$('p').after($('div'));複製程式碼

表面上看,這兩種方法的效果是一樣的,唯一的不同似乎只是操作視角的不同。但是實際上,它們有一個重大差別,那就是返回的元素不一樣。第一種方法返回div元素,第二種方法返回p元素。你可以根據需要,選擇到底使用哪一種方法。

使用這種模式的操作方法,一共有四對:

.insertAfter()和.after():在現存元素的外部,從後面插入元素
.insertBefore()和.before():在現存元素的外部,從前面插入元素
.appendTo()和.append():在現存元素的內部,從後面插入元素
.prependTo()和.prepend():在現存元素的內部,從前面插入元素複製程式碼

appendTo和append實現原理:

  appendTo(node){
    if(node instanceof Element){
      this.each(el => node.appendChild(el)) // 遍歷 elements,對每個 el 進行 node.appendChild 操作
    }else if(node.jquery === true){
      this.each(el => node.get(0).appendChild(el))  // 遍歷 elements,對每個 el 進行 node.get(0).appendChild(el))  操作
    }
  },
  append(children){
    if(children instanceof Element){
      this.get(0).appendChild(children)
    }else if(children instanceof HTMLCollection){
      for(let i =0;i<children.length;i++){
        this.get(0).appendChild(children[i])
      }
    }else if(children.jquery === true){
      children.each(node => this.get(0).appendChild(node)      }
    }複製程式碼

jQuery 如何修改元素的屬性 

除了元素的位置移動之外,jQuery還提供其他幾種操作元素的重要方法。

複製元素使用.clone()

刪除元素使用.remove().detach()。兩者的區別在於,前者不保留被刪除元素的事件,後者保留,有利於重新插入文件時使用。

清空元素內容(但是不刪除該元素)使用.empty()

建立新元素的方法非常簡單,只要把新元素直接傳入jQuery的建構函式就行了:

$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');複製程式碼


相關文章