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.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


DOM Elements

⚠️ Relying on Element#query and Element#queryAll is somewhat risky since they’ve been temporarily removed from the current DOM Standard due to significant implementation issues. See related discussions on Stack Overflow and the WHATWG's DOM spec repository on GitHub, and use at your own risk.

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+.


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.


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


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() 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 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');

  var heading = collapsible.query('h1,h2,h3,h4,h5,h6');
  heading.addEventListener('click', function(event) {
  }, 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');


  • 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.