A polyfill for the Elements class in recently added to the DOM Standard, as well as .query and .queryAll methods for Elements, Element, Document, and DocumentFragment.
JavaScript
Latest commit d12ce3d Oct 5, 2015 @barberboy Update README.md

README.md

DOM Elements

DOM Elements is a polyfill that allows you to use the .query and .queryAll methods newly added to the DOM Standard. queryAll returns an instance of the new Elements class which extends Array, allowing you to use map, reduce, filter, forEach, and the like on the returned elements.

The DOM Elements polyfill supports Internet Explorer 9+, Chrome 15.0+, Firefox 4.0+, Opera 12.0+, Safari 5.0.5+, Mobile Safari 6.0+.

Background

The DOM Standard added .query(relativeSelector) and .queryAll(relativeSelector) methods to the ParentNode interface, which is implemented by Document, Element, and DocumentFragment. It also defined a new class, Elements, which extends Array and also has .query and .queryAll.

Usage

You can install the dom-elements package with either npm or bower, or directly download dom-elements.js or dom-elements.min.js and include them in your project.

bower install dom-elements

or

npm install dom-elements

You are also welcome to clone the repo directly and use the dom-elements.js or dom-elements.min.js in the lib directory.

git clone https://github.com/barberboy/dom-elements
npm install
npm start

.query(relativeSelector)

.query() is available on document, documentFragments, individual DOM elements, and the Elements class. It will return the first descendant element which matches the selector, or null if there are zero matches.

var siteHeader = document.query('header');
if (siteHeader) {
  var active = siteHeader.query('.site-menu .active');
}

.queryAll(relativeSelector)

.queryAll is available on document, documentFragments, individual DOM elements and the Elements class. It will return a new instance of Elements containing descendants that match the passed selector, or an instance with no elements if there are no matches.

var collapsibles = document.queryAll('.collapsible');

collapsibles.forEach(function(collapsible){
  var heading = collapsible.query('h1,h2,h3,h4,h5,h6');
  heading.addEventListener('click', function(event) {
    collapsible.classList.toggle('collapsed');
  }, false);
});

The .query and .queryAll methods are also available on the Elements array returned by .queryAll.

 var sections = document.queryAll('section');
 var headingLinks = sections.queryAll(':any(h1,h2,h3,h4,h5,h6) a');

Caveats

  • Since we use querySelectorAll and ES5 Array methods, this shim will not work in IE8 and below. See the browser support list at https://ci.testling.com/barberboy/dom-elements.
  • This shim (despite it's name—ha!) does not expose the Elements constructor function since there isn't a compelling use-case for instantiating it directly.
  • Update: Support for Relative Selectors was added in version 0.1.0 by @bloodyowl.

License

MIT