Hi Stehpan :p

I understand that, I'm just not sure why $("p", $("#foo")) is not the same as $("p", "#foo")

- Liam

Stephan Veigl wrote:
Hi Lima,

1) #foo is an ID and since IDs should be unique there has to bee only
one #foo element

2) $("p", $("#foo")) selects all <p> elements in the scope of the #foo element.
In other words, it selects every <p> element under #foo in the DOM tree.

by(e)
Stephan

2009/2/24 Liam Potter <radioactiv...@gmail.com>:
I've been following this discussion, but I need explaining why $("p",
$("#foo")) doesn't select all p tags and all #foo id's ?

Stephan Veigl wrote:
Hi,

I've done some profiling on this, and $("p", $("#foo")) is faster than
$("#foo p") in both jQuery 1.2.6 and 1.3.2.

the test HTML consists of 100 <p>s in a "foo" <div> and 900 <p>s in a
"bar" <div>.

However the factor differs dramatically:
In 1.2.6 the speedup from $("p", $("#foo")) to $("#foo p") was between
1.5x (FF) and 2x (IE),
while for 1.3.2 the speedup is 20x (FF) and 15x (IE).

$("p", $("#foo")) is faster in 1.3.2, by a factor of 1.5 (both FF and IE),
while $("#foo p") is _slower_ in 1.3.2 by 8.5x (FF) and 4.6x (IE).

Even with an empty "bar" div $("p", $("#foo")) is faster by a factor up to
3x.

Conclusion:
If you have an ID selector, first get the element by it's ID and use
it as scope for further selects.

by(e)
Stephan
2009/2/23 ricardobeat <ricardob...@gmail.com>:

up to jQuery 1.2.6 that's how the selector engine worked (from the top
down/left to right). The approach used in Sizzle (bottom up/right to
left) has both benefits and downsides - it can be much faster on large
DOMs and some situations, but slower on short queries. I'm sure
someone can explain that in better detail.

Anyway, in modern browsers most of the work is being delegated to the
native querySelectorAll function, as so selector performance will
become more of a browser makers' concern.

- ricardo

On Feb 23, 1:08 pm, Peter Bengtsson <pete...@gmail.com> wrote:

I watched the John Resig presentation too and learned that CSS
selectors always work from right to left.
That would mean that doing this::

 $('#foo p')

Would extract all <p> tags and from that list subselect those who
belong to #foo. Suppose you have 1000 <p> tags of them only 100 are
inside #foo you'll have wasted 900 loops.

Surely $('#foo') is the fastest lookup possible. Doing it this way
will effectively limit the scope of the $('p') search and you will
never be bothered about any <p> tags outside #foo.

Or am I talking rubbish?

Reply via email to