The book has its weak moments; I mention only two of them, one on the theory, the other on programming:
1) an apparent inconsistency on the properties of childNode array. After having repeatedly stated that this array contains ALL the children of an element node ("including the attribute nodes", see p. 67), it suddenly states (p. 70, p. 154, etc) that the text node of a paragraph node is the first and ONLY node of childNodes. Some tests (using elements that had attributes) confirmed that this last statement was correct. So, apparently, the childNodes array of an element does NOT report its attribute nodes, contradicting the first assertion.
2) the function "showPicture()", the central routine of the example that runs across all the book. All is fine, until Jeremy suddenly decides to change (ch 6, p. 106) its return to "true" when the function fails, and "false" when it succeeds. This is done in order to easily propagate the indication to the browser whether to follow the link or not, but... let me put it this way: would you write routine "start_shuttle()" to return "true" when the requested action fails, just because it makes life "easier" (?) for some intermediate caller routine? let's hope not (for the astronauts' sake).
Furthermore, as show Picture() had multiple returns inside, each one of them had to be tweaked in the "tricky" way; contrast this potential maintenance nightmare with instead returning the right value and simply switching it in the caller. The code (a la D. Conway "self-documented" way) could be:
"var followLink = ! showPicture(); return followLink".
A comment can be added to remove any residual doubt for people maintaing the code in future: "if showPic() succeds, tell browser not to follow the link, and viceversa".