post image

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.

jquery

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@yahoo.com">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.

jquery
Định dạng list-item

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.

jquery

Để đị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.

jquery
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 {
color: #00c;
}

.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ì.

jquery
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>Terminator</td>
                        <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>

Trang: 1 2

«

»

47 Comments

( Comment bài này )
  1. keynozy says:

    Mình đã làm lại trọn bộ ebook của a DW chỉ share nhau để học hỏi thui! nếu bạn nào cần thì pm nha!
    Sẵn tiện thanks a DW.

    • tuan says:

      bạn có thể share cho mình các bản demo cua jquery dc hok..
      mình làm hoài mà chẳng đc..
      email:nguoiayvatoiemchonai_dodo@yahoo.com
      cảm ơn

  2. Ngo Linh says:

    chào anh Demon ! em thấy có một thuộc tính ” AlphaImageLoader Filter ” trong thiết kế giao diện khá hay! nhưng chưa biết phải sử dụng như thế nào là hợp lý ! anh có thể là một bài viết về vấn đề này không! thanks anh

  3. Sanhit says:

    Trang này anh chỉ khá kỉ và hay nhưng anh ơi em cũng làm theo như anh mà không chạy được anh ơi ,nếu được thì có demo thì hay biêt` mấy hihi cảm ơn anh nhiều.

  4. nhien thuy says:

    chào anh! tình cờ thấy web của anh, chuyên về web rất thú vị và bổ ích. Em muốn thành 1 web designer, theo anh em nên học những gì và theo thứ tự ra sao.

    • Agent M says:

      Để thành 1 web designer thì bạn cần học nhiều thứ đấy:
      - Đầu tiên là cần có 1 tình yêu với nghề
      - Sau đó là phải thành thạo các công cụ như Photoshop (http://www.izwebz.com/?p=2640), Illustrator (http://www.izwebz.com/?p=2806).
      - Cần nhất là có một cái đầu hơi # người nhá, vì cần phải có ý tưởng độc đáo cho thiết kế của mình nữa.
      - Bạn có phải tìm hỉu thêm về các tài liệu thiết kế (http://www.izwebz.com/?p=2924), các cách bố cục..v.v…
      Còn nhiều nữa, bạn sẽ dần tìm hiểu trong quá trình học những cái trên.
      Hiện tại thì izwebz có thể cung cấp cho bạn những gì căn bản nhất, đây là tiền để để bạn có thể phát triển sau này. Trong tương lai thì mình sẽ cố gắng truyền tải những gì mà mình biết cho các bạn. ^^~
      Goodluck !!!

  5. Gopy says:

    Mình thấy loạt bài này DW dịch từ Learning Query của 2 tác giả Jonathan Chaffer và Karh Swedberg – nhà xuất bản PACKT. Cho nên DW nên ghi rõ nguồn gốc của bài viết hoặc là tài liệu tham khảo, không là vi phạm bản quyền.

  6. quangthinh says:

    Anh DW ơi, tất cả những bài ví dụ như ở trên là rất tốt nhưng anh có thể đưa ra bản Demo mà có thể chạy được để có tính sát thực, khi đó người xem và làm theo anh sẽ dễ hiểu hơn, khi không hiểu xem lại Demo đã chạy, khỏi cần phải hỏi lại anh, mà có hỏi lại có khi cũng chẳng hiểu gì giữa người hướng dẫn và người hỏi. thanks!

  7. anh DM ơi cái phần định dạng list-item em viết y nguyên

    $(document).ready(function() {
    $('nav &gt; ul').addclass('highlight');
    });
    

    rồi khai báo trong css là
    .highlight{border-bottom:1px solid green;}
    mà sao không thấy nó chạy vậy mac dù đường link đến thư viên jquery cua google la dung ma

    Anh bảo em với hix.

  8. trangpro says:

    :( ( thu ma k co chay duoc

  9. Tại em gửi comment có nhiều đường liên kết cho nên nó để thành Pending chờ duyệt đó mà.

    Em hơi hiểu sai về phương thức jQuery rồi. Khi em sử dụng $(this) trong hàm truy hồi thì nó mới hướng tới đối tượng jQuery mà nó đang ảnh hưởng. Còn nếu khi DOM load mà em dùng $(this) thì nó trả lại undefined là đúng rồi.

    Cho nên để lấy giá trị của a khi DOM bằng jQuery em có thể làm như sau

    <script type="text/javascript">
            $(document).ready(function() {
            var $testLink = $('a').attr('href');
            alert(testLink);
            });
         </script>
  10. NVS-IT says:

    Anh ơi em hiểu ra vấn đề rồi ah

    $(document).ready(function() {
    $(‘a’).addClass(location.hostname + ‘-’ + this.hostname);
    });

    this.hostname em cho hiển thị ở đây thì nó không hiểu của đối tượng nào trong DOM nên nó chỉ in ra undefined.

  11. NVS-IT says:

    Cảm ơn anh nhiều nhé, sao em gửi Comment mấy lần mà chẳng được vậy nhỉ

  12. NVS-IT says:

    Cảm ơn anh vì đã trả lời câu hỏi của em, trước khi Comment để hỏi anh thì em cũng hiểu nôm na, cũng khó giải thích nhưng em nói ra để anh xem tư tưởng em có chỗ nào chưa đúng anh sửa hộ ah

    code (em thay toàn bộ dấu “<" thành "[")
    [a href="http://www.izwebz.com"Test Link[/a]

    $(document).ready(function() {
    $('a').addClass(location.hostname + '-' + this.hostname);
    });

    kết quả chạy trên localhost
    [a class="localhost-undefined" href="http://www.izwebz.com"Test Link[/a]

    Theo em code trên có nghĩa là tìm tất cả các đối tượng [a] trong DOM, sau đó thêm vào class có tên là địa chỉ trang web + giá trị của thẻ [a]

    Như VD của anh thì khi xảy ra sự kiện Click thì mới lấy được giá trị .hostname, còn code em thì muốn lấy giá trị ngay sau khi Load DOM

    Em vẫn mơ hồ ở chỗ này ah, anh giải thích cho em tại sao code của em lại không hiển thị được giá trị của thẻ [a] với ah, em cảm ơn anh nhiều lắm

  13. .hostname ở đây là thuộc tính của JavaScript chứ không phải là phương thức jQuery nữa.

    location.hostname thì đúng là trả về điạ chỉ trang web hiện đang được mở. Nhưng nếu this.hostname thì phụ thuộc vào ‘this’ đang hướng tới cái gì. Chỉ this.hostname thì chẳng chỉ cái gì cả vì this ở đây là vô nghĩa.

    Ví dụ:

    <a href="http://www.izwebz.com">Test Link</a>
    $(document).ready(function() {
    $('a').click(function() {
    var test = this.hostname;
    alert(test);
    });
    });

    Như thế nó sẽ trả về giá trị của thẻ a

  14. NVS-IT says:

    Anh DW ơi phương thức this.hostname trả về giá trị gì ah, phương thức location.hostname thì em in ra nó trả về giá trị là địa chỉ của trang web hiện đang được mở
    Anh giải thích vấn đề này cho em với nhé, em bị mắc chỗ này ah. Cảm ơn anh nhiều vì những bài viết bổ ích ah

  15. tanlevis says:

    tiu chú này ròi, bà con zo trang đó cm chơi cho zui.

  16. Hoàng Lan says:

    @Trung: Càng không thể tin được đó là trang của 1 công ty giải pháp phần mềm. Đến độ các code còn không cho vào thẻ code, lại còn để số dòng: 01 … 30 …
    Chả hiểu, họ làm Cty giải pháp phần mềm mà thiếu chuyên nghiệp như thế. Buồn thật.

  17. Trung says:

    1 website an cap trang tron bai cua anh DW va khong he ghi ten tac gia cung nhu source. That la…
    http://www.thefocusco.com/blog/2010/05/27/ch%C6%B0%C6%A1ng-2-%E2%80%93-jquery-selectors/

  18. tuanva says:

    Phần định dạng màu sắc so le theo dòng của bảng, câu lệnh jquery phần $(‘tr:0dd’), đúng ra phải là $(‘tr:odd’) mới đúng chứ bạn, chữ o chữ không phải số 0 đâu bạn.

  19. thungoc says:

    bài viết của anh rất hay và giải thích rất rõ ràng. Em cảm ơn anh về bài viết bổ ích này.

  20. naturalkid says:

    thanks you !

  21. AlanSmth says:

    Đúng thiệt là hay học thế này biết nhanh lắm. hok thì học trong JQuery ebook cũng hay có cả demo nữa + thêm code đọc cũng hiểu

  22. hoangloi says:

    bài này hay 1 cách dã man từng chi tiết… trước em đọc trên docs.jquery.com đã loằng nhoằng lại còn bay bổng :( toàn mò mò. thế mà mãi giò ĐW mới cho ra cái này. hân hào thank you.

  23. nov23 says:

    Mặc dù dùng nhiều nhưng phần lớn là em dùng từ những cái sẵn có, chưa hiểu nhiều về cấu trúc code, cảm ơn anh

  24. naruto says:

    Cám ơn bạn, một chân trời kiến thức mới lại được mở ra. Cảm ơn bạn rất rất nhiều. Công nhận mạnh thiệt đó. JQuery thật tuyệt vời.

  25. @tuanit85: Tôi hiểu ý bạn muốn nói gì và cũng cảm ơn nhã ý của bạn với trang web. Nhưng ở Izwebz tôi muốn tạo ra một không khí cởi mở và thân thiện. Khi đến với izwebz các bạn luôn thấy thoải mái và tiện nghi nhất có thể. Tôi luôn cố gắng sao cho mọi nhu cầu của các bạn đều được thỏa mãn. Hầu như tutorial nào tôi cũng có demo hoặc source code, video cũng có phiên bản cho các bạn download để xem offline.

    Cho nên lần này cũng thế, tôi sẽ vẫn làm phiên bản PDF để các bạn có thể xem offline và chia sẻ. Dù cho ai đó có sao chép lại nội dung nhưng nguồn gốc từ izwebz thì không thể chối cãi được.

  26. Duy Tuệ says:

    Mấy ngày nay, đang thử xài JQuery. Phải công nhận là nó cực mạnh và có nhiều Plugin, chỉ cần down về lài xài được (mặc dù xài trong Master của Asp.Net cũng khá nhiêu khê). Nhưng tính em lại thích xài những thứ mà mình tự viết thôi nên cũng đang chờ bài của a DW để học dần :) . Cảm ơn a về những bài viết bổ ịch này

  27. Phát hành các phiên bản PDF thì nó không là quá khó khăn, nhưng các bạn nên biết thêm 1 điều. Tất cả những nội dung bạn đang xem trên website Izwebz.com đều được soạn bằng HTML. Nó không khởi đầu bằng một phần mềm như Word. Nếu các bạn cần có nhu cầu thì có thể tự làm file theo định dạng mình thích.

  28. tuanit85 says:

    Quá hay! Mình khuyến khích DW không nên phát hành các bản PDF.

  29. aboutme says:

    Bác ơi, cho anh em bản PDF nữa đọc cho tiện cái ^_^

1 2
  1. BB
  2. BB
  3. BB

arrow

Lưu ý khi post comment:

  • Không "bóc tem" topic
  • Dùng lời lẽ có văn hoá và lịch sự
  • Xem trang FAQs trước khi hỏi
  • Bạn có thể dùng thẻ HTML như:<strong>, <em>, <a>
  • Đặt code trong thẻ [php],[html],[javascript],[css]

Chọn kiểu gõ: Tự động TELEX VNI Tắt