Jesper TMedlem sedan nov. 20017 144 inlägg 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 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" :)
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 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 Får inte till det: "id" är null eller inte ett objekt.
pekar på denna rad: if (els*.id.indexOf("bar")==0)*
Kommentaren har tagits bort!
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
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 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 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.
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
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