Avatar billede pyroman Nybegynder
09. januar 2005 - 22:29 Der er 11 kommentarer og
1 løsning

style problemer ved js-menu

Harj

Jeg har brugt meget meget meget tid her siden jul til at bikse min egen js-menu op fra bunden. Den er endelig ved at være færdig - men er stødt ind i nogle mærkelige problemer med hvordan tablerow elementer opfører sig i forskellige browsere.

Min menus består af undermenuer - div's der indeholder et table med alle knapperne i - hver knap består af af en tablerow med tre celler.

Koonkrete problemer:

1. Firefox sætter bredden af tablerow'en og tablebody'en til et tal som må forstås som "uendeligt" - noget a la 7.89e8 - og tilpasser sig ikke indholdet i tablerow'en!!
selve table-elementet gør dog dette og jeg har derfor undgået problemet på den måde - men vil gerne have en forklaring.

2. Div'et tilpasser sig heller ikke indholdet - eller rettere kun delvist! Dette har jeg så også overkommet ved at sætte div'ets bredde til samme bredde som table't - ikke en smart løsning der giver nogle problemer senere. Dette både i IE og FF

3. Jeg har prøvet at style menuen - efter dette kan IE ikke finde ud af at sætte bredden af nogle af cellerne, de forbliver bare smalle - og vel at mærke kun i nogle af table'sne!!


Jeg har tjekket den html der udskrives igennem 1000 gange - og der er ikke nogen fejl dér - alt opfylder vist xhtml standarderne!

Håber der er nogle der måske har nogle svar!

Koden til menu er nok for omfattende til at smide op her - men koden der indsætter et div med et table og den efterfølgende kode der placerer div'et er følgdene:

-- Udsnit af kode --
var str = "";
    str += "<div id='"+name+"_menu"+this.id+"' class='"+name+"_menuClass' style='position: absolute; visibility: hidden;' ";
    str += "onMouseOver='"+name+".menuMouseOver(\""+this.id+"\");' onMouseOut='"+name+".menuMouseOut();' >";
    str += "<table border=0 cellpadding=0 cellspacing=0>";
    for (var i = 0; i<this.menuItems.length; i++) {
        if (this.menuItems[i].type == "menu") {
            this.addSubMenu(this.menuItems[i], this.id+"_"+i, i);
            str += this.menuItems[i].item.draw();
        } else if (this.menuItems[i].type == "item") {
            str += this.menuItems[i].draw();
        }
    }
    str += "</table>";
    str += "</div>";
-- Udsnit slut --

--Udsnit af kode--
var currentDiv = this.menubar.getElement(this.menubar.name+"_menu"+this.id);
    var td = currentDiv.firstChild.firstChild.firstChild;
    if (this.parentMenu) {
        var parentDiv = this.menubar.getElement(this.menubar.name+"_menu"+this.parentMenu.id);
        var tr = parentDiv.firstChild.firstChild.childNodes[this.itemNum];
        currentDiv.style.top = this.menubar.getElementOffsetTop(tr)-this.menubar.worldy;
        // Her nogle grimme fejl i Mozilla - brug offsetWidth på <table> i stedet for <tr>
        currentDiv.style.left = this.menubar.getElementOffsetLeft(tr)+parentDiv.firstChild.offsetWidth-this.menubar.worldx;
    }
    if(this.menubar.browser == "IE"){
        var td = currentDiv.firstChild.firstChild.firstChild;
        currentDiv.style.width = td.childNodes[0].offsetWidth+td.childNodes[1].offsetWidth+td.childNodes[2].offsetWidth;
    }else{
        currentDiv.style.width = currentDiv.firstChild.offsetWidth;
    }
-- Udsnit slut --


Menuen kan ses her: http://www.desi-dev.dk/filip/js_MenuBar/MenuBarTest.html
styles her: http://www.desi-dev.dk/filip/js_MenuBar/menu_styles.css
script her: http://www.desi-dev.dk/filip/js_MenuBar/MenuBar.js


/Pyroman
Avatar billede olebole Juniormester
10. januar 2005 - 15:54 #1
<ole>

Jeg orker ikke gå menuen efter i sømmene, menjeg har da lige et par kommentarer:
1. Du kan ikke forvente at få noget vist ens i forskellige browsere, uden en DTD - og du _skal_ have en URL med i DTD'en (Da IE ellers ikke kan tolke CSS korrekt) ... f.eks:
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

2. Din menu kan ikke bruges sammen med XHTML - hvis koden skal parses som andet end fejlfyldt HTML4. innerHTML kan du kun bruge i HTML ... ikke i XML, som er, hvad XHTML er. Da hele menuen er bygget op på brugen af innerHTML, vil scriptet altså tvinge browseren til at parse siden som fejlfyldt HTML i stedet for som XHTML  :)

/mvh
</bole>
Avatar billede pyroman Nybegynder
10. januar 2005 - 16:41 #2
Jeg har aldrig været inde i alt det der html fis - synes det er alt for ulogisk... :)
Så takker mange gange for at du gider hjælpe...

Men æhhh - den der doctype, den gjorde det lige 1000 gange værre end det var i forvejen - nu kan mozilla slet ikke finde ud af at sætte undermenuerne ordentligt op - og IE giver stadig lignende problemer.

Det behøver desuden heller ikke være xhtml - men er der et alternativ til innerHtml som opfylder xhtml standarden? Hvad med bare at skrive svineriet ind med document.write() ??
Avatar billede pyroman Nybegynder
10. januar 2005 - 16:45 #3
Avatar billede pyroman Nybegynder
11. januar 2005 - 17:29 #4
Øhmm - jeg har fundet ud af at mozilla nu slet ikke kan finde ud af at bruge style egenskaberne!!?? Der sker intet - heller ikke hvis man sætter dem til en fast værdi i place() funktionen!!

Der er intet i vejen med min html, så problemet kan ikke skyldes en fejl dér - gemte siden med hele menuen og kørte den gennem validator.w3.org

Nogle der har nogle ideer?
Avatar billede olebole Juniormester
11. januar 2005 - 17:37 #5
Går det galt i Moz, når du sætter den DTD på, er der noget helt galt med koden ... uanset, om du har kørt den gennem validatoren eller ej. Validatoren kan kun sige noget om, hvorvidt der er syntaks-fejl ... ikke om koden giver mening.

Hvad document.write angår, er det også en ren HTML-metode, der ikke kan anvendes under XHTML.
Avatar billede olebole Juniormester
11. januar 2005 - 17:39 #6
PS: Du sætter vel ikke elementers display til 'block', hvis de ligger inde i et element, der har display 'inline' (enten explicit sat - eller fra fødslen)? Det må man nemlig ikke. Inline-elementer kan ikke indeholde block-elementer  :)
Avatar billede pyroman Nybegynder
15. januar 2005 - 21:31 #7
Undskyld det har taget så lang tid - har haft meget travlt her på det sidste...

Der er kun ét sted hvor der ændres i display, og det er i top-menuen, som består af en <ul> hvor li'ernes display er sat til 'block' for at få dem til at fremkomme på samme linie, og det er fuldt tilladt så vidt jeg ved.
Avatar billede pyroman Nybegynder
20. januar 2005 - 15:13 #8
Nu har jeg lavet nogle simple tests... og resultatet af dem er:

Mit mozilla kan slet ikke bruge obj.style objektet til at sætte styles med...!!! Det virker bare NADA!!

Fx: denne test:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>table</title>
<script language="javascript" type="text/javascript">

function setStyles(){
    var obj = document.getElementById("japadabadoo");
    obj.style.position = "absolute";
    obj.style.top = 200;
    obj.style.left = 200;
}

</script>
</head>
<body onload="setStyles();">
  <div id="japadabadoo">
  japadabadoo
  </div>
</body>
</html>


Der sker ikke en pind i mozilla - kun hvis jeg fjerner Doctype'n...
Avatar billede pyroman Nybegynder
20. januar 2005 - 20:54 #9
Ahhh - har løst det problem der nu - bare et mindre syntaks-problem... når man sætter ting med style skal det skrives som i css (selvfølgelig! ;) ), fx:

obj.style.left = "200px";


Men men men men... det løser sgu ikke det hele!

Hvis du ser på http://www.desi-dev.dk/filip/js_MenuBar/MenuBarTest.html - så kan både Firefox og IE ikke finde ud af at skalere bredden af både div's og table-elementer... De to ende-tableelementer er sat til at være 20px brede i stylesheetet...

Nogen forslag?
Avatar billede olebole Juniormester
25. januar 2005 - 00:14 #10
Nej, den har jeg ikke umiddelbart lyst til at rode i  :)
Avatar billede pyroman Nybegynder
26. januar 2005 - 15:26 #11
Så - har løst det ved ikke at skrive mine undermenuer inde i et andet div, men direktei body...

Smid et svar ole - så sørger jeg for at du får lidt points som tak for hjælpen...
Avatar billede pyroman Nybegynder
03. maj 2005 - 22:11 #12
lukker...
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