f



Finding last node

Hi,

I suspect this is a common question but I've read the FAQ and searched
the archives and couldn't find it. In a script embedded in the body of
the page I want to quickly find the last node that was created and
appendChild nodes to it. I can't just use document.body.appendChild as
the last node is likely to be a grandchild or great-grandchild of body.
I know that I could document.write an element with an id and then
getElementById but this slow and clunky, there must be a faster way,
document.write() knows where to put its output.

In case I've not made myself clear:
[...inside an HTML document...]
Some text
<script>text=document.createTextNode("DOM");</script>
<table>
<tr>
<td>elem 1</td>
<td>elem
2<script>document.write("location");document.body.appendChild(text);</script></td>
</tr>
<tr>
<td>elem 3</td>
<td>elem 4</td>
</tr>
</table>
[...end of snippet...]
I'd like to replace document.body with something that would make the
text DOM appear after location rather than after the table and not
depend on the containing td having an id that I getElementById for.

Any help appreciated,

Jon.

0
jonquark (3)
2/13/2005 10:33:06 AM
comp.lang.javascript 38370 articles. 2 followers. javascript4 (1315) is leader. Post Follow

3 Replies
358 Views

Similar Articles

[PageSpeed] 25


JonQuark wrote:


> I suspect this is a common question but I've read the FAQ and searched
> the archives and couldn't find it. In a script embedded in the body of
> the page I want to quickly find the last node that was created and
> appendChild nodes to it. I can't just use document.body.appendChild as
> the last node is likely to be a grandchild or great-grandchild of body.
> I know that I could document.write an element with an id and then
> getElementById but this slow and clunky, there must be a faster way,
> document.write() knows where to put its output.
> 
> In case I've not made myself clear:
> [...inside an HTML document...]
> Some text
> <script>text=document.createTextNode("DOM");</script>
> <table>
> <tr>
> <td>elem 1</td>
> <td>elem
> 2<script>document.write("location");document.body.appendChild(text);</script></td>
> </tr>
> <tr>
> <td>elem 3</td>
> <td>elem 4</td>
> </tr>
> </table>
> [...end of snippet...]
> I'd like to replace document.body with something that would make the
> text DOM appear after location rather than after the table and not
> depend on the containing td having an id that I getElementById for.

It is a bit tricky, if you have a script that is executed during page 
load and wants to insert content during page load then if the browser 
plays nice you could assume that document.getElementsByTagName('script') 
can be used to find the current <script> element as the last script 
element in that collection and then you can use appendChild on its 
parentNode to insert content at the correct position.

I have made the following test case:
<http://home.arcor.de/martin.honnen/mozillaBugs/domInsertionDuringPageLoad/docWriteMixAppendChild.html>
It shows that mixing document.write of pure text with appendChild leads 
to inconsistent behavior in different browsers (tested with IE 6, 
Netscape 7.2, Opera 7.50) so if you really think you need to use DOM 
Core stuff like appendChild during page load then do not mix it with 
document.write of pure text, the order of dynamically inserted content 
would then differ depending on the browser.

But of course there could be other browsers where even the strategy of 
appending to the parentNode of the last script element doesn't yield the 
desired behavior, perhaps some Safari or Konqueror users can report what 
the test case does for them.


-- 

	Martin Honnen
	http://JavaScript.FAQTs.com/
0
Martin
2/13/2005 1:41:16 PM
Martin Honnen wrote:
[...]
> But of course there could be other browsers where even the strategy of 
> appending to the parentNode of the last script element doesn't yield the 
> desired behavior, perhaps some Safari or Konqueror users can report what 
> the test case does for them.
> 
> 

  Count sequence for Safari 1.0.3 (Mac OS 10.2.8):

   1,2 ... 12,14,13,15 ... 25,27,26,28 .


  Hope that helps.

-- 
Fred
0
Fred
2/13/2005 4:02:44 PM

Fred Oz wrote:

> Martin Honnen wrote:
 >
>> perhaps some Safari or Konqueror users can 
>> report what the test case does for them.
>>
> 
>  Count sequence for Safari 1.0.3 (Mac OS 10.2.8):
> 
>   1,2 ... 12,14,13,15 ... 25,27,26,28 .

Thanks, so Safari exhibits the same problematic combination, 
document.write of pure text mixed with appendChild seems to change the 
sequence.


-- 

	Martin Honnen
	http://JavaScript.FAQTs.com/
0
Martin
2/13/2005 4:49:54 PM
Reply: