-
Notifications
You must be signed in to change notification settings - Fork 949
Home
[Project Home Page](http://sizzlejs.com/) | [Source Repository](http://github.com/jquery/sizzle/) | [Google Group Discussion](http://groups.google.com/group/sizzlejs)
Note: Browser support may differ between standalone Sizzle and libraries that include Sizzle. Please report issues on Sizzle's issue tracker, rather than the trackers for disparate libraries.
Sizzle supports:
- IE 6+
- FF 3.6+
- Chrome 14+
- Safari 4.0+
- Opera 11.6+
- Yandex.Browser 14.5+
- iOS 5.1+
- Android 2.3, 4.0+
To report a bug in any of these browsers, please add an issue with a test case from jsfiddle or jsbin.
Sizzle supports virtually all CSS 3 Selectors, including escaped selectors (.foo\+bar
), Unicode selectors, and results returned in document order. The only exceptions are those that would require additional DOM event listeners to keep track of the state of elements.
As such, the following pseudo-selectors are not supported:
:hover
:active
-
:visited
,:link
Note: These CSS3 pseudo-selectors were unsupported prior to version 1.9:
:target
:root
:nth-last-child
-
:nth-of-type
,:nth-last-of-type
,:first-of-type
,:last-of-type
,:only-of-type
:lang()
- Full selector lists in
:not()
; e.g.:not(a.b)
,:not(div > p)
,:not(div, p)
- Nested pseudo-selectors; e.g.
:not(:has(div:first-child))
-
[NAME!=VALUE]
: Find elements whose NAME attribute doesn't match the specified value. Equivalent to:not([NAME=VALUE])
. -
:contains(TEXT)
: Find elements with textContent containing the word 'TEXT'. Case-sensitive. -
:header
: Find header elements (h1, h2, h3, h4, h5, h6). -
:parent
: Find elements with at least one child node (either text or an element).
In this context, "positional" refers to an element's placement in the collection after a selection, based on document order. For example, div:first
would return an array containing the first div
on the page, while div:first em
would target the first div
on the page and select all em
elements within.
Note: Positional indexes begin at zero.
-
:first
/:last
: Find the first/last matching element -
:even
/:odd
: Find even/odd-numbered elements -
:eq
/:nth
: Find the nth element; e.g.:eq(5)
finds the 6th element -
:lt
/:gt
: Find elements at positions above/below the specified position
Note: In this context, input
, button
, select
, and textarea
are all considered to be input elements.
-
:input
: Find input elements -
:text
,:checkbox
,:file
,:password
,:submit
,:image
,:reset
,:button
: Find input elements with the specified input type
The Sizzle API consists of 3 parts:
- The Public API, which users interact with.
- The Extension API, for modifications to the selector engine.
- The Internal API, used internally by Sizzle.
The main function for finding elements. Uses querySelectorAll
if available.
returns (Array): All elements matching the selector
Parameters
selector: A CSS selector
context: An element, document, or document fragment to use as the context for finding elements. Defaults to document
.
Note: Prior to version 2.1, document fragments were not valid here.
results: An array or an array-like object, to which Sizzle will append results. For example, jQuery passes a jQuery collection. An "array-like object" is an object with a nonnegative numeric length
property and a push
method.
Uses native matchesSelector
if available
returns(Boolean): Whether the given element matches the selector
Parameters
element: A DOMElement
against which Sizzle will test the selector
selector: A CSS selector
returns(Array): Elements in the array that match the given selector
Parameters
selector: A CSS selector
elements: An array of DOMElements
to filter against the specified selector
This contains the regular expressions used to parse a selector into different parts, to be used for finding and filtering. The name of each of the regular expressions should correspond to the names specified in the Sizzle.selectors.find
and Sizzle.selectors.filter
objects.
In order to add a new find function:
- A regular expression must be added to the
match
object. - A function to
find
must be defined. -
"|" + NAME
must be appended to theSizzle.selectors.order
regex.
A method for finding some elements on a page. The specified function will be called no more than once per selector.
-
match
is the array of results returned from matching the specified regex against the selector. -
context
is the DOMElement or DOMDocument from which selection will occur. -
isXML
is a boolean value indicating whether the function is currently operating within an XML document.
In order to add a new filtering statement:
- A regular expression must be added to the
match
object. - A function must be added to the
filter
object. - A function may optionally be added to the
preFilter
object.
An optional pre-filter function which allows filtering of the matched array against the corresponding regular expression, which will return a new matched array. This matched array will eventually be passed and flattened as arguments against the corresponding filter function. This is intended to clean up some of the repetitive processing that occurs in a filter function.
Note: match[0]
will be deleted prior to being passed to a filter, and must not be used.
The arguments for a filter method are the element and the captures from the regex corresponding to this filter (indicated above by what is in the match, starting at index 1). The return result must be boolean: true if the element matches the selector, false if not.
Handle an attribute which requires specialized processing (such as href
, which has cross-browser issues). The return result must be the actual string value of that attribute.
The most common extension to a selector engine: adding a new pseudo. The return result from this function must be boolean: true if the element matches the selector, false if not.
For example, this is a simple pseudo:
Sizzle.selectors.filters.hidden = function( elem ) {
return elem.offsetWidth === 0 || elem.offsetHeight === 0;
};
createPseudo
is only required if the custom pseudo-selector accepts an argument.
Note: In jQuery 1.8 and earlier, the API for creating custom pseudos with arguments was broken. In jQuery 1.8.1+, the API is backwards-compatible. Regardless, the use of createPseudo
is greatly encouraged.
Now that the parser compiles a single function containing other functions, custom pseudo-selectors with arguments are much cleaner.
For example, within Sizzle, the implementation for the :not
pseudo selector is very similar to:
Sizzle.selectors.pseudos.not =
Sizzle.selectors.createPseudo(function( selector /* argument for NOT */ ) {
var matcher = Sizzle.compile( selector );
return function( elem ) {
return !matcher( elem );
};
});
In jQuery, this would be equivalent to:
jQuery.expr[":"].not = jQuery.expr.createPseudo(function( selector ) {
var matcher = jQuery.find.compile( selector );
return function( elem ) {
return !matcher( elem );
};
});
In order to write a custom selector with arguments that can take advantage of the new API, yet still support all versions of Sizzle, check for the createPseudo
method.
The following example uses jQuery syntax. Live example
// An implementation of a case-insensitive contains pseudo
// made for all versions of jQuery
(function( $ ) {
function icontains( elem, text ) {
return (
elem.textContent ||
elem.innerText ||
$( elem ).text() ||
""
).toLowerCase().indexOf( (text || "").toLowerCase() ) > -1;
}
$.expr[':'].icontains = $.expr.createPseudo ?
$.expr.createPseudo(function( text ) {
return function( elem ) {
return icontains( elem, text );
};
}) :
function( elem, i, match ) {
return icontains( elem, match[3] );
};
})( jQuery );
These filters are run after a previous part of a selector has already returned results. setFilters
are found from matching Sizzle.selectors.match.POS
. When applicable, argument
is expected to be an integer. The not
argument is a boolean indicating whether the result should be inverted (as in div:not(:first)
).
For example, the code for the :first
setFilter is similar to:
var first = function( elements, argument, not ) {
// No argument for first
return not ? elements.slice( 1 ) : [ elements[0] ];
};
Sizzle.selectors.setFilters.first = first;
It is easy to extend Sizzle -- even Sizzle's POS
selectors. For example, to rename :first
as :uno
:
Sizzle.selectors.match.POS = new RegExp( oldPOS.source.replace("first", "uno"), "gi" );
Sizzle.selectors.setFilters.uno = Sizzle.selectors.setFilters.first;
delete Sizzle.selectors.setFilters.first;
Sizzle("div:uno"); // ==> [ <div> ]
Note: Functionality should be accessed via the Public and Extension APIs. While the Internal API is intended specifically for internal use, it has been exposed for edge cases.
Sizzle internally caches compiled selector functions and tokenization objects. The length of these caches defaults to 50, but can be set to any positive integer by assigning to this property.
This method compiles a selector function and caches it for later use. For example, calling Sizzle.compile(".myWidget:myPseudo")
during initialization of a plugin will speed up the first selection of matching elements.
returns(Function): The compiled function to be used when filtering the set of possibly matching elements
Parameters
selector: A CSS selector
Special thanks goes out to the following. Without their contributions to the open source community, Sizzle would not be what it is today.
- Diego Perini and NWMatcher.
- The creators of the Slick selector engine used in mootools.
- Samuel Lebeau for writing bouncer, a small bottom-up element matcher.