---
title: "Lånat menyscript har gått sönder"
type: "forum-thread"
url: "https://www.webforum.nu/amne/javascript/101753-lånat-menyscript-har-gått-sönder"
topic: "JavaScript"
topic_url: "https://www.webforum.nu/amne/javascript"
author: "nordan"
published: "2004-04-18T10:32:26.000Z"
updated: "2004-04-27T15:35:48.000Z"
replies: 13
views: 414
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/javascript/101753-lånat-menyscript-har-gått-sönder"
---

# Lånat menyscript har gått sönder

## #1 — nordan, 2004-04-18T10:32Z

Hallå!
Jag har lånat ett [menyscript av Jojoxx](http://www.jojoxx.net/dhtml/examples/DOMmenu2.html) det har funkat jättebra fram till att jag skulle göra någon ändring i meny. Nu stängs menyn så fort jag klickar på någon av länkarna jag har i menyn jag vill att menyn skall vara öppen om jag har klickat på någon av länkarna i den menyn. Är det någon som hittar felet för jag gör inte det.

Bifogar en enklare kod: 

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <script language="JavaScript">
var compressedMode = false;
var collapseMode = false;

function initMenu()
{
	if(!document.getElementById)
	{ 
		return ;
	}
	var current=document.getElementById('menuroot').firstChild;
	while(current)
	{
		if(current.className=="menu")
		{ 
			collapseAll(current); 
		}
		current=current.nextSibling;
	}
}
function findLink(url)
{
	
	pos = url.indexOf('&a=');
	if (pos < 0 ) pos = url.indexOf('?a=');
	if (pos >= 0)
	{
	    url = url.substring(pos+3);	
	    pos2 =  url.indexOf('&');
	    if (pos2 > 0 )
	    {
	        url = url.substring(0, pos2);	
	    }
	}
	
	var allLinks=new Array(); 
	allLinks=getAllChildsByTagName(document.getElementById('menuroot'),'a');
	var match=false;
	for(var i in allLinks)
	{
	    //---	if(allLinks[i].href.split('#')[0].split('?')[0].toLowerCase().right(url.length)==url.toLowerCase())
		if(allLinks[i].href.toLowerCase().right(url.length)==url.toLowerCase())
		{
			match=allLinks[i];
			break;
		}
	}
	if(match)
	{
		initMenu();
		match=match.parentNode;
		while(match.className=="menu")
		{
			match.style.display="block";
			match=match.parentNode;
		}
	}
}
String.prototype.right = function(len){ return this.substring(this.length-len); }
function collapseAll(element)
{
	if(!document.getElementById)
	{ 
		return 
	}
	menues=getAllChildsByTagName(element,"div");
	for(var i in menues)
	{
		menues[i].style.display="none";
		if(getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML.match(/^(\+|\-)/))
		{
			getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML="+"+getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML.substring(1);
		}
	}
	element.style.display="none";
}
function getAllChildsByTagName(element,tagname)
{
	var parents=new Array(); 
	var elements=new Array(); 
	var current;
	parents[0]=element;
	for(var i in parents)
	{
		current=parents[i].firstChild;
		while(current)
		{
			if(current.hasChildNodes)
			{ 
			    parents[parents.length]=current;
    		}
			if(current.tagName==tagname.toUpperCase())
			{
				elements[elements.length]=current;
			}
			current=current.nextSibling;
		}
	}
	return elements;
}
function getPreviousSiblingByClassName(element,classname)
{
	while(element.previousSibling)
	{
		if(element.previousSibling.className==classname)
		{ 
			return element.previousSibling; 
		}
		element=element.previousSibling;
	}
	return false;
}
function sw(mnu,li)
{
	if(!document.getElementById)
	{ 
		return false; 
	}
	if(document.getElementById(mnu).style.display=='block')
	{
		if(collapseMode)
		{
			collapseAll(document.getElementById(mnu));
		} 
		else 
		{
			document.getElementById(mnu).style.display='none';
		}
	} 
	else 
	{
		if(document.getElementById(mnu).parentNode.className=="menu" && compressedMode)
		{
			collapseAll(document.getElementById(mnu).parentNode);
			document.getElementById(mnu).parentNode.style.display="block";
		}
		document.getElementById(mnu).style.display="block";
	
	}
	if(li.innerHTML.match(/^(\+|\-)/))
	{
		li.innerHTML=(document.getElementById(mnu).style.display == 'none')?"+"+li.innerHTML.substring(1):"-"+li.innerHTML.substring(1);
	}
	return false;
}

</script>
</head>

<body onLoad="initMenu();findLink(location.href);">
<p>&nbsp;</p>
<p>&nbsp;</p>
<div id="menuroot" class="menu">
		<a href="#" onClick="return sw('menu_0',this);" class="menuChoice">+Heavy Music</a><br>
	<div id="menu_0" class="menu">
		<table border="0" cellspacing="0" cellpadding="0" width="100%">

                <tr><td >&nbsp;---<a href="nasta.php?prodid=3&a=menu_1" class="menuProdukt">Metallica</a></td></tr>
                <tr><td >&nbsp;---<a href="nasta.php?prodid=4&a=menu_2" class="menuProdukt">Iron Maiden</a></td></tr>
                <tr><td >&nbsp;---<a href="nasta.php?prodid=6&a=menu_3" class="menuProdukt">Ozzy</a></td></tr>
                 <tr><td >&nbsp;</td>
            </tr>
                <tr><td >&nbsp;</td>
                </tr>
        </table>

	</div> 
	
	
	       </div>	 

</body>
</html>
```

Permalänk: https://www.webforum.nu/p/101753

## #2 — Jojoxx, 2004-04-18T12:50Z

Lite moddad kod ser jag :)

Ändra funktionen findLink till:

```
function findLink(url){
	var allLinks=new Array(); 
	allLinks=getAllChildsByTagName(document.getElementById('menuroot'),'a');
	var match=false;
	for(var i in allLinks){
		if(allLinks[i].href.toLowerCase().right(url.length)==url.toLowerCase()){
			match=allLinks[i];
			break;
		}
	}
	if(match){
		initMenu();
		while(match=match.parentNode){
			if(match.className=="menu"){
				match.style.display="block";
				var li=getAllChildsByTagName(match,"a");
				if(li[0].innerHTML.match(/^(\+|\-)/)){
					li[0].innerHTML="-"+li[0].innerHTML.substring(1);
				}
			}
		}
	}
}
```

(Red. Har uppdaterat [orginalet](http://www.jojoxx.net/dhtml/examples/DOMmenu2.html) med en bättre hantering för att hitta aktuell meny.)

Permalänk: https://www.webforum.nu/p/1325871

## #3 — nordan, 2004-04-18T20:45Z

Tack för svaret Jojoxx, men jag får ett felmedelade när jag lägger in den nya funktionen.
Någon som vet vad det är för fel?
Bifogar bild

Bilagor:

- [erre.gif](https://www.webforum.nu/a/3305.gif)

Permalänk: https://www.webforum.nu/p/1326229

## #4 — Peter S, 2004-04-18T20:52Z

Kan du bifoga din nuvarande kod (liknande ditt första inlägg) blir det enklare att felsöka.

 :)

Permalänk: https://www.webforum.nu/p/1326246

## #5 — nordan, 2004-04-18T21:00Z

Här är koden

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <script language="JavaScript">
var compressedMode = false;
var collapseMode = false;

function initMenu()
{
	if(!document.getElementById)
	{ 
		return ;
	}
	var current=document.getElementById('menuroot').firstChild;
	while(current)
	{
		if(current.className=="menu")
		{ 
			collapseAll(current); 
		}
		current=current.nextSibling;
	}
}
function findLink(url){
	var allLinks=new Array(); 
	allLinks=getAllChildsByTagName(document.getElementById('menuroot'),'a');
	var match=false;
	for(var i in allLinks){
		if(allLinks[i].href.toLowerCase().right(url.length)==url.toLowerCase()){
			match=allLinks[i];
			break;
		}
	}
	if(match){
		initMenu();
		while(match=match.parentNode){
			if(match.className=="menu"){
				match.style.display="block";
				var li=getAllChildsByTagName(match,"a");
				if(li[0].innerHTML.match(/^(\+|\-)/)){
					li[0].innerHTML="-"+li[0].innerHTML.substring(1);
				}
			}
		}
	}
}
String.prototype.right = function(len){ return this.substring(this.length-len); }
function collapseAll(element)
{
	if(!document.getElementById)
	{ 
		return 
	}
	menues=getAllChildsByTagName(element,"div");
	for(var i in menues)
	{
		menues[i].style.display="none";
		if(getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML.match(/^(\+|\-)/))
		{
			getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML="+"+getPreviousSiblingByClassName(menues[i],"menuChoice").innerHTML.substring(1);
		}
	}
	element.style.display="none";
}
function getAllChildsByTagName(element,tagname)
{
	var parents=new Array(); 
	var elements=new Array(); 
	var current;
	parents[0]=element;
	for(var i in parents)
	{
		current=parents[i].firstChild;
		while(current)
		{
			if(current.hasChildNodes)
			{ 
			    parents[parents.length]=current;
    		}
			if(current.tagName==tagname.toUpperCase())
			{
				elements[elements.length]=current;
			}
			current=current.nextSibling;
		}
	}
	return elements;
}
function getPreviousSiblingByClassName(element,classname)
{
	while(element.previousSibling)
	{
		if(element.previousSibling.className==classname)
		{ 
			return element.previousSibling; 
		}
		element=element.previousSibling;
	}
	return false;
}
function sw(mnu,li)
{
	if(!document.getElementById)
	{ 
		return false; 
	}
	if(document.getElementById(mnu).style.display=='block')
	{
		if(collapseMode)
		{
			collapseAll(document.getElementById(mnu));
		} 
		else 
		{
			document.getElementById(mnu).style.display='none';
		}
	} 
	else 
	{
		if(document.getElementById(mnu).parentNode.className=="menu" && compressedMode)
		{
			collapseAll(document.getElementById(mnu).parentNode);
			document.getElementById(mnu).parentNode.style.display="block";
		}
		document.getElementById(mnu).style.display="block";
	
	}
	if(li.innerHTML.match(/^(\+|\-)/))
	{
		li.innerHTML=(document.getElementById(mnu).style.display == 'none')?"+"+li.innerHTML.substring(1):"-"+li.innerHTML.substring(1);
	}
	return false;
}

</script>
</head>

<body onLoad="initMenu();findLink(location.href);">
<p> </p>
<p> </p>
<div id="menuroot" class="menu">
		<a href="#" onClick="return sw('menu_0',this);" class="menuChoice">+Heavy Music</a><br>
	<div id="menu_0" class="menu">
		<table border="0" cellspacing="0" cellpadding="0" width="100%">

                <tr><td > ---<a href="nasta.php?prodid=3&a=menu_1" class="menuProdukt">Metallica</a></td></tr>
                <tr><td > ---<a href="nasta.php?prodid=4&a=menu_2" class="menuProdukt">Iron Maiden</a></td></tr>
                <tr><td > ---<a href="nasta.php?prodid=6&a=menu_3" class="menuProdukt">Ozzy</a></td></tr>
                 <tr><td > </td>
            </tr>
                <tr><td > </td>
                </tr>
        </table>

	</div> 
	
	
	       </div>	 

</body>
</html>
```

 :)

Permalänk: https://www.webforum.nu/p/1326254

## #6 — Peter S, 2004-04-18T21:13Z

Hm, den koden fungerar för mig. Har du testat Johans [uppdatering](http://www.webforum.nu/showthread.php?s=&postid=834399#post834399)?

 :)

Permalänk: https://www.webforum.nu/p/1326262

## #7 — nordan, 2004-04-18T21:25Z

Japp
Jag har bytit ut function findLink() till den som Jojoxx har lagt in här  :q

RED:
Nu funkar det 
Tack för hjälpen :bire  :birp

Permalänk: https://www.webforum.nu/p/1326267

## #8 — nordan, 2004-04-24T10:51Z

Jag måste fråga en fråga till 
om jag lägger till en till variabel i URL så funkar inte meny igen \*pust\* 
Funkar

```
music.php?katid=3&a=menu_1
```

Funkar inte

```
music.php?page=2&katid=3&a=menu_1
```

Menyn åker ihop

 :)

Permalänk: https://www.webforum.nu/p/1329960

## #9 — nordan, 2004-04-25T09:01Z

någon som vet? :)

Permalänk: https://www.webforum.nu/p/1330279

## #10 — Peter S, 2004-04-25T12:11Z

Fungerar för mig. [Exempel](http://member.webforum.nu/Peter%20S/nordan.html).

 :)

Permalänk: https://www.webforum.nu/p/1330339

## #11 — nordan, 2004-04-27T08:59Z

Den funkar inte för mig iaf. Och min meny ligger inte i en html sida uta i en php sida med pageing. Det är inte föns den kommer på andra sidan som den inte fäller ut eller om man lägger in alert i javascriptet så är det så att den snurar två gånger på förstasidan. Asså känner av vilken meny som skall vara öppen och sen stänger den och öppnar igen. Går man in på page 2 som har samma javascript så snurrar den bara en gång.
Den avbryter asså efter att den har sagit ihop meny förstagången vilket jag inte vill att den skall göra.

Permalänk: https://www.webforum.nu/p/1334206

## #12 — Peter S, 2004-04-27T09:26Z

Ny version av findLink():

```
function findLink(url){
	var allLinks=new Array(); 
	allLinks=getAllChildsByTagName(document.getElementById('menuroot'),'a');
	var match=false;
	for(var i in allLinks){
		if(allLinks[i].href.toLowerCase().split(/page=\d+&/).join('').right(url.length)==url.toLowerCase().split(/page=\d+&/).join('')){
			match=allLinks[i];
			break;
		}
	}
	if(match){
		initMenu();
		while(match=match.parentNode){
			if(match.className=="menu"){
				match.style.display="block";
				var li=getAllChildsByTagName(match,"a");
				if(li[0].innerHTML.match(/^(\+|\-)/)){
					li[0].innerHTML="-"+li[0].innerHTML.substring(1);
				}
			}
		}
	}
}
```

 :)

Permalänk: https://www.webforum.nu/p/1334219

## #13 — nordan, 2004-04-27T15:22Z

Nu verkar det faktist funka igen :) 
Så "felet" låg i koden:

```
if(allLinks[i].href.toLowerCase().split(/page=\d+&/).join('').right(url.length)==url.toLowerCase().split(/page=\d+&/).join('')){
			match=allLinks[i];
			break;
		}
```

Det är väll inte ett fel men det funka ju inte med min paging.
Skall det funka utan att man måste lägga till den där ifen med split(/page) m.m.

Tack för hjälpen!

Permalänk: https://www.webforum.nu/p/1334465

## #14 — nordan, 2004-04-27T15:35Z

Kom på en annan fråga gällade scriptet går det att få till så att det inte syns när menyrena håller på att ställas in? Nu så hoppar den till och öppnar allt innan den stänger och hittar rätt  :)

Permalänk: https://www.webforum.nu/p/1334475

---

Tråden på webben: https://www.webforum.nu/amne/javascript/101753-lånat-menyscript-har-gått-sönder
