Paul, one recommendation: store the results of element.nextSiblings() in a
local variable outside of the loop. DOM traversals are pretty slow.

Best,
Alex

On Mon, Feb 22, 2010 at 12:28 PM, Paul Kim <[email protected]> wrote:

> Hi Walter, if you want to get all similar elements up to but not including
> the next head, I would use Prototype's Element.nextSiblings() to loop
> through all elements with the same tagName and break when the tagName is
> different. Here is a function I created just now that would hopefully do
> what you want:
>
> function getSimilarElements(element) {
>     var element = $(element);
>     var similarElements = new Array();
>     for (var i=0; i< element.nextSiblings().length; i++) {
>         if (element.tagName == element.nextSiblings()[i].tagName) {
>             similarElements[i] = element.nextSiblings()[i];
>         }
>         else {
>             break;
>         }
>     }
>     return similarElements;
> }
>
> Here is the entire example as well:
>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
> <html xmlns="http://www.w3.org/1999/xhtml";>
> <head>
> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
> <title>Demo</title>
> <script type="text/javascript" src="
> http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js
> "></script>
> <script type="text/javascript" src="
> http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js
> "></script>
> <script type="text/javascript">
> document.observe("dom:loaded", function() {
>     function getSimilarElements(element) {
>         var element = $(element);
>         var similarElements = new Array();
>         for (var i=0; i< element.nextSiblings().length; i++) {
>             if (element.tagName == element.nextSiblings()[i].tagName) {
>                 similarElements[i] = element.nextSiblings()[i];
>             }
>             else {
>                 break;
>             }
>         }
>         return similarElements;
>     }
>
>     console.log(getSimilarElements('foo'));
> });
> </script>
> <style type="text/css">
> body {margin:0; padding:0;}
> </style>
> </head>
> <body>
> <div>
> <h3>first header</h3>
> <p id="foo">first paragraph</p>
> <p>second paragraph</p>
> <h3>second header</h3>
> <p>third paragraph</p>
> <p>fourth paragraph</p>
> <p>fifth paragraph</p>
> <h3>third header</h3>
> <p>sixth paragraph</p>
> <p>seventh paragraph</p>
> </div>
> </body>
> </html>
>
>
>
> On Mon, Feb 22, 2010 at 8:22 AM, Walter Lee Davis <[email protected]>wrote:
>
>> Thanks very much. I was looking in the wrong place for the functionality I
>> need. You've given me the bones I need to build on.
>>
>> Walter
>>
>>
>> On Feb 22, 2010, at 11:07 AM, Alex Wallace wrote:
>>
>>  I whipped up something that should handle the task, although I'm sure
>>> this could be optimized using the nextElementSibling. This version grabs
>>> nextSiblings() and then filters them, but the faster way would be to iterate
>>> over the `element.nextSibling` and break when it encounters a different tag
>>> name (instead of finding them all, which is bound to be slower).
>>>
>>> But here goes:
>>>
>>>        function consecutiveSameTagSiblings(element) {
>>>                element = $(element);
>>>                var siblings = element.nextSiblings(), results = [];
>>>                if (!siblings[0]) return results;
>>>                var tagName = siblings[0].tagName.toLowerCase();
>>>                for (var i = 0, sibling; sibling = siblings[i]; ++i) {
>>>                        if (sibling.tagName.toLowerCase() === tagName)
>>>                                results.push(sibling);
>>>                        else
>>>                                break;
>>>                }
>>>                return results;
>>>        }
>>>
>>> Best,
>>> Alex
>>>
>>>
>>> On Mon, Feb 22, 2010 at 10:38 AM, Walter Lee Davis <[email protected]>
>>> wrote:
>>> Hmmm. That's not a documented function. I had a look at the source, and I
>>> can't see how it works. It accepts a node as its only argument, and it
>>> doesn't seem to perform any comparison as it executes. How then would I get
>>> it to stick to just the one type of sibling, and how would I get it to stop
>>> when it ran out of similar siblings?
>>>
>>> Thanks as always for any pointers.
>>>
>>> Walter
>>>
>>>
>>> On Feb 22, 2010, at 10:29 AM, Alex Wallace wrote:
>>>
>>> You'll want to leverage Prototype's nextElementSibling function. That
>>> function grabs element.nextSibling and traverses until it finds an an actual
>>> element (by checking nodeType).
>>>
>>> You could wrap a function around that which stores the tagName of the
>>> first element it matches, and then continues to find nextElementSibling
>>> until it either returns null, or break when the tagName doesn't match the
>>> original tagName.
>>>
>>> Take a look at the innards of Element.adjacent and
>>> Element.nextElementSibling for an idea of what I mean.
>>>
>>> Best,
>>> Alex
>>>
>>> On Mon, Feb 22, 2010 at 12:00 AM, Walter Lee Davis <[email protected]>
>>> wrote:
>>> I have a structure like this inside a parent DIV:
>>>
>>> H3
>>> P
>>> P
>>> H3
>>> P
>>> P
>>> P
>>> H3
>>> P
>>> P
>>>
>>> And I'd like to be able to get the paragraphs between two heads, or
>>> between the last head and the end of the parent DIV. Element.adjacent('p')
>>> doesn't do what I need -- it returns all the p tags in the entire DIV, since
>>> everything is at the same level. If I get a reference to the first element
>>> following the head, how could I get all similar elements up to but not
>>> including the next head? I'm trying to find a purely structure based way to
>>> do this, rather than adding classnames to the elements.
>>>
>>> Thanks,
>>>
>>> Walter
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Prototype & script.aculo.us" group.
>>> To post to this group, send email to
>>> [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<prototype-scriptaculous%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>>>
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Prototype & script.aculo.us" group.
>>> To post to this group, send email to
>>> [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<prototype-scriptaculous%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Prototype & script.aculo.us" group.
>>> To post to this group, send email to
>>> [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<prototype-scriptaculous%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>>>
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Prototype & script.aculo.us" group.
>>> To post to this group, send email to
>>> [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<prototype-scriptaculous%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Prototype & script.aculo.us" group.
>> To post to this group, send email to
>> [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<prototype-scriptaculous%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>>
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Prototype & script.aculo.us" group.
> To post to this group, send email to
> [email protected].
> To unsubscribe from this group, send email to
> [email protected]<prototype-scriptaculous%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.

Reply via email to