262588213843476 · Gist

@Zirak

  • Save Zirak/1671548 to your computer and use it in GitHub Desktop.

ol reverse attribute polyfill

//a polyfill for the ordered-list reversed attribute
// http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-ol-element
// http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#dom-li-value
//uses these awesomeness:
// Array.prototype.forEach
// Element.prototype.children
//if you want support for older browsers *cough*IE8-*cough*, then use the other
// file provided
(function () {
"use strict";
if ( 'reversed' in document.createElement('ol') ) {
return;
}
[].forEach.call( document.getElementsByTagName('ol'), function ( list ) {
if ( list.getAttribute( 'reversed' ) !== null ) {
reverseList( list );
}
});
function reverseList ( list ) {
var children = list.children, count = list.getAttribute('start');
//check to see if a start attribute is provided
if ( count !== null ) {
count = Number( count );
if ( isNaN(count) ) {
count = null;
}
}
//no, this isn't duplication - start will be set to null
// in the previous if statement if an invalid start attribute
// is provided
if ( count === null ) {
count = children.length;
}
[].forEach.call( children, function ( child ) {
child.value = count--;
});
}
}());
//use this if you want support for browsers which don't have ES5 goodies
(function () {
if ( 'reversed' in document.createElement('ol') ) {
return;
}
var lists = document.getElementsByTagName( 'ol' );
for ( var i = 0, len = lists.length; i < len; i++ ) {
if ( lists[i].getAttribute( 'reversed' ) !== null ) {
reverseList( lists[i] );
}
}
function reverseList ( list ) {
var children = [], childNodes = list.childNodes,
count = list.getAttribute('start'), i, len;
for ( i = 0, len = childNodes.length; i < len; i++ ) {
//Node.ELEMENT_NODE === 1
if ( childNodes[i].nodeType === 1 ) {
children.push( childNodes[i] );
}
}
//check to see if a start attribute is provided
if ( count !== null ) {
count = Number( count );
if ( isNaN(count) ) {
count = null;
}
}
//no, this isn't duplication - start will be set to null
// in the previous if statement if an invalid start attribute
// is provided
if ( count === null ) {
count = children.length;
}
for ( i = 0, len = children.length; i < len; i++ ) {
children[ i ].value = count--;
}
}
}());

Read the original on gist.github.com ↗