Extend matched elements

This commit is contained in:
Sam Stephenson 2009-09-19 16:17:43 -05:00
parent 4dd878f237
commit 79cf30aab1
1 changed files with 89 additions and 81 deletions

View File

@ -6,91 +6,99 @@
* A class that queries the document for elements that match a given CSS
* selector.
**/
var Selector = Class.create({
/**
* new Selector(expression)
* - expression (String): A CSS selector.
*
* Creates a `Selector` with the given CSS selector.
**/
initialize: function(expression) {
this.expression = expression.strip();
},
/**
* Selector#findElements(root) -> [Element...]
* - root (Element || document): A "scope" to search within. All results will
* be descendants of this node.
*
* Searches the document for elements that match the instance's CSS
* selector.
**/
findElements: function(rootElement) {
return Sizzle(this.expression, rootElement || document);
},
/**
* Selector#match(element) -> Boolean
*
* Tests whether a `element` matches the instance's CSS selector.
**/
match: function(element) {
return Sizzle.matches(this.expression, [element]).length == 1;
},
toString: function() {
return this.expression;
},
inspect: function() {
return "#<Selector: " + this.expression + ">";
(function() {
function extend(elements) {
for (var i = 0, length = elements.length; i < length; i++)
elements[i] = Element.extend(elements[i]);
return elements;
}
});
Object.extend(Selector, {
/**
* Selector.matchElements(elements, expression) -> [Element...]
*
* Filters the given collection of elements with `expression`.
*
* The only nodes returned will be those that match the given CSS selector.
**/
matchElements: function(elements, expression) {
return Sizzle.matches(expression, elements);
},
window.Selector = Class.create({
/**
* new Selector(expression)
* - expression (String): A CSS selector.
*
* Creates a `Selector` with the given CSS selector.
**/
initialize: function(expression) {
this.expression = expression.strip();
},
/**
* Selector.findElement(elements, expression[, index = 0]) -> Element
* Selector.findElement(elements[, index = 0]) -> Element
*
* Returns the `index`th element in the collection that matches
* `expression`.
*
* Returns the `index`th element overall if `expression` is not given.
**/
findElement: function(elements, expression, index) {
if (Object.isUndefined(index)) index = 0;
return Sizzle.matches(expression, elements)[index];
},
/**
* Selector#findElements(root) -> [Element...]
* - root (Element || document): A "scope" to search within. All results will
* be descendants of this node.
*
* Searches the document for elements that match the instance's CSS
* selector.
**/
findElements: function(rootElement) {
return extend(Sizzle(this.expression, rootElement || document));
},
/**
* Selector.findChildElements(element, expressions) -> [Element...]
/**
* Selector#match(element) -> Boolean
*
* Tests whether a `element` matches the instance's CSS selector.
**/
match: function(element) {
return Sizzle.matches(this.expression, [element]).length == 1;
},
toString: function() {
return this.expression;
},
inspect: function() {
return "#<Selector: " + this.expression + ">";
}
});
Object.extend(Selector, {
/**
* Selector.matchElements(elements, expression) -> [Element...]
*
* Filters the given collection of elements with `expression`.
*
* The only nodes returned will be those that match the given CSS selector.
**/
matchElements: function(elements, expression) {
return extend(Sizzle.matches(expression, elements));
},
/**
* Selector.findElement(elements, expression[, index = 0]) -> Element
* Selector.findElement(elements[, index = 0]) -> Element
*
* Returns the `index`th element in the collection that matches
* `expression`.
*
* Returns the `index`th element overall if `expression` is not given.
**/
findElement: function(elements, expression, index) {
if (Object.isUndefined(index)) index = 0;
return Element.extend(Sizzle.matches(expression, elements)[index]);
},
/**
* Selector.findChildElements(element, expressions) -> [Element...]
*
* Searches beneath `element` for any elements that match the selector
* (or selectors) specified in `expressions`.
**/
findChildElements: function(element, expressions) {
var results = [], exprs = expressions.toArray();
while (exprs.length) Sizzle(exprs.shift(), element || document, results);
return extend(results);
}
});
/** related to: Selector
* $$(expression...) -> [Element...]
*
* Searches beneath `element` for any elements that match the selector
* (or selectors) specified in `expressions`.
* Returns all elements in the document that match the provided CSS selectors.
**/
findChildElements: function(element, expressions) {
var results = [], exprs = expressions.toArray();
while (exprs.length) Sizzle(exprs.shift(), element || document, results);
return results;
window.$$ = function() {
return Selector.findChildElements(document, $A(arguments));
}
});
/** related to: Selector
* $$(expression...) -> [Element...]
*
* Returns all elements in the document that match the provided CSS selectors.
**/
function $$() {
return Selector.findChildElements(document, $A(arguments)).map(Element.extend);
}
})();