- From: Maciej Stachowiak <mjs@apple.com>
- Date: Sun, 26 Feb 2006 15:03:08 -0800
- To: Cameron McCormack <cam@mcc.id.au>
- Cc: "Web APIs WG (public)" <public-webapi@w3.org>
On Feb 26, 2006, at 1:04 PM, Cameron McCormack wrote:
>
> Cameron McCormack:
>> As for whether these are easy to implement or not, I guess it's a
>> matter
>> of whether you are building on top of a CSS engine that you can't
>> modify. The main advantage would be access to selector parsing
>> routines.
>
> *after thinking about it last night*
>
> You also need code that performs the actual selections, too. This
> should be very similar to that which selects for the stylesheet rules
> anyway, though.
It's not that simple. Selectors for stylesheets are matched by
examining the element when applying style, and testing what rules
match. This API would require finding the elements that match a
selector. The naiive way to do this is to walk the whole document and
test each element for matching. But this is going to be way slower
than, say, getElementById which operates in O(1) time in most browsers.
Both live lists and non-live lists have issues with being
implementable efficiently. For a static list, you have to compute the
whole list right away to make sure it remains static in teh face of
changes. That means that even if you want only the first match you
have to walk the whole document. This means that probably you want a
selectSingleElement() in addition to selectElements().
Live lists have the problem that any document change forces you to
recompute the list, so iterating the list while modifying the
document often has O(N^2) behavior. For a subset of selectors it may
be possible to avoid this through caching, and detecting exactly what
changes make a difference, and putting in lots of notifications. But
I think for at least some selectors this is not feasible.
I also think live lists are a confusing programming model. If you
really are modifying the document while traversing the list, it is
likely more annoying than helpful for the list to change. For example:
// severely buggy
function removeAllDivs()
{
var divs = document.getElementsByTagName("divs");
for (var i = 0; i < divs.length; i++) {
var div = divs[i];
div.parentNode.removeChild(div);
}
}
This will not remove all divs. Could you even say without thinking
about it which divs it will remove?
It seems to me that, when modifying the document, you generally do
not want a live list, and when not modifying the document, it doesn't
matter which kind you have. Therefore I would recommend against
propagating the "live list" concept in new APIs.
So, in brief:
- Having an existing style system does not make it trivial to
implement a DOM API to find elements by selector.
- Static lists are probably more efficiently implementable than live
lists.
- Static lists would require a single-element version too, so you
don't have to build the whole list just to get one element.
- Live lists are confusing as a programming model.
- Live lists suck for performance and make it easy to accidentally
write O(N^2) code.
Regards,
Maciej
Received on Sunday, 26 February 2006 23:03:40 UTC