NodeList.js menjadikan penggunaan API DOM Asli pada Array Nodes semudah jQuery dengan manfaatnya yang sangat kecil sekitar 4k yang diperkecil , dan browser sebagai ketergantungan (Itulah bagian yang paling menarik) .
Hal pertama yang akan Anda perhatikan adalah saya menggunakan $$ , alasan saya memilih ini untuk memilih DOM Nodes adalah karena jika Anda membuka devtools dan mengetikkan yang berikut:
$$ ( 'div' ) ; // Will return a NodeListNodeList.js : HTML yang akan kami manipulasi sebagai berikut: < body >
< div id =" container " class =" cont " >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
< div class =" child " > </ div >
</ div >
</ body > #container : Masing-masing berikut mengembalikan Array of Nodes (AKA NodeList saya, bukan NodeList asli browser)
// Method 1
$$ ( '#container div' ) ;
// Method 2
$$ ( '#container' ) . children ;
// Method 3
$$ ( 'div div' ) ;Jika Anda meneruskan string kueri, ada argumen kedua yang bisa Anda sampaikan sebagai cakupan:
let container = document . getElementById ( 'container' ) ;
$$ ( 'div' , container ) ;Yang setara dengan:
// Just this doesn't return my NodeList, but the browser's NodeList
container . querySelectorAll ( 'div' ) ; Anda dapat meneruskan node sebagai argumen:
$$(document, document.body); // returns NodeList
Anda juga dapat meneruskan 1 Array Node atau NodeList atau HTMLCollection Tidak akan diratakan, untuk meratakan gunakan concat() :
$$([document, document.body]); // returns NodeList
Node :Cara yang biasa Anda lakukan:
let children = document . getElementsByClassName ( 'child' ) ; Sekarang Anda akan mendapatkan properti pada anak #container :
for ( let i = 0 , l = children . length ; i < l ; i ++ ) {
children [ i ] . id ; // ''
children [ i ] . nodeName ; // 'DIV'
children [ i ] . className ; // 'child'
} Inilah cara Anda melakukannya dengan nodeList.js :
$$ ( '.child' ) . id ; // ['', '' ... x10]
$$ ( '.child' ) . nodeName ; // ['DIV', 'DIV' ... x10]
$$ ( '.child' ) . className ; // ['child', 'child' ... x10] Oleh karena itu, Anda akan membaca setiap properti seperti yang Anda lakukan dengan satu Node :)
Perhatikan bagaimana ia mengembalikan Array nilai properti, artinya Anda dapat memilihnya berdasarkan index dan menggunakan Array Methods apa pun pada properti tersebut, Anda akan melihatnya ketika Anda sampai ke bagian perulangan.
node : Mari lanjutkan menggunakan variabel children , jadi inilah cara Anda menyetel properti pada children :
for ( let i = 0 , l = children . length ; i < l ; i ++ ) {
children [ i ] . className = 'containerChild' ;
children [ i ] . textContent = 'This is some text' ;
} Inilah cara Anda melakukannya dengan NodeList.js :
$$ ( '.child' ) . className = 'containerChild' ;
$$ ( '.child' ) . textContent = 'This is some text' ; node : Masih menggunakan variabel children :
Mari tambahkan pendengar acara ke setiap node, meskipun event delegation adalah yang terbaik, namun demi contoh ini:
for ( let i = 0 , l = children . length ; i < l ; i ++ ) {
children [ i ] . addEventListener ( 'click' , function ( ) {
console . log ( this , 'was clicked' ) ;
} ) ;
} Inilah cara Anda melakukannya dengan NodeList.js :
$$ ( '.child' ) . addEventListener ( 'click' , function ( ) {
console . log ( this , 'was clicked' ) ;
} ) ; Sangat keren bukan? Anda dapat menggunakan Native DOM method apa pun :
Mari kita atur beberapa atribut:
$$ ( '.child' ) . setAttribute ( 'class' , 'child div' ) ;
// For setting the class you could just do:
$$ ( '.child' ) . className = 'child div' ;Mengklik elemen:
$$ ( '.child' ) . click ( ) ;Menghapus elemen:
$$ ( '.child' ) . remove ( ) ; Saya pikir Anda mengerti maksudnya: Native DOM Method apa pun yang diwarisi oleh setiap Node/Element , Anda cukup memanggil NodeList dan itu akan dipanggil pada setiap elemen.
BTW: Semua Metode DOM yang biasanya mengembalikan undefined ketika dipanggil pada satu Node akan mengembalikan NodeList yang sama untuk memungkinkan Metode Chaining. Suka setAttribute() .
Menggunakan for loop dan ES6 for-of :
Kami hanya akan menghapus node dari DOM sebagai contoh:
let nodes = $$ ( '.child' ) ;
for ( let i = 0 , l = nodes . length ; i < l ; i ++ ) {
nodes [ i ] . remove ( ) ;
}
for ( let node of nodes ) {
node . remove ( ) ;
} Menggunakan forEach :
// Removes all Nodes and returns same the NodeList to allow method chaining
$$ ( '.child' ) . forEach ( function ( node ) {
node . remove ( ) ;
} ) ;
// But Just do:
$$ ( '.child' ) . remove ( ) ;Mengulangi properti:
// Returns Array of style objects (CSSStyleDeclaration)
let styles = $$ ( '.child' ) . style ;
for ( let i = 0 , l = styles . length ; i < l ; i ++ ) {
styles [ i ] . color = 'red' ;
}
for ( let style of styles ) {
style . color = 'red' ;
}
styles . forEach ( function ( style ) {
style . color = 'red' ;
} ) ;
// OR loop through the nodes themselves
let nodes = $$ ( '.child' ) ;
for ( let i = 0 , l = nodes . length ; i < l ; i ++ ) {
nodes [ i ] . style . color = 'red' ;
}
for ( let node of nodes ) {
node . style . color = 'red' ;
}
nodes . forEach ( function ( node ) {
node . style . color = 'red' ;
} ) ; // Returns NodeList containing first Node
$$ ( '.child' ) . slice ( 0 , 1 ) ; Pemetaannya mudah, cukup dapatkan propertinya seperti yang Anda lakukan pada satu Node
// Returns an Array of the id of each Node in the NodeList
$$ ( '#container' ) . id ;
// No need for
$$ ( '#container' ) . map ( function ( element ) {
return element . id ;
} ) ;
// Map() Checks if Array is fully populated with nodes so returns a NodeList populated with firstChld nodes
$$ ( '#container div' ) . map ( function ( div ) {
return div . firstChild ;
} ) ;
// Maps the firstChild node and removes it, and returns the NodeList of firstChild Nodes
$$ ( '#container' ) . map ( function ( div ) {
return div . firstChild ;
} ) . remove ( ) ;
// Or:
$$ ( '#container' ) . firstChild . remove ( ) ; // Filter out the #container div
$$ ( 'div' ) . filter ( function ( div ) {
return ! div . matches ( '#container' ) ;
} ) ; Saya tidak bisa memikirkan contoh yang lebih baik untuk menggunakan Reduce pada NodeList (tapi itu mungkin)
let unique = $$ ( 'div' ) . reduce ( function ( set , div ) {
set . add ( div . parentElement ) ;
return set ;
} , new Set ( ) ) ; Ada juga reduceRight()
Semua metode concat() berikut mengembalikan NodeList gabungan baru (Tidak memengaruhi NodeList tempat concat() dipanggil)
let divs = $$ ( 'div' ) ;
// Method 1 passing a Node
let divsAndBody = divs . concat ( document . body ) ;
// Method 2 passing an Array of Nodes
let divsAndBody = divs . concat ( [ document . body ] ) ;
// Method 3 passing a NodeList
let divsAndBody = divs . concat ( $$ ( 'body' ) ) ;
// Method 4 passing an Array of NodeList
let divsAndBody = divs . concat ( [ $$ ( 'body' ) ] ) ;
// Method 5 passing multiple Nodes as arguments
let divsAndBodyAndHTML = divs . concat ( document . body , document . documentHTML ) ;
// Method 6 passing multiple Arrays of Nodes as arguments
let divsAndBodyAndHTML = divs . concat ( [ document . body ] , [ document . documentHTML ] ) ;
// Method 7 passing multiple Arrays of NodeList as are arguments
let divsAndBodyAndHTML = divs . concat ( [ $$ ( 'body' ) ] , [ $$ ( 'html' ) ] ) ; Concat() bersifat rekursif sehingga Anda dapat meneruskan Array sedalam yang Anda inginkan.
Sekarang jika Anda meneruskan apa pun yang bukan Node , NodeList , HTMLCollections , Array atau Array of Arrays yang berisi sesuatu selain Node , NodeList , HTMLCollections , Array akan menimbulkan Error .
let divs = $$ ( 'div' ) ;
// Pushes the document.body element, and returns the same NodeList to allow method chaining.
divs . push ( document . body ) ; let divs = $$ ( 'div' ) ;
// Removes last Node in the NodeList and returns a NodeList of the removed Nodes
divs . pop ( ) ; pop() mengambil argumen opsional tentang berapa banyak Nodes yang akan POP
// Removes last 2 Nodes in the NodeList and returns a NodeList of the removed Nodes
divs . pop ( 2 ) ; let divs = $$ ( 'div' ) ;
// Removes first Node in the NodeList and returns a NodeList of the removed Nodes
divs . shift ( ) ; shift() juga mengambil argumen opsional tentang berapa banyak Nodes yang akan SHIFT
// Removes first 2 Nodes in the NodeList and returns a NodeList of the removed Nodes
divs . shift ( 2 ) ; let divs = $$ ( 'div' ) ;
// Inserts/unshifts the document.body into the beginning of the NodeList and returns the same NodeList to allow method chaining.
divs . unshift ( document . body ) ; Mari kita ganti elemen pertama #container dengan document.body
let divs = $$ ( 'div' ) ;
// Removes the first Element, inserts document.body in its place and returns a NodeList of the spliced Nodes
divs . splice ( 0 , 1 , document . body ) ; let divs = $$ ( '.child' ) ;
// Gives each div a data-index attribute
divs . forEach ( function ( div , index ) {
div . dataset . index = index ;
} ) ;
// Reverse the NodeList and returns the same NodeList
divs . sort ( function ( div1 , div2 ) {
return div2 . dataset . index - div1 . dataset . index ;
} ) ; // Returns the same NodeList, but reversed
$$ ( 'div' ) . reverse ( ) ; Saya tidak memasukkan metode join untuk NodeLists karena tidak ada gunanya pada Node yang sebenarnya:
// Returns "[object HTMLDivElement], [object HTMLDivElement] ..."
$$ ( '.child' ) . join ( ) ;Oleh karena itu Anda masih dapat menggunakannya saat memetakan properti:
// Returns "child,child,child,child,child,child,child,child,child,child"
$$ ( '.child' ) . className . join ( ) ; // Returns true if passed Node is included in the NodeList
$$ ( 'body' ) . includes ( document . body ) ; // Returns body element: <body>
$$ ( 'body' ) . find ( function ( el ) {
return el === el ;
} ) ; // Returns 0
$$ ( 'body' ) . findIndex ( function ( el ) {
return el === el ;
} ) ; Mungkin ada metode DOM yang memiliki nama yang sama dengan metode Array.prototype di masa mendatang, atau Anda mungkin hanya ingin mengonversi NodeList menjadi Array sehingga Anda dapat menggunakannya sebagai Array asli :
asArray $$ ( 'body' ) . asArray ; // returns Array
$$ ( 'body' ) . asArray . forEach ( function ( ) { ... } ) ; // uses native Array method therefore you cannot chain Oke sekarang bagaimana kalau menangani elemen yang memiliki sifat unik. Seperti HTMLAnchorElement(s) mereka memiliki properti href yang tidak diwarisi dari HTMLElement . Tidak ada HTMLAnchorElements dalam contoh ini, tetapi inilah cara Anda menanganinya.
// Returns undefined because it's a unique property that every element does not inherit
$$ ( 'a' ) . href
// Returns an Array of href values
$$ ( 'a' ) . get ( 'href' ) ; Get() juga dapat digunakan pada Array properti:
// Returns an Array of the value of each node.style.color
$$ ( '.child' ) . style . get ( 'color' ) ; // Sets the href property of each Node in NodeList
$$ ( 'a' ) . set ( 'href' , 'https://www.example.com/' ) ; set() hanya akan menyetel properti pada Nodes yang propertinya tidak terdefinisi:
$$ ( 'div, a' ) . set ( 'href' , 'https://www.example.com/' ) ; href hanya akan disetel pada elemen <a> dan bukan pada <div> s
set() juga dapat digunakan pada Array properti:
// Sets each element's color to red and returns the Array of styles back
$$ ( '.child' ) . style . set ( 'color' , 'red' ) ;Anda juga dapat mengatur beberapa properti:
$$ ( '.child' ) . set ( {
textContent : 'Hello World' ,
className : 'class1 class2'
} ) ;Sama dengan properti yang dipetakan:
$$ ( '.child' ) . style . set ( {
color : 'red' ,
background : 'black'
} ) ;Ingat Anda dapat membuat rantai:
$$ ( '.child' ) . set ( {
textContent : 'Hello World' ,
className : 'class1 class2'
} ) . style . set ( {
color : 'red' ,
background : 'black'
} ) ; Ada metode yang unik untuk elemen tertentu. Beginilah cara Anda memanggil metode tersebut:
$$ ( 'video' ) . call ( 'pause' ) ;Atau Anda bisa mengulang elemen dan memanggil metodenya
Bagaimana dengan menyampaikan argumen:
// Returns Array of `CanvasRenderingContext2D`
$$ ( 'canvas' ) . call ( 'getContext' , '2d' ) ; Jika metode yang dipanggil pada salah satu elemen mengembalikan sesuatu, Array dari item yang dikembalikan tersebut akan dikembalikan dari call() jika tidak, NodeList akan dikembalikan untuk memungkinkan rangkaian metode.
Metode item(index) asli browser melakukan hal yang sama dengan NodeList[index] tetapi di metode saya ia mengembalikan Node itu sebagai NodeList saya (Jika Anda tahu jQuery itu sama dengan metode eq() jQuery)
// returns the <html> element
$$ ( 'html, body' ) [ 0 ] ;
// returns my NodeList [<html>]
$$ ( 'html, body' ) . item ( 0 ) ; Ini agar Anda dapat tetap menggunakan properti/metode yang sama dengan NodeList saya, daripada harus slice satu Node
owner : Yang dilakukan properti pemilik hanyalah mengembalikan NodeList tempat properti tersebut dipetakan:
var elms = $$ ( '.child' ) ;
elms . style . owner === elms ; // trueJadi saya bisa melakukan segala macam hal:
Ingat style pemetaan mengembalikan Array CSSStyleDeclarations
$$ ( '.child' ) . style ; Ini akan memberi Anda kembali NodeList yang style dipetakan:
var childs = $$ ( '.child' ) ;
childs . style . owner === childs ; // true Jika Anda tahu jQuery itu sama dengan properti prevObj -nya
$$ . NL . myMethod = function ( ) {
// You'll have to write your own loop here if you want to call this on each Node or use:
this . forEach ( function ( node ) {
// do something with each node
} ) ;
}| Peramban | Versi |
|---|---|
| FireFox | 6+ |
| Safari | 5.0.5+ |
| krom | 6+ |
| YAITU | 9+ |
| Opera | 11+ |
Perhatian: Anda harus menyadari bahwa perpustakaan saya bergantung pada browser yang dijalankannya (yang luar biasa, sehingga secara otomatis diperbarui ketika browser memperbarui DOM dengan properti/metode baru) artinya: katakanlah properti hidden tidak ada di browser DOM API yang tidak dapat Anda lakukan: $$('.child').hidden = true;