Avatar billede donslund Nybegynder
05. september 2011 - 15:10 Der er 24 kommentarer

Finde elementhøjden med jQuery

Jeg har dette kode

<div class="block">
<dl>
<dd><a href="">Linktekst</a></dd>
</dl>
</div>

Men hvorfor returnerer alert(children.height()); 0 i nedenstående kode.
Burde det ikke virke?

$('div.block dl').each(function() {
        // alert("igang");
        $('dd p').hide();
        var children = $('dd a', $(this));
        alert(children.height());
        children.height(getMaximumHeight(children));
    });
Avatar billede olebole Juniormester
05. september 2011 - 15:46 #1
<ole>

Umiddelbart ville det undre mig, om et udtryk som children.height() kan give mening. children må formodes at være en collection eller et array af elementer - og så må du formodentlig vælge ét af disse for at få højden på dét

/mvh
</bole>
Avatar billede donslund Nybegynder
05. september 2011 - 20:48 #2
Antallet af <d>-tags kan variere.

Det giver msåke mening hvis du får getMaximumHeight() også.

function getMaximumHeight(group) {
    var defaultHeight = group.height();
    var tallestChild = group.children().height();
    var height = (defaultHeight < tallestChild) ? tallestChild : defaultHeight;

    group.each(function() {
        //alert(group.height);
        var itemHeight = $(this).height();
        height = (itemHeight > height) ? itemHeight : height;
        //alert('Default: '+height);
    });
    return height;
}
Avatar billede donslund Nybegynder
12. september 2011 - 11:30 #3
Håber der er en der kan hjælpe mig i land med denne.
Avatar billede olebole Juniormester
12. september 2011 - 15:55 #4
Umiddelbart kunne jeg forestille mig, det ville være 'piece of cake' med ganske almindelig DOM/JS.

Hvis du er interesseret i andet end en jQuery løsning, kan jeg uden tvivl give dig en løsning. Det forudsætter dog, at du forklarer, hvad det reelt er, du gerne vil  =)
Avatar billede donslund Nybegynder
14. september 2011 - 09:11 #5
Det jeg gerne vil er, at jeg har en nogle elementer af typen <dl></dl>. Ved ikke helt hvad de hedder? Definition list?

De indeholder jo så en <dt></dt> og en række <dd></dd>.
Dissen <dd></dd> kan have forskellig højde at efter om der er 1, 2, 3 eller 4 linjers tekst. Min udfordring går på, at finde den højeste <dd></dd> indenfor en <dl></dl> og så justere de andre <dd></dd> ind så de alle har samme højde.

Var det forklaring nok, ellers prøver jeg gerne igen.
Avatar billede olebole Juniormester
14. september 2011 - 23:41 #6
Dette vil formodentlig virke - lidt afhængig af CSS'en på elementerne:


var aDd = document.getElementById("din_dl_id").getElementsByTagName("dd");
var nMax = 0, nTmp;
for (var i=aDd.length-1; i>=0; i--) {
    nTmp = aDd[i].offsetHeight;
    if (nTmp>nMax) nMax = nTmp;
}
for (var i=aDd.length-1; i>=0; i--) aDd[i].style.height = nMax + "px";

Avatar billede donslund Nybegynder
15. september 2011 - 14:28 #7
Men da der er mere en én <dl></dl> på siden hvor jeg skal bruge koden, så kan jeg vel ikke køre på ID.
Eller har jeg misforstået noget?
Der er et sted mellem 1 og 5 på hver side, men i princippet kan der være uendeligt.
Avatar billede olebole Juniormester
15. september 2011 - 21:18 #8
Det kan jeg af gode grunde intet vide om. Jeg kan jo ikke se din kode  =)

Nummer et ville naturligvis være at have styr på sin kode, så man ved, hvad der genereres, men det kan være svært med 'black-boxes' som jQuery. Ellers kommer man meget let til at bruge oceaner af unødvendige CPU-kræfter og RAM - og det er næsten umuligt ved brug af de tilgængelige JS-libraries.

De er hurtige at arbejde med, men resulterer næsten uundgåeligt i skodkode. Lidt ligesom forskellen på mor's hjemmelavede deller og en tallerken med opvarmede dåsekartofler, dåsefrikadeller, lidt vand, en suppeterning og lidt kulør. Det smager ad H****** til - og at det fylder i sækken, er det eneste positive, man kan sige om den 'ret'  *o)

Dette er - ligesom jQuery løsninger - ikke en skræddersyet løsning, men den vil virke (med mindre jeg har overset en fejl):


var aDl = document.getElementsByTagName("dl");
var nMax = 0, nTmp, aDd;
for (var i=aDl.length; i>=0; i--) {
    aDd = aDl[i].getElementsByTagName("dd");
    for (var i=aDd.length-1; i>=0; i--) {
        nTmp = aDd[i].offsetHeight;
        if (nTmp>nMax) nMax = nTmp;
    }
    for (var i=aDd.length-1; i>=0; i--) aDd[i].style.height = nMax + "px";
}

Avatar billede olebole Juniormester
15. september 2011 - 21:19 #9
Njarrhhh ... en enkelt fejl var der  =)


var aDl = document.getElementsByTagName("dl");
var nMax = 0, nTmp, aDd;
for (var j=aDl.length; j>=0; j--) {
    aDd = aDl[j].getElementsByTagName("dd");
    for (var i=aDd.length-1; i>=0; i--) {
        nTmp = aDd[i].offsetHeight;
        if (nTmp>nMax) nMax = nTmp;
    }
    for (var i=aDd.length-1; i>=0; i--) aDd[i].style.height = nMax + "px";
}


Avatar billede donslund Nybegynder
22. september 2011 - 14:45 #10
Jeg takker for dine anstrengelser.

Det har ikke rigtig nogen effekt.

En alert på aDl.length viser fint nok hvor mange den finder.
Men en aler("test") lige indenfor i den første for-løkke eksekveres kun 1 gang selv om aDl = 24.
Avatar billede olebole Juniormester
22. september 2011 - 19:47 #11
Det har jeg ikke fantasi til at forestille mig. Det må du vise os. Der må være noget, du ikke fortæller
Avatar billede donslund Nybegynder
22. september 2011 - 21:58 #12
Nej, jeg kan heller ikke lige se hvorfor det ikke skulle virke.

Her: http://www.landrover.dk/index.php?id=123

I "harmonikaen" er alle disse dl-elementer.
Og i eksempelvis den der hedder Information, kommunikation og underholdning, er der først 3 billeder. Lige nu er kasserne lige høje fordi jeg har sat en fast værdi, men det jeg gerne vil er, at de får ens højde justeret efter den højeste kasse.
Altså ved de 3 billeder skal det sorte være to linjers tekst højt.
Andre steder er det 4 linjers tekst der skal være plads til.

Giver det mening?

dl-elementet har ingen id eller class, men dd har class'en connect-overlay hvis det kan bruges til noget.
Avatar billede olebole Juniormester
23. september 2011 - 00:01 #13
To ting:
1) Hav altid fejlmeddelelser slået til, eller fejlkonsollen åben - afhængig af browsermærke - når du udvikler

2) Kopier og sæt ind. Så undgår du tastefejl  *o)

Koden i dit dokument mangler -1 efter aDd.length

for (var i=aDd.length-1; i>=0; i--) {

Fordi vi tæller ned, vil første element ikke eksistere, og du får en fejl
Avatar billede donslund Nybegynder
25. september 2011 - 23:04 #14
Jeg undskylder meget, men jeg synes da jeg har et -1 i den lije. Det mangler tilgengæld i linjen for (var j=aDl.length; j>=0; j--) {

Men sætter jeg det ind der ryger alle mine boksen væk. Højden sættes sikkert til 0.

Jeg får denne fejlmeddelelse:

aDd = aDl[j].getElementsByTagName("dd");
Avatar billede olebole Juniormester
25. september 2011 - 23:19 #15
Der skal stå:

(var j=aDl.length-1; j>=0; j--) {

Hvis det ikke virker, må du vise mig det
Avatar billede donslund Nybegynder
26. september 2011 - 08:32 #16
Her: http://www.landrover.dk/index.php?id=123 :-)

Lige nu er der intet der styrer dem, så derfor er de forskellig højde.
Lad os stadig gå ud fra dem under Information, ...

Jeg har ikke slået koden til, da den sætter alle højderne til 0. Jeg har prøvet at alert'e nTmp. Den er 0 hele vejen igennem.
Avatar billede donslund Nybegynder
28. september 2011 - 11:52 #17
Ja, det nytter jo ikke at jeg sidder og glor på din kode, for dem er garanteret helt korrekt.

Det undrer mig dog, at aDd[i].offsetHeight ser ud til at returnere 0 hver eneste gang.

Koden jeg har nu er:

var aDl = document.getElementsByTagName("dl");
var nMax = 0, nTmp, aDd;
for (var j=aDl.length-1; j>=0; j--) {
    aDd = aDl[j].getElementsByTagName("dd");
    if(aDd.length>0){
        for (var i=aDd.length-1; i>=0; i--) {
            nTmp = aDd[i].offsetHeight;
            if (nTmp>nMax) nMax = nTmp;
        }
    //for (var k=aDd.length-1; k>=0; k--) aDd[k].style.height = nMax + "px";
    }
}

Jeg sorterer de dl'er fra der ingen dd'er indeholder.

Noget bud? Kan det være min programmering af selve dl-elementer det er galt med?
Avatar billede olebole Juniormester
28. september 2011 - 16:24 #18
Det nytter ligeså lidt, at jeg sidder og glor på din kode. Du bliver nødt til at slå koden til - ellers hjælper linket mig ikke meget  =)
Avatar billede donslund Nybegynder
28. september 2011 - 19:18 #19
Den er hermed slået til. Så må vi ses hvornår Land Rover opdager det :-) kasserne er der nemlig ikke lige nu da højden sættes til 0 :-)
Avatar billede donslund Nybegynder
29. september 2011 - 08:03 #20
Da det er et live-site vi roder med, har jeg lige gjort, så det kun er ovennævnte side scriptet virker på.
I kildekoden er javascript-koden 2 gange. Den nederste er udkommenteret.
Avatar billede olebole Juniormester
29. september 2011 - 11:04 #21
- og hvor ligger scriptet første gang?
Avatar billede olebole Juniormester
29. september 2011 - 11:29 #22
PS: Det er naturligvis vigtigt, at elementerne ikke er skjult med display:none, når du måler deres højde. Hverken de enkelte elementer eller omkransende elementer må være skjult.

Har et element - eller et af dets omkransende elementer - display:none, vil dets dimensioner altid være 0px x 0px
Avatar billede donslund Nybegynder
29. september 2011 - 19:24 #23
http://www.landrover.dk/index.php?id=123

Linje 890 til 900 ca.

Men i og med, at de ligger inde i det der accordion-element, så er de jo skjulte Så kan jeg slet ikke gøre det på denne måde, eller hvad?
Skal jeg så køre scriptet hver gang et element foldes ud?
Avatar billede donslund Nybegynder
30. september 2011 - 10:03 #24
Nå, jeg kaster håndklædet i ringen. Det må laves på en anden måde. Tak for hjælpen. Vil du have point?
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