Display = block probléma Javascriptben
Üdv Mindenkinek,
van egy menü, aminek bizonyos elmei rendeleréskor rejtve vannak, majd ezeket javascripttel szeretném megjeleníteni:
HMTL forrás:CSS forrás:Javascript ami végzi a megjelenítést és az elrejtést:Az megjelenítés és az elrejtés működik első alkalommal, utána már sajnos nem jeleníti meg az elemet, pedig FireBug szerint lefut az e[i].style.display = 'block' utasítás a megfelelő elemen, csak a böngészőben nem látszik.
Nem látom a hibát, pedig csináltam már egy 10 perces szünetet is, hátha... :)
Remélem vki tud segíteni, mert én már nem látom a fától az erdőt
Köszönöm
Üdvözlettel
bsanyi
UI: a change_v_status és displayOut eljárásoknak elvileg nincs befolyása az áltam problémásan működő részletre (szerintem), bár azok is megjelenítést szabályozzák, de egyel feljebb levő szintem, ahol probléma nélkül futnak
■ van egy menü, aminek bizonyos elmei rendeleréskor rejtve vannak, majd ezeket javascripttel szeretném megjeleníteni:
HMTL forrás:
<div id="h_nsk" onMouseOver="change_v_status('h_nsk', true)" onMouseOut="delayOut();">
<ul class="ul_gesundheit">
<li><a href="nahrstoffkunde.php?id=2" title="Aminosäuren" >Aminosäuren</a></li>
<li><a class="subelement" href="nahrstoffkunde.php?id=3" title="Ballaststoffe" >Ballaststoffe</a>
<ul class="submenu">
<li><a class="subelement" href="nahrstoffkunde.php?id=4" title="Mineralstoffe" >Mineralstoffe</a></li>
</ul>
</li>
</ul>
</div>
.submenu {
margin: 0px;
margin-left: 10px;
padding: 0px;
display: none;
}
.submenu li {
list-style-type: none;
}
var globalID = 0;
function delayOut() {
globalID = setTimeout('closeall()', 1000);
}
function closeall() {
var z = new Array ('h_ges','h_nsk');
/* alert(temp + ' : ' + x[i].className);*/
for (var j=0;j<z.length;j++) {
var x = document.getElementById(z[j]);
x.style.display = 'none';
}
return true;
}
function change_v_status (name, display) {
var x = document.getElementById(name);
if (x != null) {
var z = x.style;
closeall();
if (display == true) {
if (globalID > 0) {
clearTimeout(globalID);
globalID = 0;
}
z.display = 'block'
} else {
z.display = 'none';
}
}
}
function addEvent(obj, evType, fn) {
if (obj.addEventListener) {
obj.addEventListener(evType, fn, false);
return true;
} else if (obj.attachEvent) {
var r = obj.attachEvent("on"+evType, fn);
return r;
} else {
return false;
}
}
function removeEvent(obj, evType, fn) {
if (obj.removeEventListener) {
obj.removeEventListener(evType, fn, false);
return true;
} else if (obj.detachEvent) {
var r = obj.detachEvent("on"+evType, fn);
return r;
} else {
return false;
}
}
function displaySubMenu(evt_) {
evt_ || (evt_ = window.event);
if( evt_.srcElement ) evt = evt_.srcElement;
else if( evt_.target ) evt = evt_.target;
//alert(evt.tagName);
e = evt.parentNode.getElementsByTagName('UL');
for(var i=0; i<e.length; i++) {
if (e[i].className == 'submenu') {
e[i].style.display = 'block';
}
}
}
function hideSubMenu(evt_) {
evt_ || (evt_ = window.event);
if( evt_.srcElement ) evt = evt_.srcElement;
else if( evt_.target ) evt = evt_.target;
evt.style.display = 'none';
}
function setSubelements() {
//body init() eljárásban lefut
var elements = document.getElementById('h_nsk').getElementsByTagName('UL');
for(var j=0; j<elements.length; j++ )
if (elements[j].className == 'submenu') {
//mindig csak a megjelenített almenünek van submenu classa
//alert(elements[j].parentNode.tagName);
addEvent(elements[j].parentNode.getElementsByTagName('A')[0],'mouseover',displaySubMenu);
//a szülő elem (LI) és annak az első eleme (A), amihez kell
addEvent(elements[j], 'mouseout', hideSubMenu)
//magára a megjelenített elemre is kell egy elrejtés
}
}
function init() {
setSubelements();
}
Nem látom a hibát, pedig csináltam már egy 10 perces szünetet is, hátha... :)
Remélem vki tud segíteni, mert én már nem látom a fától az erdőt
Köszönöm
Üdvözlettel
bsanyi
UI: a change_v_status és displayOut eljárásoknak elvileg nincs befolyása az áltam problémásan működő részletre (szerintem), bár azok is megjelenítést szabályozzák, de egyel feljebb levő szintem, ahol probléma nélkül futnak
Sejtés
Idézem Thomas Fuchs barátunkat:
Browser can't determine the original (built-in)
display value of an element (like "block" for DIVs,
and "inline" for SPANs)
Use the style attribute instead:
Probléma forrása
egy kicsit kutatkodtam a console.log segítségével az eseményvezérlésben és arra jöttem rá, hogy hiába az UL elemnek adom meg az onmouseout eseményt, akkor is már a legalsó li->a elem esetében is végrehajtódik az onmouseout esemény.
A számomra furcsa viselkedés, akkor vált gyanússá, amikor két elemet is tartalmazott az class=submenu UL elem, mert ilyenkor már az első LI elemben szereplő A elem egérrel való elhagyásánál is lefutott a hideSubMenu eljárás.
Ennek az eljárásnak, pedig csak akkor kellett volna lefutni, ha az elem UL class=submenu.
Fel tudna vki világosítani, hogy ez miért történik? Feltételezem az esemény át lesz adva az összes UL class=submenu elem alatti elemnek, de miért?
Köszi
Üdv
bSanyi