Avatar billede boomshanka Nybegynder
27. oktober 2005 - 22:56 Der er 2 kommentarer og
1 løsning

Hvordan kan man fravælge DIV-nedarv?

Hej alle,

Det er meget muligt det ikke kan lade sig gøre, men nu prøver jeg alligevel. Jeg har lavet et (meget) beskidt lille HTML-eksempel for at understøtte mit spørgsmål:

<div style="width:50px;background-color:red" onMouseOver="alert('red')">
    <div style="width:20px;background-color:blue" onMouseOver="alert('blue')"></div>
</div>

Hvis jeg fører musen over det røde område, så siger prompten rigtig nok "red". Men når jeg har musen over det blå område, så siger prompten både "blue" og "red". Det er indlysende, idet DIV-taggene ligger inde i hinanden, men hvad gør man hvis man KUN vil have "blue" frem? Er der en måde hvormed man kan skrive HTML-koden som ovenstående, men samtidig ignorere nedarvning?
Avatar billede Slater Ekspert
28. oktober 2005 - 00:00 #1
Du kan bruge cancelBubble - fx sådan her:

<div style="width:50px;background-color:red;" onMouseOver="alert('red')">
    <div style="width:20px;background-color:blue;" onMouseOver="alert('blue');event.cancelBubble=true;"></div>
</div>

Den virker i alle de browsere jeg har (IE, Opera, Firefox)
Avatar billede boomshanka Nybegynder
28. oktober 2005 - 16:15 #2
Det er okay - eksemplet var vist lidt for enkelt i forhold til hvad jeg ville lave, men dit eksempel virkede, så du får pointene :-)

Hele eksemplet ser sådan ud:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>menu_test</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
<style type="text/css">
#navigation {
    font-family:Verdana, Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-style: normal;
    font-weight: normal;
    color: white;
    background-color:blue;
    width:171px;
    padding-top:10px;
    padding-bottom:10px;
    text-align: left;
    cursor:pointer;
}
#navigation div {
    width:161px;
    padding-top:5px;
    padding-bottom:5px;
    margin-left:10px;
}
#navigation a {
    text-decoration:none;
    color:white;
    cursor:hand;
}
#navigation .hidden {
    display:none;
}
#navigation .visible {
    display:block;
}
#navigation .active {
    background-color:green;
}
#navigation .inactive {
    background-color:blue;
}
#navigation #submenu {
    background-color:blue;
    width:171px;
    position:absolute;
    left:168px;
    border:1px solid black;
}
#navigation .nested {
    background-image:url('arrow.gif');
    background-position:right;
    background-repeat:no-repeat;
}
</style>
<script type="text/javascript">
function showChildren(node) {
    var subnodes = node.getElementsByTagName('div');
    if(subnodes.length > 0 && node.href == null)
        node.className = "active nested";
    else
        node.className = "active";
    for(i = 0; i < subnodes.length; i++) {
        subnodes[i].className = "visible";
    }
}
function hideChildren(node) {
    var subnodes = node.getElementsByTagName('div');
    if(subnodes.length > 0 && node.href == null)
        node.className = "inactive nested";
    else
        node.className = "inactive";
    for(i = 0; i < subnodes.length; i++) {
        subnodes[i].className = "hidden";
    }
}
</script>
</head>
<body>
<div id="navigation">
    <div onMouseOver="showChildren(this)" onMouseOut="hideChildren(this)" class="nested">Parent
        <div id="submenu" class="visible">
            <div onMouseOver="showChildren(this)" onMouseOut="hideChildren(this)" class=""><a href="#">Child 1.1</div></a>
            <div onMouseOver="showChildren(this)" onMouseOut="hideChildren(this)" class=""><a href="#">Child 1.2</div></a>
        </div>
    </div>
</div>
</body>
</html>

Problemet opstår i Mozilla, hvis man fører musen over enten "Child 1.1" eller "Child 1.2" - baggrundsfarven ændre sig på "Parent" og ikke på den Child man peger på.
Avatar billede Slater Ekspert
29. oktober 2005 - 14:15 #3
Ja, det er et bubbling problem du har.
Hvis du skriver

<div onMouseOver="showChildren(this);event.cancelBubble=true;" onMouseOut="hideChildren(this" class=""><a href="#">Child 1.1</div></a>
            <div onMouseOver="showChildren(this);event.cancelBubble=true;" onMouseOut="hideChildren(this" class=""><a href="#">Child 1.2</div></a>

Løser du problemet, med at baggrunden ikke bliver grøn, men du skaber til gengæld et andet problem. Nemlig at hideChildren funktionen bliver kørt når du bevæger musen over et child, fordi den jo samtidig bevæger sig væk fra parent'en, og dermed forsvinder alle children, når du flytter musen over dem...
Det evige problem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester