Cool jQuery Predicate Selectors

Posted October 19, 2007 at 5:21 PM by Ben Nadel

Tags: Javascript / DHTML

I was reading up on jQuery last night and came across some cool jQuery predicate filtering in the selector statements. We have all seen the predicate for full attribute value matches:

  • a[ @rel = 'nofollow' ]

This would select all the links in the document object model that have a REL attribute value of "nofollow". In addition to the "=" comparison operator, jQuery provides some additional regular-expression-esque comparison operators.

Start With: ^=

The ^= operator will filter elements whose attribute starts with the given value.

Ends With: $=

The $= operator will filter elements whose attribute ends with the given value.

Contains: *=

The *= operator will filter elements whose attribute contains the given value.

To test this, I whipped up a little demo page. On this demo page we have a number of list items, each of which have an ID that starts with "list" and ends with the one-based index of the list item. Then, we use the jQuery selectors from above to output the text of the matched elements:

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  • <html>
  • <head>
  • <title>jQuery Attribute Predicate Demo</title>
  • <script type="text/javascript" src="jquery.pack.js"></script>
  • </head>
  • <body>
  •  
  • <h1>
  • jQuery Attribute Predicate Demo
  • </h1>
  •  
  • <ul>
  • <li id="list1">One</li>
  • <li id="list2">Two</li>
  • <li id="list3">Three</li>
  • </ul>
  •  
  •  
  • <!---
  • Below are the test that we will run against
  • the unordered list above.
  • --->
  •  
  •  
  • <h2>
  • Tests / Results
  • </h2>
  •  
  • <h3>
  • Full Match: "li[ @id = 'list1' ]"
  • </h3>
  •  
  • <p>
  • <script type="text/javascript">
  • document.write(
  • $( "li[ @id = 'list1' ]" ).text()
  • );
  • </script>
  • </p>
  •  
  •  
  • <h3>
  • Start With Match: "li[ @id ^= 'list' ]"
  • </h3>
  •  
  • <p>
  • <script type="text/javascript">
  • document.write(
  • $( "li[ @id ^= 'list' ]" ).text()
  • );
  • </script>
  • </p>
  •  
  •  
  • <h3>
  • Ends With Match: "li[ @id $= '3' ]"
  • </h3>
  •  
  • <p>
  • <script type="text/javascript">
  • document.write(
  • $( "li[ @id $= '3' ]" ).text()
  • );
  • </script>
  • </p>
  •  
  •  
  • <h3>
  • Contains Match: "li[ @id *= 'st' ]"
  • </h3>
  •  
  • <p>
  • <script type="text/javascript">
  • document.write(
  • $( "li[ @id *= 'st' ]" ).text()
  • );
  • </script>
  • </p>
  •  
  • </body>
  • </html>

Running the above page, we get the following output:

Full Match: "li[ @id = 'list1' ]"

One

Start With Match: "li[ @id ^= 'list' ]"

OneTwoThree

Ends With Match: "li[ @id $= '3' ]"

Three

Contains Match: "li[ @id *= 'st' ]"

OneTwoThree

The more I read up on jQuery, the more I realize how sweet-ass it is. jQuery is the "Easy" button of the user interface world.


 
 
 

 
jQuery: The Easy Button For User Interface Development  
 
 
 


Reader Comments

Oct 20, 2007 at 12:08 PM // reply »
1 Comments

>> jQuery is the "Easy" button of the user interface world.

Exactly!

Thanks for this nice explanation of the various specific selectors.


Mar 16, 2009 at 9:57 AM // reply »
1 Comments

Quite interesting.
Note however that the code above will not work with jQuery v 1.3 and above.

You simply need to remove the "@".

More info at :
http://docs.jquery.com/Release:jQuery_1.3#Upgrading


Mar 16, 2009 at 10:03 AM // reply »
11,238 Comments

@Cypher,

That is correct. This XPath-like attribute selection was used, then deprecated, and now, in the latest releases, completely removed.


Vx
Apr 1, 2009 at 12:38 AM // reply »
4 Comments

so how do you do this in the new jQuery?


Vx
Apr 1, 2009 at 12:39 AM // reply »
4 Comments

never mind... see the comment by Ben, i can't find the api reference though? any link for that?


Apr 1, 2009 at 9:30 AM // reply »
11,238 Comments

@Vx,

Check out http://docs.jquery.com.


Vx
Apr 2, 2009 at 1:48 AM // reply »
4 Comments

:) I've been using that and a search through there doesn't show any results for Predicates, or *=
I haven't found it in the docs, could you?


Apr 2, 2009 at 8:31 AM // reply »
11,238 Comments

@Vx,

Check out Attribute Filters in the Selectors section:

http://docs.jquery.com/Selectors

Basically, in newer version of jQuery, you just have to remove teh @ sign.


Vx
Apr 3, 2009 at 12:14 AM // reply »
4 Comments

Ahh I see it now... Thanks :)
I've been through the selectors page a dozen times, i wonder how i missed it! hehe.
$("input[id*='wait'][hidden]").val() would work now...
Thanks


Apr 3, 2009 at 8:07 AM // reply »
11,238 Comments

@Vx,

No problem man, glad you got it working.


Nov 19, 2009 at 6:21 PM // reply »
1 Comments

For anyone who's interested I've published V2 of a jQuery reference if you want to have a look at that it's here: http://www.skidoosh.co.uk/jquery/jquery-selectors-and-attribute-selectors-reference-and-examples-v2/ I'll be updating it for 1.3 in a few days.


Aug 2, 2011 at 3:56 PM // reply »
2 Comments

one thing to be careful of is jQ does not like spaces in this selector method (found the hard way :D ).


May 22, 2012 at 3:49 AM // reply »
1 Comments

I've been using that and a search through there doesn't show any results for Predicates, or *=
I haven't found it in the docs, could you?



Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
May 17, 2013 at 7:42 PM
HashKeyCopier - An AngularJS Utility Class For Merging Cached And Live Data
Ben - thanks so much for posting these Angular articles and findings, they've been a huge help towards learning one of the more 'complex' JavaScript frameworks out there (IMO). I have been using Angu ... read »
May 16, 2013 at 5:01 PM
UPDATE: Parsing CSV Data Files In ColdFusion With csvToArray()
Your code was the closest thing I've found to obtaining some direction for converting ISO fields to values that CF can translate properly. Thank you for posting! ... read »
May 15, 2013 at 10:37 PM
Very Simple Pusher And ColdFusion Powered Chat
hi id making plz easy ... read »
May 15, 2013 at 6:07 PM
Making SOAP Web Service Requests With ColdFusion And CFHTTP
Ben, you once again saved my bacon at work. Thank you, thank you, thank you! ... read »
May 15, 2013 at 4:15 PM
What If All User Interface (UI) Data Came In Reports?
@Josh, Thanks! @Ben, I definitely recommend the David West book "Object Thinking" I've been quoting from. It goes deeply into the philosophy and history of OO programming. His breadth ... read »
May 15, 2013 at 11:36 AM
Ask Ben: Print Part Of A Web Page With jQuery
I found this helpfull when you need to keep (refresh) the original parent page after closing the iframe child print dialog (Hoping you're not using a form at this time so it won't submit again): On ... read »
May 14, 2013 at 7:13 PM
What If All User Interface (UI) Data Came In Reports?
@Jonah, If there's any books you'd recommend on the subject of domain modelling, I'd love to hear it. I just downloaded the free PDF of "Domain Driven Design Quickly". Figured I'd give it ... read »
May 14, 2013 at 6:57 PM
The UX Of Prototyping: Low-Fidelity Is The New High-Fidelity
@Phillip, I'm not sure I follow what you mean? Are you saying that you looked at the list of widgets provided by the jQuery UI and let that be your style guide? ... read »
InVision App - Prototyping Made Beautiful With Prototyping Tools