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