|Summary:||console.log(document.getElementsByTagName(..)) outputs wrong value when DOM is later modified|
|Product:||WebKit||Reporter:||Evan Martin <evan>|
|Component:||Web Inspector (Deprecated)||Assignee:||Nobody <webkit-unassigned>|
|Severity:||Normal||CC:||abarth, ap, kangax, paulirish, sam|
|Version:||528+ (Nightly build)|
|OS:||OS X 10.5|
Description Evan Martin 2010-11-13 15:38:25 PST
See attached test case. Basically, getElementsByTagName() returns a value like you've already executed the code that *follows* it. If you remove the later code, the earlier code behaves as expected. Google Chrome 9.0.576.0 (Official Build 65344) dev WebKit 534.12 V8 2.5.4 Works in Firefox 3.6.12.
Comment 1 Evan Martin 2010-11-13 15:38:48 PST
Created attachment 73834 [details] html file showing problem
Comment 2 Evan Martin 2010-11-13 15:39:35 PST
(Note that this only dumps to the JS console, so you need Firebug installed on Firefox to test it.)
Comment 3 Evan Martin 2010-11-13 15:49:00 PST
Created attachment 73836 [details] better demo Here's a better example, where we flip a coin to decide whether to remove the node or not. Load this, bring up the console, repeatedly hit f5 and boggle at the first line of output changing. I guess something is printing the actual value of getElementsByTagName too late -- we always seem to successfully get the first node, whether or not the console.log thinks it exists.
Comment 4 Adam Barth 2010-11-13 16:10:58 PST
I think getElementsByTagName is returning a live node list. You're then modifying the node list. The question is when we read the value of the node list to print. With the inspector using an async API, I can see why this might occur after later than you expect.
Comment 5 Sam Weinig 2010-11-14 11:57:37 PST
This seems like an inspector bug and not a DOM bug. If you log document.getElementsByTagName('ul').length instead of just document.getElementsByTagName('ul'), you will see that the first log has two elements and the second log as one element. Changing component to Web Inspector.
Comment 6 Evan Martin 2010-11-15 10:35:52 PST
With another day's perspective on my code. console.log(document.getElementsByTagName('ul')); => prints the list with only the second one var x = document.getElementsByTagName('ul'); => x successfully is the first (missing) item. So it's clear that document.getElementsByTagName is returning the right thing, and it's just the console.log that is confusing. I'll retitle the bug to something less mysterious.