From b4d470093ccf4cbe15c8a25ed40ab6fc0b6ac267 Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 9 Jul 2014 16:55:43 +0300 Subject: [PATCH 1/2] add Element#index Element#indexOfType methods --- src/prototype/dom/dom.js | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/src/prototype/dom/dom.js b/src/prototype/dom/dom.js index b9500f0dc..fd6a97037 100644 --- a/src/prototype/dom/dom.js +++ b/src/prototype/dom/dom.js @@ -2006,6 +2006,87 @@ function next(element, expression, index) { return _recursivelyFind(element, 'nextSibling', expression, index); } + + /** + * Element.index(@element) -> Number + * + * Return index of `@element` in siblings. + * + * ##### Example + * + * language: html + * + * + * Then: + * + * $('div').index(); + * // -> 0 + * + * $('subspan').index(); + * // -> 0 + * + * $('first').index(); + * // -> 1 + * + **/ + function index(element) { + var element = $(element); + return (element.siblings().length - element.nextSiblings().length); + } + + /** + * Element.indexOfType(@element) -> Number + * + * Return index of `@element` in siblings based on `tag` of `@element`. + * + * ##### Example + * + * language: html + * + * + * Then: + * + * $('div').indexOfType(); + * // -> 0 + * + * $('first').indexOfType(); + * // -> 0 + * + * $('second').indexOfType(); + * // -> 1 + * + **/ + function indexOfType(element) { + var element = $(element), + tagName = element.tagName; + + function match(array, tagName) { + return array.pluck('tagName').inject(0, function(n, tag) { + if (tag == tagName) { + n++ ; + } + return n; + }); + } + + return (match(element.siblings(), tagName) - match(element.nextSiblings(), tagName)); + } /** * Element.select(@element, expression...) -> [Element...] @@ -2178,6 +2259,8 @@ down: down, previous: previous, next: next, + index: index, + indexOfType: indexOfType, select: select, adjacent: adjacent, descendantOf: descendantOf, From 58d2c09f067372b885863c89b23038ceddad16aa Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 9 Jul 2014 16:56:05 +0300 Subject: [PATCH 2/2] add tests for Element#index Element#indexOfType methods; change dom.erb --- test.new/tests/dom.test.js | 16 ++++++++++++++++ test.new/views/tests/dom.erb | 14 +++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/test.new/tests/dom.test.js b/test.new/tests/dom.test.js index 51663400d..a8861ce79 100644 --- a/test.new/tests/dom.test.js +++ b/test.new/tests/dom.test.js @@ -775,6 +775,22 @@ suite('DOM', function () { assert(typeof $(dummy.childNodes[0]).next().setStyle == 'function'); }); + test('#index', function() { + assert.equal($("indexTest-div").index(), 0); + assert.equal($("indexTest-li1").index(), 1); + assert.equal($("indexTest-li2").index(), 2); + assert.equal($("indexTest-subspan").index(), 0); + assert.equal($("indexTest-span").index(), 5); + }); + + test("#indexOfType", function() { + assert.equal($("indexTest-div").indexOfType(), 0); + assert.equal($("indexTest-li1").indexOfType(), 0); + assert.equal($("indexTest-li2").indexOfType(), 1); + assert.equal($("indexTest-subspan").indexOfType(), 0); + assert.equal($("indexTest-span").indexOfType(), 0); + }); + test('#inspect', function () { assert.equal('