Qwery - The Tiny Selector Engine ----- Qwery is a small *blazing fast* query selector engine allowing you to select elements with CSS1|2|3 queries ##Acceptable selectors ``` css /* basic */ #foo {} /* id */ .bar {} /* class */ a#foo.bar {} /* element attribute combinations */ /* attributes */ #foo a[href] {} /* simple */ #foo a[href=bar] {} /* attribute values */ #foo a[lang|=en] {} /* subcodes */ #foo a[title~=hello] {} /* attribute contains */ #foo a[href^="http://"] {} /* attribute starts with */ #foo a[href$=com] {} /* attribute ends with */ #foo a[href*=twitter] /* {} attribute wildcards */ /* descendants */ #foo a {} /* all descendants */ ul#list > li {} /* direct children */ /* siblings */ span ~ strong {} /* all adjacent */ p + p {} /* immediate adjacent */ /* combos */ div,p {} /* variations */ #foo.bar.baz {} div#baz.thunk a[-data-info*="hello world"] span + strong {} #thunk[title$='huzza'] {} ``` Contexts ------- Each query can optionally pass in a context ``` js qwery('div', node); // existing DOM node or... qwery('div', '#foo'); // another query ``` pseudo selector API ------------------- Optionally, Qwery provides a [pseudo selector interface](https://github.com/ded/qwery/blob/master/src/pseudos.js) allowing you to extend into advanced CSS3 matchers. It looks like this: ``` js qwery.pseudos['first-child'] = function (el, val) { var p; return el.parentNode && (p = el.parentNode) && (childs = p.getElementsByTagName('*')) && childs[0] == el; }; ``` To create a new pseudo matcher you must set a property on `qwery.psuedos` with a boolean method that is passed back a candidate element, and a value (if any). For example: ``` js qwery('#content p.surprise:foo(bar)') qwery.pseudos.foo = function (el, val) { // val == 'bar' return el.getAttribute(val) } ``` Configuring Qwery ----------------- The `configure()` method takes an options object allowing you to adjust the way that Qwery works internally. Currently only the `useNativeQSA` option is available to turn on and off the use of native `querySelectorAll()` where available. ``` js qwery.configure({ useNativeQSA: false }) ``` Browser Support --------------- Qwery attempts to stay up to date with Yahoo's [Grade A Browser Support](http://developer.yahoo.com/yui/articles/gbs) in addition to future browser candidates. - IE6+ - Chrome 1+ - Safari 3+ - Firefox 2+ - Opera Dev Env & Testing ----- $ npm install smoosh sink-test $ make $ open tests/index.html Note ---- Qwery uses querySelectorAll when available. All querySelectorAll default behavior then applies. Ender support ------------- Qwery is the recommended selector engine for [Ender](http://ender.no.de). If you don't have Ender, install it, and don't ever look back. $ npm install ender -g To include Query in a custom build of Ender you can include it as such: $ ender build qwery[,mod2,mod3,...] Or add it to an existing Ender installation $ ender add qwery Ender bridge additions --------- Assuming you already know the happs on Ender -- Qwery provides some additional niceties when included with Ender: ``` js // the context finder - find all p elements descended from a div element $('div').find('p') // join one set with another $('div').and('p') // test nodes against selectors $('#foo').is('div.bar'); // => true if any nodes match // element creation $('

hello world

'); // => [HTMLParagraphElement "hello world"] ``` Recommended sibling modules ---------- In most cases, if you're hunting for a selector engine, you probably want to pair Qwery with a DOM module. In that case qwery pairs quite nicely with [Bonzo](https://github.com/ded/bonzo) (a DOM util) and [Bean](https://github.com/fat/bean) (an event util). Add them to your Ender installation as such: $ ender -b qwery bonzo bean Then write code like a boss: ``` js $('a.boosh') .css({ color: 'red', background: 'white' }) .after('√') .bind({ 'click.button': function () { $(this).hide().unbind('click.button') } }) ``` Qwery Mobile! ------------ If you're building a Webkit (iPhone / Android / Chrome OS) application, you may be interested in qwery-mobile! Include this (instead of qwery) in your Ender build and get a full qwery interface for just 600 bytes :) $ ender add qwery-mobile Contributors ------- * [Dustin Diaz](https://github.com/ded/qwery/commits/master?author=ded) * [Rod Vagg](https://github.com/ded/qwery/commits/master?author=rvagg) * [Jacob Thornton](https://github.com/ded/qwery/commits/master?author=fat) * [Andrew McCollum](https://github.com/ded/qwery/commits/master?author=amccollum)