Browser kommt ins Stocken
bueli
- javascript
<SCRIPT language="JavaScript"><!--
menulayer=new Array()
menulayer[0]="menu1"
menulayer[1]="menu2"
menulayer[2]="menu3"
menulayer[3]="menu4"
v4=(parseInt(navigator.appVersion)>=4 && parseInt(navigator.appVersion)<=5)?1:0
ie=(document.all && v4)?1:0
ns=(document.layers && v4)?1:0
function showmenu(thelayer){
keep=thelayer; hideall(); showitnow=1
showit(thelayer)
}
function showit(thelayer){
if(ie){ eval(menulayer[thelayer]+'.style.visibility="visible"') }
if(ns){ eval('document.'+menulayer[thelayer]+'.visibility="show"');}
}
function hidemenu(){
keep=-1; setTimeout('hideall()',500)
}
keep=-1
function hideall(){
for(i=0;i<menulayer.length;i++){
hideit=0; checkmousepos(i)
if(ie && keep!=i){
if(hideit){ eval(menulayer[i]+'.style.visibility="hidden"') }
}
if(ns && keep!=i){
if(hideit){ eval('document.'+menulayer[i]+'.visibility="hide"') }
}
}
}
document.onmousemove = getmousepos
if (ns) document.captureEvents(Event.MOUSEMOVE)
function getmousepos(e){
if(ns){mousex=e.pageX; mousey=e.pageY}
if(ie){mousex=event.clientX; mousey=event.clientY;}
}
function checkmousepos(i){
if(ns){
x_min=eval('document.'+menulayer[i]+'.left')
x_max=x_min+eval('document.'+menulayer[i]+'.clip.width')
y_min=eval('document.'+menulayer[i]+'.top')
y_max=y_min+eval('document.'+menulayer[i]+'.clip.height')
}
if(ie){
x_min=eval(menulayer[i]+'.style.pixelLeft')
x_max=x_min+eval(menulayer[i]+'.scrollWidth')
y_min=eval(menulayer[i]+'.style.pixelTop')
y_max=y_min+eval(menulayer[i]+'.scrollHeight')
}
if (mousex>=x_min && mousex<=x_max && mousey>=y_min && mousey<=y_max){
hideit=0; setTimeout('hideall()',500)
}
else { hideit=1 }
return hideit
}
//--></SCRIPT>
Habe mit Hilfe dieses Scripts eine Art Dropdownmenü gebastelt, aber wenn man den Mauszeiger innerhalb des Menulayers hin und her bewegt, ist der Browser mit der Zeit überfordert und kackt irgendwann ganz ab. Kann man das irgendwie optimieren?
Danke und Gruß
bueli
<SCRIPT language="JavaScript"><!--
menulayer=new Array()
menulayer[0]="menu1"
menulayer[1]="menu2"
menulayer[2]="menu3"
menulayer[3]="menu4"v4=(parseInt(navigator.appVersion)>=4 && parseInt(navigator.appVersion)<=5)?1:0
ie=(document.all && v4)?1:0
ns=(document.layers && v4)?1:0
Es gibt nur zwei Browser?
function showmenu(thelayer){
keep=thelayer; hideall(); showitnow=1
showit(thelayer)
}function showit(thelayer){
if(ie){ eval(menulayer[thelayer]+'.style.visibility="visible"') }
if(ns){ eval('document.'+menulayer[thelayer]+'.visibility="show"');}
}
Ahh, wenn ich sowas sehe..
wo kommt denn dieser eval Mist her?
if(ie){ document.menulayer[thelayer].style.visibility="visible"}
else if(ns){ document.menulayer[thelayer].visibility="show";}
function hidemenu(){
keep=-1; setTimeout('hideall()',500)
}keep=-1
function hideall(){
for(i=0;i<menulayer.length;i++){
hideit=0; checkmousepos(i)
if(ie && keep!=i){
if(hideit){ eval(menulayer[i]+'.style.visibility="hidden"') }
}
if(ns && keep!=i){
if(hideit){ eval('document.'+menulayer[i]+'.visibility="hide"') }
}
}
}document.onmousemove = getmousepos
if (ns) document.captureEvents(Event.MOUSEMOVE)function getmousepos(e){
if(ns){mousex=e.pageX; mousey=e.pageY}
if(ie){mousex=event.clientX; mousey=event.clientY;}
}function checkmousepos(i){
if(ns){
x_min=eval('document.'+menulayer[i]+'.left')
x_max=x_min+eval('document.'+menulayer[i]+'.clip.width')
y_min=eval('document.'+menulayer[i]+'.top')
y_max=y_min+eval('document.'+menulayer[i]+'.clip.height')
}
if(ie){
x_min=eval(menulayer[i]+'.style.pixelLeft')
x_max=x_min+eval(menulayer[i]+'.scrollWidth')
y_min=eval(menulayer[i]+'.style.pixelTop')
y_max=y_min+eval(menulayer[i]+'.scrollHeight')
}
if (mousex>=x_min && mousex<=x_max && mousey>=y_min && mousey<=y_max){
hideit=0; setTimeout('hideall()',500)
}
else { hideit=1 }
return hideit
}//--></SCRIPT>
Habe mit Hilfe dieses Scripts eine Art Dropdownmenü gebastelt, aber wenn man den Mauszeiger innerhalb des Menulayers hin und her bewegt, ist der Browser mit der Zeit überfordert und kackt irgendwann ganz ab. Kann man das irgendwie optimieren?
Ja, schmeiss die eval raus und kuck mal nach ner dHTML Bibliothek.
Aber der aus dem code ist nicht ersichtlich warum der Browser überfordert ist (obwohl Netscape mit eval prinzipiell zu Abstürzen neigt, aber davon sprachst du jan icht)
Struppi.
Es gibt nur zwei Browser?
ich weiß, im moment nur 2
if(ie){ document.menulayer[thelayer].style.visibility="visible"}
else if(ns){ document.menulayer[thelayer].visibility="show";}
da sagr er: document.menulayer is not an object.
soll ich alle eval rausnehmen?
Es gibt nur zwei Browser?
ich weiß, im moment nur 2
if(ie){ document.menulayer[thelayer].style.visibility="visible"}
else if(ns){ document.menulayer[thelayer].visibility="show";}da sagr er: document.menulayer is not an object.
soll ich alle eval rausnehmen?
eigentlich schon. aber in deinem Fall ist es komplizierter. Aus irgendeinem Grund speicherst du die MenuID's in einem array als Stringparameter ab.
menulayer=new Array()
menulayer[0]="menu1"
menulayer[1]="menu2"
menulayer[2]="menu3"
menulayer[3]="menu4"
um diese dann indirekt anzusprechen:
document.menulayer[thelayer].style.visibility="visible"
Das müßte eigenlich
document.all['menu' + thelayer].style.visibility="visible"
bzw.
document.layers['menu' + thelayer].style.visibility="visible"
heißen
(und zusätzlich: document.getElementById('menu' + thelayer).style.visibility="visible")
Struppi.