Avatar billede eksperten1 Nybegynder
29. september 2002 - 12:12 Der er 30 kommentarer og
1 løsning

showHide2, at vise/skjule layers med noget i deres id

Med stor hjælp fra phoenixv kom min showHide funktion til at virke.
Nu er det sådan at jeg gerne vil kunne vise/skjule div's som har noget i deres navn...

<div class='9' id='109_t09va01m'>
<div class='9' id='110_t09va01u'>

Hvis jeg nu gerne vil vise/skjule ALLE de div's hvor deres id slutter med et u, tilsvarende m.

Kan det lade sig gøre ?

vhE1
Avatar billede jakoba Nybegynder
29. september 2002 - 12:35 #1
til browsere der understøtter DOM2 (ikke vældig mange)

function divDerSlutterMed ( bogstav, synlig ) {
            // bogstav er slutbogstav. eg "u", "m", ...
            // synlig  er synlighed. eg "visible", "hidden".
    var liste = document.getElementsByTagName( "div" );
        // liste er nu et array med alle dic objekter.
    for (var i=0; i<liste.length; i++ ) {
        var lgt = liste[i].id.length;
        if ( bogstav = liste[i].id.substring(lgt-1) ) {
            liste[i].style.visibility = synlig;
        }
    }
}; //end divDerSlutterMed ( String, String )

mvh JakobA
Avatar billede jakoba Nybegynder
29. september 2002 - 12:36 #2
Ups.  == for at sammenligne, ikke kun eet =
        if ( bogstav == liste[i].id.substring(lgt-1) ) {
Avatar billede jakoba Nybegynder
29. september 2002 - 12:41 #3
Jeg er lidt usikker med kaldet:
    document.getElementsByTagName( "div" );
der står ingen steder at parameteren er ligeglad med om du bruger store eller små bogstaver ("div", "Div", "DIV"), og microsofts domkumentation
http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getelementsbytagname.asp
staver den konsekvent med store bogstaver.
xhtml siger det skal være med små bogstaver.

nogen der ved noget der?
Avatar billede Slettet bruger
29. september 2002 - 13:01 #4
Jeg ved, at den er ligeglad:

<html>
<head>
<script>
function vis(d) {
divs = document.getElementsByTagName(d);
arr = new Array();
for (i = 0; i < divs.length; i++)
arr[arr.length] = divs[i].id;
alert(arr.join("\n"));
}
</script>
</head>
<body>
<div id="nr1"></div>
<DIV id="nr2"></DIV>
<div id="nr3"></div>
<div id="nr4"></div>
<dIV id="nr5"></dIV>
<div id="nr6"></div>
<div id="nr7"></div>
<DIV id="nr8"></DIV>
<a href="#" onClick="vis('div'); return false;">Alert div</a><br>
<a href="#" onClick="vis('DIV'); return false;">Alert DIV</a><br>
<a href="#" onClick="vis('dIV'); return false;">Alert dIV</a><br>
</body>
</html>
Avatar billede jakoba Nybegynder
29. september 2002 - 13:10 #5
og også ligeglad i Netscape 7. takker.
Avatar billede eksperten1 Nybegynder
29. september 2002 - 15:53 #6
Øhh... Nu skal det her fungere på IE 5 Mac+Win

Understøtter de DOM2 ?

Jeg fatter brik!
Avatar billede jakoba Nybegynder
29. september 2002 - 16:43 #7
prøv.
Hvis ikke er det muligt det går bedre hvis du udskifter linien:
    var liste = document.getElementsByTagName( "div" );
med:
    var liste = document.body.all.tags("DIV");

men så er du så også helt sikker på det ikke virker andre steder end i IE.
Avatar billede Slettet bruger
29. september 2002 - 20:15 #8
Men getElementsByTagName skulle nu meget gerne virke i IE5.
Avatar billede eksperten1 Nybegynder
29. september 2002 - 20:58 #9
Jeg afprøver det imorgen.
Tak for svarene.
vhE1
Avatar billede eksperten1 Nybegynder
30. september 2002 - 11:55 #10
Hmm, umiddelbart fungerer det ikke ?
Prøv lige at kgge med her:
http://bjaergager.dk/ekspert

>phoenixv, kan du ikke lige se med også. Den første showHide funktion du lavede fungerer lidt underligt, det er som om at det er den første funktion showHide9() der styrer det hele ?!?

vhE1
Avatar billede jakoba Nybegynder
30. september 2002 - 14:19 #11
1) der skal ikke stå  'java script: i en handler
2) du har glemt " efter første parameter.
3) anden parameter malgler helt
4) selve scriptet står ikke i din side.
Avatar billede eksperten1 Nybegynder
30. september 2002 - 15:35 #12
:-) Nå hov.
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 09:34 #13
Problemet er at jeg arbejder lokalt og det var en gl. version jeg havde fået smidt ud. Nu fungerer den faktisk rigtig godt, jeg ville dog meget gerne have at den kunne kontrollere hvorvidt om der er hak/ikke hak i den checkbox. Så jeg forsøgte noget ala:
function showHide9() {
        var divs = document.getElementsByTagName("div");
        var vis = document.parent."orm1.chk9.value
            for (i = 0; i < divs.length; i++)
                if (divs[i].className == "9"){
                    if (vis == "1"){
                    divs[i].style.visibility = "visible";
                    }
                    else {
                    divs[i].style.visibility = "hidden";
                    }
                    }
        }

Men får en fejl: Objektet understøtter ikke denne metode...

Jeg må indrømme at det meste af det er gætteværk ?
Avatar billede jakoba Nybegynder
01. oktober 2002 - 10:08 #14
der skal stadig ikke stå 'java script:' i handlere.
istedetfor
    onClick="java script:document.layout.showHide9();"
skal det blot være
    onClick="document.layout.showHide9();"

De eneste steder der (nogen gange) skal stå 'java script:' er:
i links efter href=
i forms efter action=
i frames efter src=

du laver klassenavne der hedder:
  <style type="text/css">
    .dna {cursor:crosshair}
    .9
    .12
    .16
    .tk
  </style>
'dna' og 'tk' er ok som navne. '9', '12' og '16' er ikke lovlige navne. For at være lovlige skal navne begynde med et bogstav fra alfabetet.

En handler vestår af et nøgleord
    onchange
fulgt af et lighedstegn
    onchange=
fulgt af en streng. og den streng skal være een eneste lovlig streng
    onchange="streng bogstaver"
for at være lovlig skal strengen starte med et anførselstegn, og slutte med samme slags anførselstegn. altså enten
    onchange="streng bogstaver"  eller  onchange='streng bogstaver'
den slags angørselstegn der bruges til at omkranses strengen må ikke forekomme indeni den streng. hvis de gør tror javascript at strengen ender der.
så handleren
    onChange="document.layout.divDerSlutterMed("u);
skal rettes til
    onChange="document.layout.divDerSlutterMed('u');"
og der skal ændres ligesådan der hvor du vil ændre dem der slutter 'm'.

mvh JakobA
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 10:18 #15
Hej jakoba
Tak for tålmodigheden. Nu har jeg opdateret siden på http://bjaergager.dk/ekspert
Den funktion som du lavede fungerer fint, dog har jeg ødelagt funktionen showHide9, idet jeg gerne vil have den til at kontrollere om der er hak eller ej i den checkbox som den styres af. Men der er en fejl i det kode som jeg har gættet mig til.

Gider du at prøve at se hvorfor ?

vhE1
Avatar billede jakoba Nybegynder
01. oktober 2002 - 11:44 #16
i din hovedside hvor checkboksene står skal der være en <form og </form rundt om dine checkbokse fx:
  <form name='form1' action="" onsubmit="return false" style="display:inline;">
    ... her står alle dine checkbokse
  </form>
den der  style="display:inline;"  forhindrer form <kommandoen i at generere ekstra linier på siden.

når det er iorden kan du adrressere formen fra din iframe med:
    parent.document.form1
og checkboksene med
    parent.document.form1.chk9
    parent.document.form1.chk12
... osv
for at teste om en checkboks er sat kikker man på den attribut .checked der er enten true eller false

fidusen med indrykninger er at man kan kikke opad fra enhver sluttuborg, og den første linie hvor der står noget med samme indrykning det er den linie hvor den sluttuborg har sin begyndelse. Gode indrykninger er næsten ligeså vigtigt som at stave rigtigt :-)


    function showHide9() {
        var divs = document.getElementsByTagName("div");
        var vis = parent.document.form1.chk9.checked;
        for (i = 0; i < divs.length; i++) {
            if (divs[i].className == "s9"){
                if (vis){  // hvis vis er true
                    divs[i].style.visibility = "visible";
                } // denne } afslutter { forenden af anden if... linie
                else {      // hvis vis er false
                    divs[i].style.visibility = "hidden";
                } // denne } afslutter { forenden af else... linien
            } // denne } afslutter { forenden af første if... linie
        } // denne } afslutter { forenden af for... linien
    } // denne } svarer til { for enden af function... linien

mvh JakobA
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 12:23 #17
:-)) Hej Jakoba
Uha så virker det... næsten.
Jeg har lavet en linje:
window.onload=function(){
showHide9();showHide12();showHide16();showHidetk();divMedBeskaering();divUdenBeskaering();stopclk();
}
Som skulle sørge for at alle funktionerne bliver kørt når iframen loader. (der er en sidevælger som sender en UID til den asp side som genererer alle de divs) Men det er kun de 2 funktioner som viser/skjuler dem der slutter med m/u, der kører korrekt. ?
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 12:28 #18
Nu gjorde jeg flg., også for at opdatere hvilke lag der skal/ikke skal vises:
function divUdenBeskaering () {
            // bogstav er slutbogstav. eg "u", "m", ...
        var liste = document.getElementsByTagName( "div" );
        var vis = parent.document.form1.chub.checked;
        // liste er nu et array med alle dic objekter.
        for (var i=0; i<liste.length; i++ ) {
            var lgt = liste[i].id.length;
            if ( "u" == liste[i].id.substring(lgt-1) ) {
                    if (vis){
                        liste[i].style.visibility = "visible";
                        }
                    else{
                        liste[i].style.visibility = "hidden";
                    }
                  }
              }
        showHide9();showHide12();showHide16();showHideth();       
        }; //end divDerSlutterMed ( String, String )

Altså til allersidst i funktionen kalder jeg de 4 funktioner som opdaterer de andre lag, sådan at deres visibility rent faktisk hænger sammen med hvad der er valgt.

Nu giver den bare en fejl... igen :)
Avatar billede jakoba Nybegynder
01. oktober 2002 - 12:48 #19
der mangler stdig <form og </form kommando rundt om dine checkbokse.
er har du blot ikke opdateret http://bjaergager.dk/ekspert ?
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 12:54 #20
Ikke opdateret, funktionerne kører ellers fint, men jeg kan ikke få den til at kalde de andre. Jeg opdaterer lige ude på bjaergager.dk/ekspert

vh Mark
Avatar billede jakoba Nybegynder
01. oktober 2002 - 13:53 #21
Nu kan jeg se siden indeni iframen er blevet opdateret.
så mangler vi blot den side din iframe ligger i (det er der der skal <form kommando rundt om checkboksene)
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 13:57 #22
Uha, for mange bolde i luften lige nu. Så er den også opdateret.

Tak!
Avatar billede jakoba Nybegynder
01. oktober 2002 - 13:58 #23
i slutningen af funktionerne divUdenBeskaering og divMedBeskaering kalder du
    showHideth();
men den funktion hedder altså
    showHidetk();    // 'k' istedet for 'h' tilsidst
Avatar billede jakoba Nybegynder
01. oktober 2002 - 14:08 #24
Ups. den er glippet.
kun een <form ...>  foran checkboksene
og een </form>  bagefter  (der står en ekstra <form> lige foran </form>. den <form> skal væk.
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 14:13 #25
done, men der er stadigvæk noget galt.
Hvis en bruger har skjult 1/9 (grøn), så kan man ikke skjule Uden beskæring, det må være fordi den også kalder showHide9/12/16/tk() som så checker deres egen status og så tænder for dem igen !
På en eller anden måde skal de checke om de "må" vises for deres "egen" checkbox, sådan at alle class="s9" kontrollerer om checkboxen er checked eller ej. Forstår du ? (uha det bliver mere og mere indviklet)

mvh
Mark
Avatar billede jakoba Nybegynder
01. oktober 2002 - 15:03 #26
jeg tror det er sådanher det skal være:
(der oprettes 2 nye arrays ca og cb, og ændres i funktionerne)

        // fælles array for funktionerne
        // showHide9 og showHide12 og showHide16 og showHidetk
var ca = { u:"chub", m:"chmb" );

function showHide9() {
        var divs = document.getElementsByTagName("div");
        var vis = parent.document.form1.chk9.checked;
        for (i = 0; i < divs.length; i++) {
            if (divs[i].className == "s9"){
                if (vis && parent.document.form1.elements[ ca[liste[i].id.substring(lgt-1)] ].checked ){
                    divs[i].style.visibility = "visible";
                } // denne } afslutter { forenden af anden if... linie
                else{
                    divs[i].style.visibility = "hidden";
                } // denne } afslutter { forenden af else... linien
            } // denne } afslutter { forenden af første if... linie
        } // denne } afslutter { forenden af for... linien
} // denne } svarer til { for enden af function... linien

der er ændret i betingelsen i den indre if. lav den samme ændring i funktionerne showHide12 og showHide16 og showHidetk


        // fælles array for funktionerne
        // divMedBeskaering og divUdenBeskaering
var cb = { s9:"chk9", s12:"chk12", s16:"chk16", stk:"chktk" };

function divMedBeskaering () {
        // bogstav er slutbogstav. eg "u", "m", ...
    var liste = document.getElementsByTagName( "div" );
        var vis = parent.document.form1.chmb.checked;
    // liste er nu et array med alle dic objekter.
    for (var i=0; i<liste.length; i++ ) {
        var lgt = liste[i].id.length;
        if ( "m" == liste[i].id.substring(lgt-1) ) {
            if (vis && parent.document.form1.elements[ cb[liste[i].className] ].checked ) {
                liste[i].style.visibility = "visible";
            }
            else{
                liste[i].style.visibility = "hidden";
            }
              }
      }
    showHide9();showHide12();showHide16();showHidetk();       
}; //end divDerSlutterMed ( String, String )


der er ændret i betingelsen i den indre if. lav den samme ændring i funktionen divUdenBeskaering
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 20:02 #27
Hej Jakob
Hmm, den brokker sig over når den bliver initialiseret ved onLoad...

Jeg kan ikke lige gennemskue hvilken funktion der fejler, skal jeg forsøge at fjerne den onLoad ?

mvh
Mark
Avatar billede jakoba Nybegynder
01. oktober 2002 - 20:24 #28
Nej. det er ligeså dumt som at undertrykke fejlmeldingerne i php.

det er mig der har kvajet mig i linien
                if (vis && parent.document.form1.elements[ ca[liste[i].id.substring(lgt-1)] ].checked ){

foran den linie skal der stå:
                var lgt = liste[i].id.length;

i de fire showHide funktioner.
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 20:30 #29
Hej Jakob,
ja jeg fandt den godt, i de 4 første skal det være divs[i]...

Har også lige testet det på Macintosh, ud over at min iMac er *øvlangsom, så spiller det bare.

Jakob, jeg ville gerne have lov til at sende dig en flamingokasse med indhold osm tak for din hjælp, det har været alletiders. Men udover at du (formentligt) bor i Nivå, så kan jeg ikke finde dig !!

Kan du ikke sende mig din adr. på mail ?

Igen, 1000 tak for hjælpen, det har været alletiders.

Med venlig hilsen
Mark
Avatar billede jakoba Nybegynder
01. oktober 2002 - 20:52 #30
Nae.. så skal jeg jo selv også afsende dem jeg skylder :-)
tak for points
Avatar billede eksperten1 Nybegynder
01. oktober 2002 - 20:56 #31
hmm, ja det var jo så sandelig så lidt.
Er du sikker?, det er en dejlig Chateau La Foret - Cotes de Castillon...

Jo du, jeg syntes nu nok at jeg skylder dig en flaske god rød som tak.!

Mvh
Mark
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