ugrás a tartalomhoz

Menü kiakad

gtoma · 2011. Ápr. 15. (P), 08.36
Sziasztok!

Van egy js menü megjelenítőm. Nagyon jól működik, de sajnos időnként "fennakad".

Mit értek ez alatt?
Az ember megnyitja a menüt, majd gyorsan alt tabol, vagy másik fülre megy át, akkor NÉHA kinyílva marad a menü, és csak akkor csukódik be, ha fölé visszük az egeret.

Gondolom, hogy ez valamifajta böngésző probléma, de tud valaki olyan eseményt ami akkor aktiválódik, mikor "elveszti a fókuszt" az adott ablak? :D

Előre is köszönöm az 5letet!

íme a kód:

var mcMenu=function(){
	var relAttrib=30,x=100,t=30,z=50,s=6,a;
	function dd(n){this.n=n;this.h=[];this.c=[]}
        dd.prototype.init=function(p,c){
		a=c;var w=document.getElementById(p), s=w.getElementsByTagName('ul'), i=0, x=w.getElementsByTagName('li'), xl=x.length;
                for(i=0;i<xl;i++) {
                    var xxc = x[i].childNodes, xxl=xxc.length, ulvan = '';
                    for(xxi=0;xxi<xxl;xxi++) {if(xxc[xxi].tagName == 'UL' || xxc[xxi].tagName == 'ul') {ulvan = xxc[xxi];}}
                    var h=x[i];this.h[i]=h;
                    if( ulvan != '' ) {
                        this.c[i]=ulvan;
                        h.onmouseover=new Function(this.n+'.st('+i+',true)');
			h.onmouseout=new Function(this.n+'.st('+i+')');
                        //b = document.getElementsByTagName('body').item(0);
                        //b.onmouseout = new Function(this.n+'.st('+i+')');
                        //alert('-'+b);
			ulvan.setAttribute('rel', '0');
                    } else {
                        //alert('LI');
                        this.c[i]=x[i];
                        h.onmouseover=new Function(this.n+'.sx('+i+',true)');
			h.onmouseout=new Function(this.n+'.sx('+i+')');
                    }
                }
	}
	dd.prototype.st=function(x,f){
                //var c=this.c[x], h=this.h[x], li=c.parentNode, li2=h.getElementsByTagName('a')[0];
                var c=this.c[x], h=this.h[x], li=c.parentNode, li2 = li.childNodes[0];
		clearInterval(c.t);
		if(f){
                    if( !String(li.className).toLowerCase().match(a)) {li.className+=' '+a;}
                    if( !String(li2.className).toLowerCase().match(a)) {li2.className+=' '+a;}
                    if(!c.mh){c.style.display='block';c.style.height='';c.mh=c.offsetHeight;c.style.height=0;}
                    if(c.mh==c.offsetHeight){c.style.overflow='visible';c.setAttribute('rel', relAttrib);}
                    else{c.style.zIndex='100';c.t=setInterval(function(){sl(c,1)},t)}
		}else{c.style.zIndex='50';c.t=setInterval(function(){sl(c,-1)},t)}
        }
        dd.prototype.sx=function(x,f){
            //var c=this.c[x], h=this.h[x], li=c, li2=c.getElementsByTagName('a')[0];
            var c=this.c[x], h=this.h[x], li=c, li2 = c.childNodes[0];
            clearInterval(c.t);
            if(f){li.className+=' '+a;li2.className+=' '+a;}
                else {li.className=li.className.replace(a,'');li2.className=li2.className.replace(a,'');}
        }
	function sl(c,f){
		var h=c.offsetHeight;
		if((h<=0&&f!=1)||(h>=c.mh&&f==1)){
                    if(f==1){
                            c.style.filter='';c.style.opacity=1;c.style.overflow='visible';
                            c.setAttribute('rel', relAttrib);
                    } else {
                        //x = c.parentNode; xa = x.getElementsByTagName('a')[0];
                        x = c.parentNode;xa = x.childNodes[0];
                        x.className=x.className.replace(a,'');xa.className=xa.className.replace(a,'');
                    }
                    clearInterval(c.t);return
		}
		var relAttribute = c.getAttribute('rel');
		relAttribute = parseInt(relAttribute);
		if( (relAttribute == 0) && (f==1) ) {
                    parentZar(c);
                    c.style.paddingTop = '';c.style.paddingBottom = '';
                }
		if(relAttribute <= 0 || f==1) {
                        if(f!=1) {c.style.paddingTop = '0px';c.style.paddingBottom = '0px';c.style.zIndex='0';}
			c.style.overflow='hidden';
			var d = (f==1) ? Math.ceil( (c.mh-h)/s ) : Math.ceil(h/s), o=h/c.mh;
			c.style.height=h+(d*f)+'px';
			c.style.opacity=o;
                        c.style.filter='alpha(opacity='+(o*100)+')';
		} else if(f!=1) {
			relAttribute--;
			c.setAttribute('rel', relAttribute);
		}
	}
	function parentZar(c) {
		parentem = c.parentNode.parentNode;
		ss=parentem.getElementsByTagName('ul');ll=ss.length;i=0;
		for(i;i<ll;i++){
                    hh=ss[i];
                    relAttribute = hh.getAttribute('rel');
                    hh.setAttribute('rel', '0');
                    hh.style.height='0px';
                    hh.style.opacity='0';
                    hh.style.filter='alpha(opacity=0)';
		}
	}
	return{dd:dd}
}();
 
1

timer

ironwill · 2011. Ápr. 15. (P), 10.08
Egy időzítőt szoktak erre a célra beállítani, hogy egy idő tüntesse el a még látszódó almenüket.

Most nem tudok kódot mutatni, de hirtelen ezt találtam: http://javascript-array.com/scripts/simple_drop_down_menu/
2

Az van.

gtoma · 2011. Ápr. 18. (H), 14.35
Timer van benne. Pont az a lényeg, hogy az LEÁLL! :)

c.t=setInterval(function(){sl(c,1)},t)
3

clearInterval

Poetro · 2011. Ápr. 18. (H), 15.16
A clearInterval-lal pedig törlésre kerül.
4

az más

ironwill · 2011. Ápr. 18. (H), 17.50
Idő hiányában nem néztem át a kódot. Az én saram.

OFF: De, ha tudod, hogy mi a gond, akkor miért nem úgy teszed fel a kérdést?