Chương 2 – jQuery Selectors
Thư viện jQuery tận dụng kiến thức và thế mạnh của CSS Selector để cho phép bạn nhanh
chóng và dễ dàng truy cập nhiều phần tử hoặc nhóm các phần tử trong DOM (Document
Object Model). Trong chương 2 này chúng ta sẽ khám phá một vài những Selector này và cả
những Selector của jQuery. Chúng ta cũng sẽ tìm hiểu thêm về cách di chuyển trong cây thư
mục và nó cho chúng ta thêm linh động để đạt được những gì mình muốn.
Document Object Model (Mô hình đối tượng tài liệu)
Một trong những tính năng mạnh mẽ nhất của jQuery là khả năng chọn các thành phần trong
DOM một cách dễ dàng. Nói nôm na thì DOM là một dạng phả hệ của các thành phần
HTML. Các thành phần này có mối tương quan với nhau như một “gia đình” HTML hạnh
phúc. Khi chúng ta nói đến các mối quan hệ này bạn hãy liên tưởng đến mối quan hệ trong
gia đình như ông bà, bố mẹ, anh chị em v.v.. Bạn có thể xem bài Hướng đối tượng dựa vào
cấp bậc XHTML để biết rõ hơn về mối quan hệ của các thành phần HTML.
Hàm $()
Cho dù bạn sử dụng Selector nào đi chăng nữa trong jQuery, bạn luôn bắt đầu bằng một dấu
dollar ($) và một đôi ngoặc đơn như: $(). Tất cả những gì có thể được sử dụng trong CSS
cũng có thể được lồng vào dấu ngoặc kép (”) và đặt vào trong hai dấu ngoặc đơn, cho phép
chúng ta áp dụng các phương pháp jQuery cho tập hợp các phần tử phù hợp.
Ba thành phần quan trọng nhất của jQuery Selector là tên thẻ HTML, ID và Class. Bạn có thể
chỉ sử dụng nó hoặc kết hợp với những Selector khác để chọn. Dưới đây là một ví dụ về mỗi
Selecter khi sử dụng một mình.
Như đã nói ở chương 1, khi chúng ta thêm các phương pháp vào hàm $(), thì các phần tử nằm
trong đối tượng jQuery sẽ được tự động loop và diễn ra ở “hậu trường”. Cho nên chúng ta
không cần phải sử dụng bất cứ một vòng lặp nào cả, như vòng lặp for chẳng hạn, điều này
thường phải làm trong khi viết code về DOM. Sau khi bạn đã nằm bắt được những khái niệm
cơ bản, bây giờ chúng ta sẽ khám phá thêm những tính năng mạnh mẽ khác của jQuery.
CSS Selector
Thư viện jQuery hỗ trợ gần như toàn bộ các CSS Selector chuẩn từ CSS1 cho đến CSS3.
Chính việc này đã cho phép những người làm web không phải lo lắng về liệu trình duyệt đó
có hỗ trợ những Selector mới hay không (đặc biệt là trình duyệt IE) miễn là trình duyệt đó có
bật JavaScript.
Lưu ý: những người làm web có kinh nghiệm và trách nhiệm luôn nên áp dụng nguyên tắc
nâng cao luỹ tiến và giáng cấp hài hoà cho code của họ. Họ phải luôn chắc chắn rằng trang
web luôn được hiển thị chính xác, cho dù không được đẹp như khi JavaScript bị tắt hoặc khi
nó được bật. Chúng ta sẽ bàn thêm về nguyên tắc này trong suốt chiều dài của loạt bài này.
Để tìm hiểu jQuery sử dụng CSS Selector như thế nào thì cách tốt nhất là làm bằng ví dụ.
Trong ví dụ dưới đây chúng ta sẽ sử dụng một dạng danh sách thường được dùng để làm
thanh di chuyển trên web. Code HTML sẽ như sau.
<ul id="nav">
<li><a href="#">Home Page</a></li>
<li><a href="#">About Me</a></li>
<li><a href="#">Forum</a></li>
<li><a href="ebook.pdf">Ebooks</a>
<ul>
<li><a href="#">jQuery</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">HTML</a></li>
</ul>
</li>
<li><a href="http://www.jquery.com">Tutorials</a></li>
<li><a href="#">Photoshop</a>
<ul>
<li><a href="#">Action</a></li>
<li><a href="#">Effect</a></li>
<li><a href="#">Plugins</a></li>
</ul>
</li>
<li><a href="mailto:[email protected]">Email</a></li>
</ul>
Trong đoạn code HTML ở trên chúng ta đơn giản chỉ có một unorder list với id=”nav” đóng
vai trò là menu chính. Khi chưa có style gì áp dụng vào nó thì kết quả khi xem ở trình duyệt
sẽ như hình dưới đây. Đây chính là định dạng mặc định của trình duyệt cho các Unorder List.
Tất nhiên trong ví dụ này bạn hoàn toàn có thể sử dụng CSS để định dạng menu này, nhưng
vì chúng ta muốn khám phá jQuery nên chúng ta tạm thời coi như CSS không tồn tại. Giả sử
trong ví dụ này bạn muốn những list-item chính có gạch chân mà những ul phụ của nó sẽ
không có gạch chân.
.highlight {
border-bottom: 1px solid #e6db55;
padding: 5px;
}
Thay vì chúng ta sẽ thêm class trực tiếp vào tài liệu HTML, chúng ta sẽ sử dụng jQuery để
thêm class vào những list-item tầng 1 như: Homepage, About Me, Forum, Ebooks, Tutorials,
Photoshop và Email.
$(document).ready(function() {
$('#nav > li').addClass('highlight');
});
Như đã bàn ở chương 1, chúng ta bắt đầu đoạn code jQuery với $(document).ready(), nó sẽ
chạy ngay khi DOM đã được load. Dòng thứ 2 sử dụng CSS Child selector (>) để thêm
class=’highlight’ chỉ cho list item tầng 1. Nói theo ngôn ngữ của chúng ta thì đoạn code trên
có nghĩa như sau: jQuery hãy tìm mỗi một list item (li) là con trực tiếp (>) của thành phần có
ID là nav (#nav). Với class=’highlight’ được thêm vào, menu của chúng ta được như sau.
Để định dạng cho những list item tầng 2 có rất nhiều cách. Nhưng một trong những cách
chúng ta sẽ sử dụng trong phần này là pseudo-class phủ định. Bằng cách này chúng ta sẽ đi
xác định tất cả những item nào mà không có class=’highlight’. Chúng ta sẽ viết code như sau:
$(document).ready(function() {
$('#nav > li').addClass('highlight');
$('#nav li:not(.highlight)').addClass('background');
});
Đoạn code trên có nghĩa như sau:
1.Chọn tất cả những danh sách là con trực tiếp của #nav
2.Những danh sách này phải không có class=’highlight’ (:not(.highlight))
Và chúng ta sẽ được hình như hình dưới, tất nhiên bạn phải khai báo class=’background’
trong file CSS của mình.
Attribute Selectors
Attribute Selectors là bộ Selector phụ của CSS cũng rất hữu dụng. Nó cho phép chúng ta
chọn một thành phần nào đó dựa vào đặc tính HTML của nó như: thuộc tính Title của link
hoặc thuộc tính Alt của image. Ví dụ để chọn tất cả các tấm hình có thuộc tính Alt chúng ta
làm như sau:
$('img[alt]')
Định dạng cho đường liên kết
Nếu bạn biết sơ qua về Regular Expressions trong ngôn ngữ lập trình như PHP thì Attribute
Selector trong jQuery chịu ảnh hưởng bởi phương pháp này. Ví dụ dấu (^) dùng để xác định
giá trị tại điểm bắt đầu hoặc ($) kết thúc của một chuỗi. Nó cũng có thể sử dụng dấu (*) để
chỉ một giá trị tại một vị trí bất kỳ trong một chuỗi hoặc sử dụng dấu chấm than (!) để biểu thị
một giá trị phủ định. Trong phần CSS này chúng ta sẽ định dạng các đường liên kết như sau:
a {
}
.email {
padding-right: 20px;
background: url(images/mail.png) no-repeat right center;
}
.ebook {
padding-right: 20px;
background: url(images/pdf.png) no-repeat right center;
}
.hyperlink {
padding-right: 20px;
background: url(images/external.png) no-repeat right center;
}
Sau đó chúng ta thêm 3 class là email, ebook và hyperlink vào những đường liên kết thích
hợp bằng cách sử dụng jQuery. Để thêm một class vào tất cả những đường liên kết email,
chúng ta sẽ tạo một selector và nó sẽ tìm tất cả những thành phần anchor (a) với thuộc tính
href bắt đầu bằng chuỗi mailto như sau:
$(document).ready(function() {
$('a[href^=mailto:]').addClass('email');
});
Để thêm một class vào tất cả các đường liên kết đến những tệp tin .pdf, chúng ta sử dụng dấu
$ thay vì dấu ^ như ở trên. Bởi vì lần này chúng ta chỉ chọn những đường liên kết nào có
thuộc tính href kết thúc bằng cụm .pdf.
$(document).ready(function() {
$('a[href^=mailto:]').addClass('mailto');
$('a[href$=.pdf]').addClass('ebook');
});
Attribute Selector cũng có thể được kết hợp với nhau. Ví dụ chúng ta cũng có thể thêm một
class là hyperlink cho tất cả các đường liên kết với giá trị href bắt đầu bằng http và chứa cụm
từ hyper trong nó.
$(document).ready(function() {
$('a[href^=mailto:]').addClass('mailto');
$('a[href$=.pdf]').addClass('pdflink');
$('a[href^=http][href*=jquery]').addClass('hyperlink');
});
Với 3 class được áp dụng như trên cho các đường liên kết, chúng ta sẽ được kết quả như hình
dưới đây. Bạn sẽ thấy cạnh mỗi đường link sẽ có thêm một hình icon chỉ cho người dùng biết
một cách rất trực quan là đường liên kết đó là về cái gì.
Selector riêng của jQuery
Dường như còn chưa vừa ý với những CSS Selector, jQuery có một hệ thống những Selector
của riêng nó. Hầu hết những Selector này đều cho phép chúng ta chọn bất cứ thành phần nào
trong tài liệu HTML. Cú pháp cho những Selector này tương đồng với cú pháp của CSS
pseudo-class, nơi mà các selector bắt đầu bằng dấu hai chấm (:). Ví dụ, để chọn thẻ div thứ 2
của tập hợp những thẻ div có class=’horizontal’, chúng ta có cách viết code như sau:
$('div.horizontal:eq(1)');
Bạn nên lưu ý ở phần này là :eq(1) chọn thẻ div thử hai từ tập hợp trả về bởi vì JavaScript
đánh số array bắt đầu từ số 0. Ngược lại, CSS lại là bắt đầu từ số 1. Cho nên khi bạn sử dụng
nth-child CSS Selector như là $(‘div:nth-child(1)’) sẽ chọn tất cả các thẻ div là con đầu tiên
của thành phần cha mẹ. Tất nhiên đấy là diễn giả là vậy, nhưng nếu trong thực tế thì bạn nên
dùng $(‘div:first-child’) thì hợp lý hơn.
Định dạng bảng kiểu kẻ sọc
Hai trong số những jQuery selector rất hữu dụng là :0dd và :even. Trong ví dụ dưới đây
chúng ta sẽ sử dụng một trong hai selector này để định dạng cho bảng kiểu kẻ sọc với code
HTML như sau:
<table>
<tr>
<td>Movies</td>
<td>Actors/ Actresses</td>
<td>Year Make</td>
</tr>
<tr>
<td>arnold schwarzenegger</td>
<td>1991</td>
</tr>
<tr>
<td>Die Hard</td>
<td>Bruce Willis</td>
<td>2000</td>
</tr>
<tr>
<td>Speed</td>
<td>Sandra Bullock</td>
<td>1997</td>
</tr>
<tr>
<td>Independence Day</td>
<td>Will Smith</td>
<td>1999</td>
</tr>
<tr>
<td>Armageddon</td>
<td>Bruce Willis</td>
<td>1997</td>
</tr>
<tr>
<td>Under Siege</td>
<td>Steven Seagal</td>
<td>1996</td>
</tr>
<tr>
<td>Avatar</td>
<td>Unknown</td>
<td>2010</td>
</tr>
</table>
Bây giờ bạn có thể thêm style vào stylesheet cho tất cả các dòng của bảng và sử dụng một
class=’alt’ cho những dòng chẵn.
.alt {
background: #dda;
}
td {
padding: 10px;
}
Cuối cùng chúng ta sẽ viết code jQuery để gắn class vào cho những dòng chẵn của bảng (
).
$(document).ready(function() {
$('tr:0dd').addClass('alt');
});
Bạn có thấy code ở trên có điều gì lạ không? Odd tiếng Việt là lẻ và Even là chẵn. Chúng ta
nói sẽ tô màu cho dòng chẵn nhưng lại sử dụng :0dd? Thực ra vấn đề ở đây cũng tương tự
như :eq() ở trên, bởi vì :0dd và :even sử dụng dạng đánh số từ số 0 như trong JavaScript. Cho
nên dòng thứ nhất đếm là số 0 (số chẵn) và dòng thứ hai đếm là 1 (số lẻ). Do đó với dòng
code jQuery như trên dưới đây là kết quả chúng ta có được.
Vấn đề có vẻ như đã được giải quyết ở đây, nhưng nếu bạn có một bảng thứ hai trên cùng
một trang thì kết quả lại không như bạn muốn. Ví dụ, dòng cuối cùng của bảng trên có màu
cỏ úa thì dòng đầu tiên của bảng kế tiếp sẽ có màu trắng. Có cách để tránh tình trạng này là
sử dụng :nth-child() Selector. Selector này có thể lấy tham số là odd, even hoặc chữ số.
Nhưng cũng lưu ý bạn là :nth-child() là selector duy nhất của jQuery đánh số theo thứ tự từ 1.
Cho nên để đạt được kết quả như mong muốn và nhất quán với nhiều bảng trên trang, chúng
ta có đoạn code mới như sau:
$(document).ready(function() {
$('tr:nth-child(even)').addClass('alt');
});
Bây giờ giả sử chúng ta muốn tô đậm đỏ cho cột nào đó có chưa tên chú Bruce Willis thì
trước hết bạn phải thêm một class=’red’ vào phần stylesheet và sau đó thì viết code jQuery
như sau sử dụng :contains() Selector.
$(document).ready(function() {
$('tr:nth-child(even)').addClass('alt');
$('td:contains(Bruce Willis)').addClass('red');
});
Bây giờ thì bảng của chúng ta đã tô đậm và in đỏ chú Bruce Willis.
Tôi cũng phải lưu ý với bạn là :contains() Selector có phân biệt giữa IN HOA và in thường.
Cho nên nếu bạn chỉ gõ $(‘td:contains(bruce willis)’) mà không viết hoa thì sẽ không có cột
nào được chọn cả.
Phải thừa nhận rằng với ví dụ đơn giản như trên, bạn không cần phải sử dụng jQuery cũng
đạt được kết quả như mong muốn. Tuy nhiên, jQuery kết vợi với CSS, là một lựa chọn phù
hợp cho kiểu định dạng khi mà nội dung được tạo ra tự động từ CSDL và chúng ta không có
khả năng chi phối code HTML cũng như code được xuất ra từ PHP chẳng hạn.
Form Selector
Khi làm việc với form, những selector của jQuery giúp bạn tiết kiệm thời gian để chọn chỉ
những thành phần nào mình muốn. Bảng biểu sau là những selector của jQuery để làm việc
với form.
Cũng giống như những Selector khác, form Selector cũng có thể được kết hợp để cho đối
tượng chọn được cụ thể hơn. Ví dụ chúng ta có thể chọn tất cả các nút radio được đánh dấu
(chứ không phải hộp kiểm) với $(‘:radio:checked’) hoặc chọn tất cả các trường nhập mật
khẩu và trường nhập dữ liệu bị tắt với $(‘:passowrd, :text:disabled’). Cho dù với jQuery
Selector, nhưng chúng ta vẫn sử dụng nguyên tắc của CSS để chọn các phần tử cần chọn.
Phương pháp di chuyển trong DOM
Những jQuery selector vừa được giới thiệu ở trên cho phép chúng ta chọn một tập hợp các
phần tử khi chúng ta di chuyển ngang qua hoặc dọc xuống cây DOM và chọn lọc kết quả.
Nếu đây là cách duy nhất để chọn các phần tử thì những lựa chọn của chúng ta cũng bị hạn
chế khá nhiều (mặc dù trong thực tế những selector đã rất mạnh mẽ đặc biệt là khi mang ra so
sánh với cách di chuyển trong DOM truyền thống). Có nhiều trường hợp khi bạn cần phải
chọn cha mẹ hoặc ông bà của các phần tử trở nên quan trọng, chính vì vậy phương pháp di
chuyển trong DOM được giới thiệu. Với những phương pháp này chúng ta có thể đi lên, đi
xuống, ngang dọc hoặc xung quanh cây DOM rất dễ dàng.
Một vài phương pháp có chức năng gần như tương đồng với những người ‘anh em’ Selector
ở trên. Như trong ví dụ về định dạng bảng kiểu kẻ sọc ở trên chúng ta thêm class=’alt’ với
$(‘tr:0dd’).addClass(‘alt’); cũng có thể được viết lại với phương pháp .filter() như sau:
$('tr').filter(':0dd').addClass('alt');
Trong đa số các trường hợp thì hai cách trên bổ trợ cho nhau. Hơn nữa, đặc biệt là phương
pháp .filter() cực kỳ mạnh mẽ ở chỗ nó có thể lấy một hàm làm tham số của nó. Hàm đó cho
phép chúng ta tạo ra những phép kiểm phức tạp để xác định xem một thành phần nào đó có
nên được giữ lại trong tập hợp kết quả trả về. Nói ví dụ chúng ta muốn thêm một class cho tất
cả những đường liên kết ngoài. Jquery không có selector nào có thể tiến hành tác vụ này. Nếu
không có hàm trong phương pháp .filter(), chúng ta bắt buộc phải sử dụng vòng lặp để nhảy
qua từng thành phần và kiểm tra nó riêng rẽ. Tuy nhiên với những hàm trong phương pháp
.filter() sau, chúng ta vẫn có thể dựa vào vòng lặp ẩn của jQuery và giữ cho code của chúng
ta gọn gàng.
$('a').filter(function() {
return this.hostname && this.hostname != location.hostname;
}).addClass('external');
Dòng code thứ 2 lọc tập hợp các phần tử <a> với hai tiêu chí sau:
1.Nó phải có thuộc tính href với tên miền (this.hostname). Chúng ta sử dụng phép kiểm này
để loại bỏ những liên kết dạng mailto và những thứ tương tự.
2.Tên miền mà nó liên kết tới (this.hostname) không được giống (!=) với tên miền của trang
hiện tại (location.hostname).
Nói chính xác hơn thì phương pháp .filter() lặp qua tập hợp những phần tử phù hợp, kiểm tra
từng giá trị trả về bằng hàm đã tạo. Nếu hàm trả về là false, thì phần tử đó sẽ bị loại khỏi tập
hợp. Còn nếu giá trị trả về là true, thì phần tử đó được giữ lại. Bây giờ chúng ta sẽ xem lại
bảng kiểu kẻ sọc và xem xem có thể làm gì với phương pháp di chuyển này.
Định dạng từng ô cụ thể
Ở ví dụ trên chúng ta đã thêm class=’red’ cho những ô có chữa chữ Bruce Willis. Nếu bây
giờ chúng ta cũng muốn định dạng cho ô bên cạnh ô chứa Bruce Willis, chúng ta có thể bắt
đầu với Selector mà chúng ta đã tạo, và sau đó chỉ đơn giản nối nó với phương pháp .next().
$(document).ready(function() {
$('td:contains(Bruce Wiliss)').next().addClass('red');
});
Bảng của bạn sẽ được như sau
Phương pháp .next() chỉ lựa chọn các phần tử ngay sát cạnh nó. Để tô đỏ đậm cho tất cả các ô
đằng sau ô có chưa Bruce Willis, chúng ta có thể sử dụng phương pháp .nextAll().
$(document).ready(function() {
$('td:contains(Bruce Wiliss)').nextAll().addClass('red');
});
Bên cạnh phương pháp .next() và .nextAll() chúng ta còn có .prev() và prevAll(). Thêm nữa,
.siblings() chọn tất cả các phần tử có cùng chung một cấp bậc trên DOM, mà không cần quan
tâm đến nó xuất hiện trước hoặc sau phần từ được chọn.
Để bao gồm cả ô ban đầu (là ô có chữa Bruce Willis) và những ô theo sau nó, chúng ta có thể
thêm phương pháp .andSelf():
$(document).ready(function() {
$('td:contains(Bruce Wiliss)').nextAll().andSelf().addClass('red');
});
Bạn cũng nên biết rằng có vố số những kết hợp của selector và phương pháp di chuyển mà
dựa vào đó chúng ta có thể chọn cùng một tập hợp các phần tử. Ví dụ này sẽ cho bạn thấy
một cách khác để chọn mỗi một ô trong một dòng mà ô đó có chưa chữ Bruce Willis:
$(document).ready(function() {
$('td:contains(Bruce Willis)').parent().children().addClass('red');
});
Ở đây thay vì chúng ta di chuyển theo kiểu ngang hàng, chúng ta di chuyển lên trên một bậc
của cây DOM (
) với phương pháp .parent() và sau đó chọn tất cả các ô của dòng bằng phương pháp
.children().
Kết hợp (chaining)
Phương pháp di chuyển kết hợp như chúng ta vừa khám phá ở trên thể hiện khả năng kết hợp
của jQuery. Với jQuery bạn có thể chọn tập hợp các phần tử và thao tác nhiều tác vụ lên
chúng, tất cả trên cùng một dòng code. Kiểu kết hợp này không những giữ cho code jQuery
được súc tích mà còn tăng khả năng hoạt động của mã. Nhưng để cho dễ đọc hơn, bạn cũng
có thể tách ra thành nhiều hàng. Ví dụ một dãy kết hợp các phương pháp có thể được viết trên
một dòng như sau:
$('td:contains(Bruce
Willis)').parent().find('td:eq(1)').addClass('red').end().find('td:eq(2)').
addClass('red');
… hoặc cắt nhỏ ra từng dòng
$('td:contains(Bruce Willis)') // Tìm tất cả các dòng có chứa Bruce Willis
.parent() // Di chuyển lên một tầng
.find('td:eq(1)') // Tìm td với thứ tự là 1 (dòng thứ 2)
.addClass('red') // Thêm class='red'
.end() // quay về với bố mẹ của ô chứa Henry
.find('td:eq(2)') // Tìm tiếp td với thứ tự là 2 (dòng 3)
.addClass('red') // thêm class='red'
Tất nhiên cách di chuyển kiểu như trên là lòng vòng đến mức thừa thãi và không có trong
thực tế. Bởi vì có nhiều cách khác đơn giản hơn, trực tiếp hơn. Tuy nhiên nó cũng cho bạn
thấy được sự linh hoạt tuyệt vời mà kiểu kết hợp cho phép chúng ta.
Viết code kiểu kết hợp thế này như là nói một tràng trong một hơi không nghỉ. Nó giúp bạn
đạt mục tiêu nhanh chóng, nhưng lại khó cho người khác hiểu được. Cho nên tách nó ra và
thêm comments có thể giúp bạn tiết kiệm thời gian và công sức sau này nếu phải chỉnh sửa
code.
Hướng tới các thành phần DOM
Mỗi một Selector và hầu hết các phương pháp của jQuery đều trả về một đối tượng jQuery.
Đây chính là điều chúng ta luôn mong đợi, bởi vì khả năng tiến hành vòng lặp ẩn và kết hợp
nó có thể làm. Nhưng cũng có lúc chúng ta muốn hướng tới một phần tử DOM một cách trực
tiếp. Ví dụ, chúng ta muốn sử dụng một tập hợp các phần tử cho một thư viện JavaScript
khác. Hoặc chúng ta muốn hướng tới tên thẻ của một phần tử, mà nó lại có sẵn như là một
thuộc tính của phần tử DOM. Tuy trường hợp này hiếm khi xảy ra, jQuery có phương pháp
.get(). Để hướng tới thành phần DOM đầu tiên chỉ đến bởi một đối tượng jQuery, chúng ta sẽ
sử dụng .get(0). Nếu phần tử DOM cần phải nằm trong một vòng lặp, chúng ta sẽ sử dụng
.get(index). Như vậy, nếu chúng ta muốn biết tên thẻ của một thành phần với id=’my-
element’, chúng ta sẽ viết code như sau:
var myTag = $('#my-element').get(0).tagName;
Để tiện dụng hơn nữa, jQuery cung cấp cách viết tắt cho phương pháp .get(). Thay vì viết như
dòng code ở trên, chúng ta có thể sử dụng cặp ngoặc vuông [] ngay đằng sau selector:
var myTag = $('#my-element')[0].tagName;
Không phải là ngẫu nhiên mà cú pháp này nhìn giống như là một array của các phân tử
DOM, sử dụng cặp ngoặc vuông như là xé đi lớp vỏ để tới danh sách các nốt, có bao gồm
luôn cả index (trong trường hợp này là 0) cũng giống như lôi từng thành phần DOM ra vậy.
Với những kỹ năng mà chúng ta đã học trong chương này, chúng ta đã có thể định dạng cho
tầng một và tầng phụ của một danh sách sử dụng những CSS Selector cơ bản, áp dụng những
style khác nhau cho các loại đường liên kết khác nhau sử dụng Attribute Selector, tô mầu
khác nhau cho bảng kẻ sọc bằng cách sử dụng jQuery selector như :0dd và :even hoặc
Selector mới của CSS là :nth-child(), và cuối cùng là tô đậm đỏ cho từng ô trong bảng bằng
cách kết hợp các phương pháp jQuery. Cho đến bây giờ chúng ta sử dụng sự kiện
$(document).ready() để thêm class vào tập hợp các phần tử. Trong chương tới, chúng ta sẽ
khám phá những cách để thêm class vào những sự kiện người dùng tự tạo.