- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Mon, 29 Mar 2010 22:26:19 -0400
- To: David Chambers <david.chambers.05@gmail.com>
- CC: www-style@w3.org
On 3/29/10 8:51 PM, David Chambers wrote: > In general, the use of such a selector would cause significant > slowdowns in web page rendering (esp. incremental rendering). > > > That's interesting. I have very little understanding of how selectors > work behind the scenes, and had assumed that selecting elements based on > their text content would be no more difficult than selecting elements > based on an attribute value. Not quite. Say I have this selector: td[foo="bar"] Then when an attribute changes I only need to check that the attribute's name is "foo" and the element's name is "td" to decide whether this selector matters. In particular, if I keep a list of selectors that involve attributes, one list for each distinct attribute name, I can just pull up the list for the name of the attribute that's changing and check the selectors in it against the node the attribute is changing on. In the common case, the list for any given attribute is empty. Adding an attribute selector affects the speed of changing the attribute it's selecting against, but not other attributes. Now consider td:contains("something"). Any time a node is added to the DOM, one needs to check whether it has an ancestor "td" and if so whether it has any descendants containing the text "something" (or some variant thereof, depending on whether "something" can span element boundaries). Or check just one of those, of course. Or check neither and restyle the entire document. And if you have a selector like |td:contains("something") span| then on any DOM insertion you have to either restyle everything under all "td"s or restyle all spans under all "td"s or determine whether the new node has an ancestor "td" (possibly more than one!) and descendant "something" and then restyle all "span"s under the "td"s involved. It may be possible to optimize things somewhat but the whole "any insertion anywhere in the DOM could affect any other element in the document depending on the selectors involved" thing is a bit of a pain and makes this much harder to handle than attribute changes. Similar for removals from the DOM. -Boris
Received on Tuesday, 30 March 2010 02:26:55 UTC