- Learning jQuery(Fourth Edition)
- Jonathan Chaffer Karl Swedberg
- 933字
- 2021-08-13 17:18:46
Custom selectors
To the wide variety of CSS selectors, jQuery adds its own custom selectors. These custom selectors enhance the already impressive capabilities of CSS selectors to locate page elements in new ways.
Tip
Performance note
When possible, jQuery uses the native DOM selector engine of the browser to find elements. This extremely fast approach is not possible when custom jQuery selectors are used. For this reason, it is recommended to avoid frequent use of custom selectors when a native option is available and performance is very important.
Most of the custom selectors allow us to choose one or more elements from a collection of elements that we have already found. The custom selector syntax is the same as the CSS pseudo-class syntax, where the selector starts with a colon (:
). For example, to select the second item from a set of <div>
elements with a class of horizontal
, we write this:
$('div.horizontal:eq(1)')
Note that :eq(1)
selects the second item in the set because JavaScript array numbering is zero-based, meaning that it starts with zero. In contrast, CSS is one-based, so a CSS selector such as $('div:nth-child(1)')
would select all div
selectors that are the first child of their parent. Because it can be difficult to remember which selectors are zero-based and which are one-based, we should consult the jQuery API documentation at http://api.jquery.com/category/selectors/ when in doubt.
Styling alternate rows
Two very useful custom selectors in the jQuery library are :odd
and :even
. Let's take a look at how we can use one of them for basic table striping given the following tables:
<h2>Shakespeare's Plays</h2> <table> <tr> <td>As You Like It</td> <td>Comedy</td> <td></td> </tr> <tr> <td>All's Well that Ends Well</td> <td>Comedy</td> <td>1601</td> </tr> <tr> <td>Hamlet</td> <td>Tragedy</td> <td>1604</td> </tr> <tr> <td>Macbeth</td> <td>Tragedy</td> <td>1606</td> </tr> <tr> <td>Romeo and Juliet</td> <td>Tragedy</td> <td>1595</td> </tr> <tr> <td>Henry IV, Part I</td> <td>History</td> <td>1596</td> </tr> <tr> <td>Henry V</td> <td>History</td> <td>1599</td> </tr> </table> <h2>Shakespeare's Sonnets</h2> <table> <tr> <td>The Fair Youth</td> <td>1–126</td> </tr> <tr> <td>The Dark Lady</td> <td>127–152</td> </tr> <tr> <td>The Rival Poet</td> <td>78–86</td> </tr> </table>
With minimal styles applied from our stylesheet, these headings and tables appear quite plain. The table has a solid white background, with no styling separating one row from the next, as shown in the following screenshot:

Now we can add a style to the stylesheet for all the table rows and use an alt
class for the odd rows:
tr { background-color: #fff; } .alt { background-color: #ccc; }
Finally, we write our jQuery code, attaching the class to the odd-numbered table rows (<tr>
tags):
$(document).ready(function() { $('tr:even').addClass('alt'); });
Listing 2.6
But wait! Why use the :even
selector for odd-numbered rows? Well, just as with the :eq()
selector, the :even
and :odd
selectors use JavaScript's native zero-based numbering. Therefore, the first row counts as zero (even) and the second row counts as one (odd), and so on. With this in mind, we can expect our simple bit of code to produce tables that look like this:

Note that for the second table, this result may not be what we intend. Since the last row in the Plays table has the alternate gray background, the first row in the Sonnets table has the plain white background. One way to avoid this type of problem is to use the :nth-child()
selector instead, which counts an element's position relative to its parent element rather than relative to all the elements selected so far. This selector can take a number, odd
, or even
as its argument
$(document).ready(function() { $('tr:nth-child(odd)').addClass('alt'); });
Listing 2.7
As before, note that :nth-child()
is the only jQuery selector that is one-based. To achieve the same row striping as we did earlier—except with consistent behavior for the second table—we need to use odd
rather than even
as the argument. With this selector in place, both tables are now striped nicely, as shown in the following screenshot:

Finding elements based on textual content
For one final custom-selector touch, let's suppose for some reason we want to highlight any table cell that referred to one of the Henry plays. All we have to do—after adding a class to the stylesheet to make the text bold and italicized ( .highlight {font-weight:bold; font-style: italic;}
)—is add a line to our jQuery code using the :contains()
selector:
$(document).ready(function() {
$('tr:nth-child(odd)').addClass('alt');
$('td:contains(Henry)').addClass('highlight');
});
Listing 2.8
So, now we can see our lovely striped table with the Henry plays prominently featured:

Note
It's important to note that the :contains()
selector is case sensitive. Using $('td:contains(henry)')
instead, without the uppercase "H", would select no cells.
Admittedly, there are ways to achieve the row striping and text highlighting without jQuery—or any client-side programming, for that matter. Nevertheless, jQuery, along with CSS, is a great alternative for this type of styling in cases where the content is generated dynamically and we don't have access to either the HTML or server-side code.
Form selectors
The capabilities of custom selectors are not limited to locating elements based on their position. For example, when working with forms, jQuery's custom selectors and complementary CSS3 selectors can make short work of selecting just the elements we need. The following table describes a handful of these form selectors:

As with the other selectors, form selectors can be combined for greater specificity. We can, for example, select all checked radio buttons (but not checkboxes) with $('input[type="radio"]:checked')
or select all password inputs and disabled text inputs with $('input[type="password"], input[type="text"]:disabled')
. Even with custom selectors, we can use the same basic principles of CSS to build the list of matched elements.
Note
We have only scratched the surface of available selector expressions here. We will dive further into the topic in Chapter 9, Advanced Selectors and Traversing.
- iOS Game Programming Cookbook
- Maven Build Customization
- 算法訓練營:入門篇(全彩版)
- Apache Spark 2 for Beginners
- Python計算機視覺編程
- 云計算通俗講義(第3版)
- Java Web應用開發技術與案例教程(第2版)
- 差分進化算法及其高維多目標優化應用
- Symfony2 Essentials
- Oracle 18c 必須掌握的新特性:管理與實戰
- Instant Lucene.NET
- Swift 4 Protocol-Oriented Programming(Third Edition)
- C語言從入門到精通
- Mastering C++ Multithreading
- Java自然語言處理(原書第2版)