- From: James Greene <james.m.greene@gmail.com>
- Date: Sat, 27 Jul 2013 14:41:43 -0500
- To: Ojan Vafai <ojan@chromium.org>
- Cc: WHATWG <whatwg@lists.whatwg.org>, Boris Zbarsky <bzbarsky@mit.edu>, Jonas Sicking <jonas@sicking.cc>
Isn't that what the NodeIterator and TreeWalker DOM APIs were for? Sincerely, James Greene On Jul 27, 2013 12:58 PM, "Ojan Vafai" <ojan@chromium.org> wrote: > On Thu, Jul 25, 2013 at 1:42 PM, Jonas Sicking <jonas@sicking.cc> wrote: > > > On Thu, Jul 25, 2013 at 9:05 AM, Boris Zbarsky <bzbarsky@mit.edu> wrote: > > > On 7/24/13 10:42 PM, Jussi Kalliokoski wrote: > > >> > > >> Argh, I had forgotten about live NodeLists. OK, this is a reason that > > >> resonates with me and justifies calling these methods obsolete. Too > bad > > >> these methods are so badly flawed > > > > > > > > > Fwiw, I think the performance impact of live NodeLists is ... unclear. > > Their > > > existence does mean that you have to deal with DOM mutations changing > the > > > lists, but them being live also means you can make the list getters > much > > > faster in cases when the caller doesn't actually want the entire list. > > > > And, as importantly, it also means that for multiple consecutive calls > > to get the list, say inside of a loop, can return the same result > > object. I.e. you don't have to re-walk the DOM for every iteration > > through the loop. > > > > I think these are good points of what is lost by using static NodeLists. I > still feel pretty strongly though that these benefits don't outweigh the > costs. If we want to give people most of the benefits of live NodeLists > without the costs we could expose an iterator API: > > var iterator = document.querySelectorAll('div').iterator(); <--- does some > magic to not precompute the whole list > while (let current = iterator.next()) { ... } > > And next always does the walk from the current node. So, if you add a div > before the current node, this specific iterator won't hit it, but if you > add a div after it would. I'm not sure what should happen though if you > remove the node that's the current node. I think I'm OK with the iterator > just returning null for the next() call in that case. > > This gets the performance benefits of live NodeLists, I think meets the > main use-cases of not wanting to walk the whole DOM, but doesn't require > the browser to do a lot of metadata tracking as you go. > > Ojan >
Received on Saturday, 27 July 2013 19:42:09 UTC