Avatar billede Slettet bruger
11. september 2004 - 17:05 Der er 25 kommentarer og
1 løsning

Placering i træmenu

Hej JS hajer.

Jeg har lavet en "træmenu". Ved visningen benytter jeg PHP, og der er ingen problemer. Mit problem, ligger i hvor i træmenuen det enkelte link skal vises. Via databasen har jeg blot angivet de forskellige felter, og den viser dem i den rækkefølge som de nu skal.

Dog vil jeg gerne have en side, hvor jeg via f.eks. en <select> kan flytte de forskellige links op, ned eller ind og ud.

Et udtræk kan se ud som dette:

Forsiden
....foo
....bar
........bar foo
........foo bar
....hest

Den finder ud af hvordan de forskellige elementer skal sættes op ved hjælp af tre felter i min database. (id, home, reference).

Istedet for at forklare hvad de enkelte felter indeholder, laver jeg lige en skitse. Det giver nok et bedre indtryk.

Forsiden (id=1 - home = 1 - reference = 0 - build = 1)
....foo (id=2 - home = 1 - reference = 1 - build = 1)
....bar (id = 3 - home = 1 - reference = 1 - build = 2)
........bar foo (id = 4 - home = 1 - reference = 3 - build = 1)
........foo bar (id = 5 - home = 1 - reference = 3 - build = 2)
....hest  (id = 6 - home = 1 - reference = 1 - build = 3)
Underside (id = 7 - home = 7 - reference = 0 - build = 2)
....vis (id=8 - home = 7 - reference = 7 - build = 1)
........hest (id = 9 - home = 7 - reference = 8 - build = 1)

Dette burde vise logikken. Home definer hvilken kategori linket høre under. Reference fortæller hvilket link der skal komme efter det nuværende - som styres af id.
Build angiver i hvilken rækkefølge de forskellige links i det enkelte niveau skal vises.


Jeg er ikke nogen ørn til javascript, og måske heller ikke til at forklare, så håber i er med på hvad jeg mener :)

Jeg kunne forestille mig at hver gang man flytter et link op, ned - ind eller ud - giver man den <option> linket ligger i, en ny værdi.

Værdien kunne være: home, reference, build
eks.: <option value="7,8,1">

På forhånd tak for hjælpen :)
Avatar billede olebole Juniormester
11. september 2004 - 17:48 #1
<ole>

Mon ikke, du kan bruge den løsning, jeg lige har lavet til en anden:
  http://www.eksperten.dk/spm/538424

Hvis det bliver udvidet med en 'Venstre' og en 'Højre' knap, vil det virke præcis som menu-editoren i Visual Basic. Det er da noget elegantere end en select  :)
/mvh
</bole>
Avatar billede Slettet bruger
11. september 2004 - 17:55 #2
Det er i hvert fald noget i den stil :)

Det eneste problem, er at den kun virker i IE - er det noget du kan klare, så det også kan køre i firefox ?
Avatar billede nemitz Nybegynder
11. september 2004 - 18:05 #3
OleBole skriver i det andet indlæg at:

insertAdjacentElement er en proprietær IE-metode - men da det er et CMS, går jeg udfra, du udelukkende skriver til IE  :)

Kunne nu være nice hvis det også virkede i Firefox

med venlig hilsen

Thomas
Avatar billede Slettet bruger
11. september 2004 - 18:08 #4
Jeps, læste jeg også lige :)
Men indtil olebole svare tilbage, må jeg jo google efter det.

Men håber nu en js nørd kommer forbi :)
Avatar billede olebole Juniormester
11. september 2004 - 18:35 #5
Problemet er, at der er et par alvorlige mangler i W3C's DOM, så man skal ud i en noget større løsning, hvis det skal fungere X-browser. Jeg kan godt prøve at kikke på det - men det bliver nok ikke i aften  :)
/mvh
Avatar billede Slettet bruger
11. september 2004 - 18:55 #6
Det ville i hvert fald være rart, da det SKAL fungere i andet end IE :)
Avatar billede olebole Juniormester
11. september 2004 - 21:47 #7
Når folk fortæller dig, det er mere besværligt at kode strengt til standarderne (og dermed X-browser), er de fyldt med pis ... tro dem ikke ...!!!  *LooOooL*  ;D

Der ligge nu en rimelig X-browser version på:
  http://www.eksperten.dk/spm/538424

Så må du prøve, om du kan rette den ind til dit formål  :)
/mvh
Avatar billede Slettet bruger
11. september 2004 - 21:56 #8
heh :)

Det hjalp en del på det.
Når man vælger "save" får de jo præcis de værdier de skal have. Men jeg kan ikke gennemskue at tilføje en ekstra værdi. Så man ved hver f.eks. har (1.0) eller (1.2) - dette må være den bedste måde at gøre det på, da man der har et (x,y) kordinat.

Hvis du kan give et kort eksempel, ville det være helt kanont :)
Avatar billede olebole Juniormester
11. september 2004 - 22:07 #9
Én måde kunne jo være, at have et ekstra skjult felt i hvert div - med værdien 0. Så kan du lave to knapper, der tæller denne værdi henholdsvis op og ned.

Samtidig kunne man jo lave en lille svedig detalje, hvor man giver alle div en fast bredde. Når så man klikker på 'Left' eller 'Right', tæller man som sagt værdien op, eller ned - og giver div'et en tilsvarende left-margin. På den måde får du lidt 'WYSIWYG' indrykning.
Avatar billede Slettet bruger
11. september 2004 - 22:39 #10
Det virker meget logisk :)
Og er jo egentlig blot at lave en "dobbelt" kode, af det du allerede har lavet.

Så mit sidste spørgsmål er.
Nu har jeg smidt det i en form, og sidst i funktionen mySave lavet en document.gogogo.submit();

Men ligegyldig hvilken rækkefølge jeg har sat værdierne i bliver mit output bare:

array(5) { [0]=>  string(1) "0" [1]=>  string(1) "1" [2]=>  string(1) "2" [3]=>  string(1) "3" [4]=>  string(1) "4" }

altså: 0,1,2,3,4 - hvordan fixer jeg lige den ?
Avatar billede olebole Juniormester
11. september 2004 - 22:43 #11
Fordi du vel ikke har givet felterne et name  :)

    <div id="ID_0">Nummer 0 <input name="f_0" type="text" class="showInxInp"><button onclick="myMove(this, 'up')">Up</button><button onclick="myMove(this, 'down')">Down</button></div>

... f.eks.  :)
Avatar billede Slettet bruger
11. september 2004 - 22:48 #12
Det var der fejlen lå.
Jeg havde nu givet dem et name. Havde blot lavet det som foo[]

Men at gøre så det er et array i stedet for forskellige navne, kan jeg bare gøre når jeg har fået det til at virke. For i den sidste ende skal det alligevel smides ud igennem php :)

Jeg leger lige lidt med det indryk.
Men hvis du vil smide et svar, ville det jo være passende :)

Og endnu engang tak for hjælpen.
Avatar billede olebole Juniormester
11. september 2004 - 22:56 #13
name="foo[0]"
name="foo[1]"
name="foo[2]"

... hvad er problemet  ;D
Avatar billede olebole Juniormester
11. september 2004 - 22:58 #14
Normalt er det nok at skrive brackets, men skal elementerne flyttes rundt og bevare deres oprindelige navn, må man indeksere navnene - og de kan jo stadig godt have form af et array  :)
Avatar billede Slettet bruger
11. september 2004 - 23:08 #15
heh ja, så lærte jeg da også en del i dag :)

Det med indryk synes jeg nu alligevel ikke er sådan ligetil.
For lad os nu sige at vi har to der ikke er indrykket, og jeg så indrykker nr.3
Så skal dens indrykningsværdi være lig med div nr.2's værdi i x aksen ?

Hvis du forstår problemet ?
Avatar billede Slettet bruger
11. september 2004 - 23:12 #16
Altså sådan at den man rykker ind under, får samme y værdi som x værdien lige ovenfor.
Avatar billede olebole Juniormester
11. september 2004 - 23:13 #17
Ja, så ville jeg nok lave det på en helt anden måde - med et objekt. Det bliver dog betydeligt større, så det bliver ikke i denne omgang  :)
Avatar billede Slettet bruger
11. september 2004 - 23:20 #18
Damn :/

Well hvis jeg tænker mig om og får et resultat som følgende i (x,y)

(0,0)
(1,0)
..(2,1)
..(3,1)
....(4,2)

Burde jeg ved lidt omtanke kunne lave det med PHP, så den tjekker op på felterne :)

Men jeg kunne vel ikke få dig til at give et eksempel på det med indryk?
Jeg må vist også snart få anskaffet mig en bog eller to om javascript :)
Avatar billede olebole Juniormester
11. september 2004 - 23:28 #19
Jo, når du tæller op i feltet, skriver du:

FELT.value = parseInt(FELT.value) + 1;
DIV.style.marginLeft = parseInt(FELT.value) * 30 + "px";

... og ned:

FELT.value = ( parseInt(FELT.value)>0 )? (parseInt(FELT.value) - 1) : 0;
DIV.style.marginLeft = parseInt(FELT.value) * 30 + "px";
Avatar billede olebole Juniormester
11. september 2004 - 23:29 #20
... hvor 'FELT' og 'DIV' naturligvis er referencer til elementerne  :)
Avatar billede Slettet bruger
11. september 2004 - 23:58 #21
nu er jeg nok helt galt på den. Men dette er hvad jeg er kommet frem til:

function myMoveV(elm, dir) {
    var newElm, aDivs, cont=gE("cont");
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);
    aDivs = gA(cont, "DIV");
    if (dir=="in") {
        for ( i=1; i<aDivs.length; i++ ) {
            inpts = gA(divs[i], "INPUT");
            if ( aDivs[i]==elm ) {
                inpts[i].value = parseInt(inpts[i].value) + 1;
            }
        }   

    }

og i html delen ser knapperne sådan ud:

    <div id="ID_0">
    <span>
      <input type="hidden" name="x_0" value="" class="showInxInp">
      <input type="hidden" name="y_0" value="" class="showY"> Nummer 0
    </span>
    <span>
      <button onclick="myMove(this, 'up')">Up</button>
      <button onclick="myMove(this, 'down')">Down</button>
      <button onclick="myMoveV(this, 'in')">IN</button>
      <button onclick="myMoveV(this, 'out')">OUT</button>
    </span>
    </div>
Avatar billede olebole Juniormester
12. september 2004 - 01:23 #22
Så kommer der ikke flere færdige løsninger iaften  :)

<script type="text/JavaScript">
var d=document;
function gE(id){return d.getElementById(id)}
function gA(o,tag){return o.getElementsByTagName(tag)}

function mySave() {
    var inpts, divs = gA(gE("cont"), "DIV");
    for ( i=0; i<divs.length; i++ ) {
        inpts = gA(divs[i], "INPUT");
        for ( j=0; j<inpts.length; j++ ) {
            if (inpts[j].className=="showInxInp") {
                inpts[j].value = i;
                break;
            }
        }
    }
}
function findParObj(elm, tag) {
    for (i=0; elm.tagName!=tag; elm = elm.parentNode);
    return elm;
}
function myMove(elm, dir) {
    var newElm, aDivs, f, cont=gE("cont");
    f = elm.form;
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);
    aDivs = gA(cont, "DIV");
    inp = f.elements[ "x"+elm.id.split("ID")[1] ];
    if (dir=="up") {
        for ( i=1; i<aDivs.length; i++ ) {
            if ( aDivs[i]==elm ) {
                cont.removeChild(elm);
                cont.insertBefore(newElm, gA(cont, "DIV")[i-1]);
            }
        }
    }
    else if (dir=="down") {
        for ( i=1; i<aDivs.length; i++ ) {
            if ( aDivs[i-1]==elm ) {
                cont.removeChild(elm);
                if (aDivs.length>i) cont.insertBefore(newElm, gA(cont, "DIV")[i]);
                else cont.appendChild(newElm);
                break;
            }
        }
    }
    else if (dir=="out") {
        inp.setAttribute("value", parseInt(inp.value) + 1 );
        elm.style.left = ( parseInt(inp.value)*30 ) + "px";
    }
    else if (dir=="in") {
        if ( inp.value<1 ) return;
        inp.setAttribute("value", parseInt(inp.value) - 1 );
        elm.style.left = ( parseInt(inp.value)*30 ) + "px";
    }
    if (navigator.userAgent.toLowerCase().indexOf("opera")==-1) cont.innerHTML = cont.innerHTML + ""
}
</script>

<style type="text/css">
* {
    font: 11px 'ms sans serif', tahoma;
}
#cont div {
    position: relative;
    padding: 5px 10px;
    margin: 3px;
    background-color: #6699ff;
    border: 1px solid #003399;
    width: 300px;
}
#cont div input {
    width: 30px;
}
</style>

<form>
<div id="cont">
    <div id="ID_0"><span><input type="text" name="y_0" class="showInxInp"><input type="text" value="0" name="x_0" class="showX"> Nummer 0 </span><span><button onclick="myMove(this, 'up');return false">Up</button><button onclick="myMove(this, 'down');return false">Down</button><button onclick="myMove(this, 'in');return false">IN</button><button onclick="myMove(this, 'out');return false">OUT</button></span></div>
    <div id="ID_1"><span><input type="text" name="y_1" class="showInxInp"><input type="text" value="0" name="x_1" class="showX"> Nummer 1 </span><span><button onclick="myMove(this, 'up');return false">Up</button><button onclick="myMove(this, 'down');return false">Down</button><button onclick="myMove(this, 'in');return false">IN</button><button onclick="myMove(this, 'out');return false">OUT</button></span></div>
    <div id="ID_2"><span><input type="text" name="y_2" class="showInxInp"><input type="text" value="0" name="x_2" class="showX"> Nummer 2 </span><span><button onclick="myMove(this, 'up');return false">Up</button><button onclick="myMove(this, 'down');return false">Down</button><button onclick="myMove(this, 'in');return false">IN</button><button onclick="myMove(this, 'out');return false">OUT</button></span></div>
    <div id="ID_3"><span><input type="text" name="y_3" class="showInxInp"><input type="text" value="0" name="x_3" class="showX"> Nummer 3 </span><span><button onclick="myMove(this, 'up');return false">Up</button><button onclick="myMove(this, 'down');return false">Down</button><button onclick="myMove(this, 'in');return false">IN</button><button onclick="myMove(this, 'out');return false">OUT</button></span></div>
    <div id="ID_4"><span><input type="text" name="y_4" class="showInxInp"><input type="text" value="0" name="x_4" class="showX"> Nummer 4 </span><span><button onclick="myMove(this, 'up');return false">Up</button><button onclick="myMove(this, 'down');return false">Down</button><button onclick="myMove(this, 'in');return false">IN</button><button onclick="myMove(this, 'out');return false">OUT</button></span></div>
</div>
<button onclick="mySave();return false">Save</button>
</form>
Avatar billede Slettet bruger
12. september 2004 - 09:53 #23
Det er jo helt perfekt :)

Endnu engang tak for hjælpen.
Jeg lukker og slukker for dette spørgsmål.

Lidt "off talk" - du skulle vel aldrig have links til nogle gode websites til at lære Javascript? eller bøger der kan anbefales ?
Avatar billede olebole Juniormester
12. september 2004 - 15:18 #24
Jeg ved ikke rigtig, hvad der findes af 'kogebøger', men der er en fantastisk god JavaScript-reference, der hedder: "JavaScript, The Definitive Guide" fra O'Reilly. Det er som sagt ikke en kogebog, så den indeholder ikke ret mange eksempler - og så er den lidt pebret (omkring 500 kr), men er til gengæld en bibel på 7-800 sider  :)
Avatar billede Slettet bruger
12. september 2004 - 22:38 #25
Well prisen betyder ingenting hvis man får noget for pengene :)
Avatar billede olebole Juniormester
12. september 2004 - 23:03 #26
... så sandt, så sandt  ;o)
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