justme: DOM, Zeilenumbrüche und Konqueror

Hallo SELFGemeinde,

ich bin derzeit dabei ein Baumstruktur-Menü zu scripten, welches im IE, FF und Opera ohne Fehler funktioniert. In Konqueror erscheinen jedoch nach dem Austauschen von Knoten Zeilenumbrüche, wo es eigentlich keine geben dürfte.
Ich nehme an, dass es ein Bug in Konqueror ist und ich wäre dankbar, wenn mir vllt jemand einen Hinweis für einen Hack geben könnte.

Hier erstmal der Soure:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Tree Navigation just another try</title>
<style type="text/css">/* <![CDATA[ */
#nav div{margin-left:5px;}
/* ]]> */</style>
</head>
<body>

<div id="nav"><!-- hier werden die Navigationslevels reingeladen --></div>
<!-- Index aller Navigationslevels -->
<div id="navindex" style="display:none">

<div id="main">
<span onclick="nav(this,'erster')">erster</span><br />
<span onclick="nav(this,'zweiter')">zweiter</span><br />
<span onclick="nav(this,'dritter')">dritter</span><br />
</div>

<div id="erster">
<span onclick="nav(this,'ersterer')">ersterer</span><br />
<span onclick="nav(this,'ersterer')">noch ein erster</span><br />
</div>

<div id="ersterer">
<span onclick="nav(this,'ersterer')">lol<br /></span>
</div>

<script type="text/javascript">/* <![CDATA[ */
function nav(master,appr)
{
if(master.nextSibling.nodeName=="BR")master.parentNode.replaceChild(document.getElementById(appr).cloneNode(true),master.nextSibling);
else master.parentNode.replaceChild(document.createElement('BR'),master.nextSibling);
sav=document.getElementById('nav').innerHTML;//for debugging
}

document.getElementById('nav').appendChild(document.getElementById('main').cloneNode(true));//init nav
/* ]]> */</script>

</div>
<div><a href="javascript:document.write(sav)">javascript:document.write("document.getElementById('nav').innerHTML");</a></div>
</body>
</html>

Erklärung: Diese Baumnavigation missbraucht <br /> Tags als Booleansche Variabeln, ob die Unterpunkte eines Navigationspunktes angezeigt werden oder nicht.
Ist ein <br /> vorhanden, so weiß das Script, dass die Navigationspunkte nicht angezeigt werden. Andernfalls ist anstelle des <br /> Tags dann ein <div> Tag da, der die Unterpunkte der Navigation enthält. Dieser Wechsel wird in der JavaScript Funktion mittels master.parentNode.replaceChild() ermöglicht, indem die <br /> Tags ersetzt werden.

Daher besteht ein Navigationspunkt eben immer aus dem "Link" und einem <br />

<span onclick="nav(this,'erster')">erster</span><br />

Aber kommen wir jetzt zum eigentlichem Problem:
Klickt man 2 mal auf "erster", so wird das Menü aufgeklappt und danach wieder zugeklappt. Bei Konqueror bleibt aber danach zwischen "erster" und "zweiter" eine Zeile frei.

Der Link unten auf der Seite dient zu Diagnosezwecken.
Er liest den akutellen Inhalt der Navigation aus und gibt ihn mit document.write() aus, um zu demonstrieren, dass sich keine <br />s in der Navigation versteckt haben.

Vielen Dank für eure Ratschläge

  1. Hallo justme,

    Der Link unten auf der Seite dient zu Diagnosezwecken.

    den habe ich nicht gefunden, daher rate ich mal:

    if(master.nextSibling.nodeName=="BR")

    Hier prüfst Du den Knoten hinter "master". Dieses ist nach Deinem Quelltext ein BR. Aber bist Du sicher, dass das immer so ist? Wenn sich hier ein Leerzeichen oder ein Zeilenumbruch einschleicht, ist der nächste Knoten ein Textknoten. Ich habe mir angewöhnt, immer wenn möglich auf Konstrukte mit "nächster Knoten" zu verzichten und lieber getElementsByTagName zu nehmen. Ob oder wie das jetzt Dein Problem löst, weiß ich nicht.

    Gruß, Jürgen