diff --git a/src/prototype/dom/dom.js b/src/prototype/dom/dom.js index acc42dbeb..242945ae9 100644 --- a/src/prototype/dom/dom.js +++ b/src/prototype/dom/dom.js @@ -1211,6 +1211,44 @@ return null; } + + /** + * Element.content(@element[, withoutNested]) -> String + * - withoutNested (Boolean) + * + * Returns the text content of the @element and all nested elements. + * If `withoutNested` set to true (default: false) returns the text content only for @element. + * + * ##### Examples + * + * language: html + * <div id="test"> + * Lorem ipsum + * <p><span>dolor</span> sit amet</p> + * </div> + * + * Get content: + * + * $('test').content() + * // => Lorem ipsum + * // dolor sit amet + * + * Get content only from #test + * + * $('test').content(true) + * // Lorem ipsum + * + **/ + function content(element, nested) { + var element = $(element); + + if (!element.hasChildNodes()) + return ''; + + return $A(element.childNodes).inject('', function(acc,node) { + return acc += node.nodeType == 3? node.nodeValue : nested == true? '' : content(node); + }); + } Object.extend(methods, { remove: remove, @@ -1221,7 +1259,8 @@ cleanWhitespace: cleanWhitespace, empty: empty, clone: clone, - purge: purge + purge: purge, + content: content }); diff --git a/test/unit/dom_test.js b/test/unit/dom_test.js index b9ef36b6f..03593c40c 100644 --- a/test/unit/dom_test.js +++ b/test/unit/dom_test.js @@ -1707,7 +1707,27 @@ new Test.Unit.Runner({ // unregistered. simulateClick(child); this.assert(!trigger, "fired event should not have triggered handler"); - } + }, + + testElementContent: function() { + var content = $('testContent').content(); + var arr_content = content.split('\n').findAll(function(a) { + if (!a.strip().blank()){ + return a; + } + }).invoke('strip'); + + this.assertEqual(true, Object.isString(content)); + this.assertEnumEqual(['test#a', 'testem', 'zed', 'span', 'test#b'], arr_content); + + var contentWithoutNested = Element.content('testContent', true); + var arr = contentWithoutNested.split('\n').findAll(function(a) { + if (!a.strip().blank()) + return a; + }).invoke('strip'); + + this.assertEnumEqual(['test#a', 'test#b'], arr); + } }); function preservingBrowserDimensions(callback) { diff --git a/test/unit/fixtures/dom.html b/test/unit/fixtures/dom.html index 99395eeca..f58940f3a 100644 --- a/test/unit/fixtures/dom.html +++ b/test/unit/fixtures/dom.html @@ -275,4 +275,18 @@ </div> <div id='elementToViewportDimensions' style='display: none'></div> -<div id="auto_dimensions" style="height:auto"></div> \ No newline at end of file +<div id="auto_dimensions" style="height:auto"></div> + +<div id="testContent"> + test#a + <p> + <em>testem</em> + <div> + zed + <span> + span + </span> + </div> + </p> + test#b +</div> \ No newline at end of file