webForumDet fria alternativet

Array?

12 svar · 326 visningar · startad av Jesper T

Jesper TMedlem sedan nov. 20017 144 inlägg
#1

Kan man på någe vis slippa deklarera alla "undermenyer" i "menues" (se fetmarkering).

<script language="JavaScript">
var currentMenu=false;
var menues=new Array([b]'sub1','sub2','sub3'[/b]);
function sw(mnu,mode){
	if(mode){
		if(currentMenu){
			if(currentMenu==mnu){changeStyle(mnu,'display','none');currentMenu=false;}else{changeStyle(currentMenu,'display','none');changeStyle(mnu,'display','block');currentMenu=mnu;}
		} else {
			changeStyle(mnu,'display','block');currentMenu=mnu;
		}
	} else if (document.getElementById) {
		document.getElementById(mnu).style.display=(document.getElementById(mnu).style.display=='block')?'none':'block';
	}
}
function changeStyle(Id,Property,Value){
	if (document.all){
		eval('document.all[Id].style.'+Property+'="'+Value+'"');
	} else if (document.layers){
		eval('document.layers[Id].'+Property+'="'+Value+'"');
	} else if (document.getElementById){
		eval('document.getElementById(Id).style.'+Property+'="'+Value+'"');
	}
}
function initmenu(){
	for(var n=0;n<menues.length;n++){
		changeStyle(menues[n],'display','none');
	}
}
</script>
dectgapMedlem sedan sep. 20021 655 inlägg
#2

Eftersom jag inte vet hur html-koden för menyn ser ut kan det inte bli någon definitiv lösning, men titta på getElementsByTagName() och/eller childNodes, kanske i kombination med andra DOM-metoder.

Förresten: "menus", inte "menues" :)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#3

Så här kan det se ut...

 
function initmenu(){
	var els = document.getElementsByTagName("*");
	for(i in els){
		if (els[i].id.indexOf("sub")==0)
			changeStyle(els[i].id,'display','none');
	}
}

... förutsatt att alla menyers id börjar på sub.

Jesper TMedlem sedan nov. 20017 144 inlägg
#4

Kommer här:

<head>
<script>

var currentMenu=false;

function sw(mnu,mode){
	if(mode){
		if(currentMenu){
 			if(currentMenu==mnu){
			changeStyle(mnu,'display','none');
			currentMenu=false;}else{changeStyle(currentMenu,'display','none');
			changeStyle(mnu,'display','block');currentMenu=mnu;}
		} else {
			changeStyle(mnu,'display','block');currentMenu=mnu;
		}
	} else if (document.getElementById) {
		document.getElementById(mnu).style.display=(document.getElementById(mnu).style.display=='block')?'none':'block';
	}
}
function changeStyle(Id,Property,Value){
	if (document.all){
		eval('document.all[Id].style.'+Property+'="'+Value+'"');
	} else if (document.layers){
		eval('document.layers[Id].'+Property+'="'+Value+'"');
	} else if (document.getElementById){
		eval('document.getElementById(Id).style.'+Property+'="'+Value+'"');
	}
}

function initmenu(){
	var els = document.getElementsByTagName("*");
	for(i in els){
		if (els[i].id.indexOf("bar")==0)
			changeStyle(els[i].id,'display','none');
	}
}

</script>

</head>
<body onload="initmenu()">

<a href="#" onclick="show('bar1',false)">A</a>
<a href="#" onclick="show('bar2',false)">1</a>
<a href="#" onclick="show('bar3',false)">B</a>
<a href="#" onclick="show('bar4',false)">2</a>
<a href="#" onclick="show('bar5',false)">3</a>

<div id="bar1" style="top:50px;">A</div>
<div id="bar2" style="top:100px;">1</div>
<div id="bar3" style="top:150px;">B</div>
<div id="bar4" style="top:200px;">2</div>
<div id="bar5" style="top:250px;">3</div>

</body>
Jesper TMedlem sedan nov. 20017 144 inlägg
#5

Får inte till det: "id" är null eller inte ett objekt.
pekar på denna rad: if (els*.id.indexOf("bar")==0)*

nitro2k01Medlem sedan aug. 20039 342 inlägg
#6

Kommentaren har tagits bort!

nitro2k01Medlem sedan aug. 20039 342 inlägg
#7

Sorry... Pröva:

 
function initmenu(){
	var els = document.getElementsByTagName("*");
	for(i=0;i<els.length;i++){
		if (els[i].id.indexOf("sub")==0)
			changeStyle(els[i].id,'display','none');
	}
}
dectgapMedlem sedan sep. 20021 655 inlägg
#8

Jesper T skrev:

Får inte till det: "id" är null eller inte ett objekt.
pekar på denna rad: if (els*.id.indexOf("bar")==0)*

Det beror på att inte alla element har ett id.
Ändra till:

function initmenu(){
	var els = document.getElementsByTagName("*");
	for(i in els){
		if (els[i].id && els[i].id.indexOf("bar")==0)
			changeStyle(els[i].id,'display','none');
	}
}
Jesper TMedlem sedan nov. 20017 144 inlägg
#9

nitro2k01 skrev:

Två likadana lösningar... Det kan ju inte vara annat än rätt :)

?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#10

Jesper T skrev:

nitro2k01 skrev:

Två likadana lösningar... Det kan ju inte vara annat än rätt :)

?

Jag såg inte att det var du liksom... Sorry.

Jesper TMedlem sedan nov. 20017 144 inlägg
#11

Tack båda, det fixade sig!
Dock lade jag till denna:

function initmenu(){
	var els = [b](document.all) ? document.all :[/b] document.getElementsByTagName("*");
	for(i in els){
		if (els[i].id && els[i].id.indexOf("bar")==0)
			changeStyle(els[i].id,'display','none');
	}
}

Om det gör ngn skillnad.
Funkar nu i:
Opera 7.23
Mozilla Firefox/0.8
I.E. 6.0

Skulle vara kul om det funkar i tidigare versioner.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#12

dectgap skrev:

Jesper T skrev:

Får inte till det: "id" är null eller inte ett objekt.
pekar på denna rad: if (els*.id.indexOf("bar")==0)*

Det beror på att inte alla element har ett id.
Ändra till:

function initmenu(){
	var els = document.getElementsByTagName("*");
	for(i in els){
		if (els[i].id && els[i].id.indexOf("bar")==0)
			changeStyle(els[i].id,'display','none');
	}
}

Jo dectgap, alla element har ett id, dock har vissa element ett tomt id, som body och html i de flesta (eller kanske alla) fall.
Jag tror snarare att det var konstruktionen for(i in els) som krånglade.
Och Jesper, jag tror inte att din variant funkar riktigt i Netscape/Mozilla.

dectgapMedlem sedan sep. 20021 655 inlägg
#13

nitro2k01 skrev:

Jo dectgap, alla element har ett id, dock har vissa element ett tomt id, som body och html i de flesta (eller kanske alla) fall.

Helt rätt - det var jag som hade fel.
Att så är fallet kan testat genom följande enkla kod:

<button onclick="alert(typeof this.id)">Exempel</button>

I vilket fall som helst blev det ändå fel när man försökte använda indexOf() på ett tomt id.

nitro2k01 skrev:

Jag tror snarare att det var konstruktionen for(i in els) som krånglade.
Och Jesper, jag tror inte att din variant funkar riktigt i Netscape/Mozilla.

Det gör den.
Enkelt exempel:

<script type="text/javascript">
function initmenu(){
	var els = document.all || document.getElementsByTagName("*");
	for(x in els){
		if (els[x].id && els[x].id.indexOf("bar")==0)
			els[x].style.display = "none";
	}
}
window.onload=initmenu;
</script>

<div id="xxx">Kommer att visas.</div>
<div id="bar">Kommer att döljas.</div>
<div>Kommer att visas.</div>

for ... in fungerar för objekt, och en array är också en typ av objekt:
http://devedge.netscape.com/library/manuals/2000/javascript/1.5/reference/stmt.html#1004815
http://devedge.netscape.com/library/manuals/2000/javascript/1.5/reference/array.html#1193137

133 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)