Avatar billede bigo Nybegynder
16. december 2006 - 21:10 Der er 16 kommentarer og
1 løsning

ændrede data skrives ikke til html koden

Hejsa.

Olebole hjalp mig med følgende script:


function myMove(elm, dir) {
    var newElm, aDivs, cont=gE("cont");
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);
    aDivs = gA(cont, "DIV");
    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;
            }
        }
    }
      if (navigator.userAgent.toLowerCase().indexOf("opera")==-1) cont.innerHTML = cont.innerHTML + "";
      calc_all();
}


Men hvis jeg kigger i html koden så er der ikke noget der ændrer sig der.. og calc_all(); bruger tydeligvis kun det som den har i html koden.

Skriver cloneNode f.eks. ikke i htmlfilen eller hvordan skal jeg kunne få mine kalkulering til at fungere efter en flytning?
var d=document;
function gE(id){return d.getElementById(id)}
function gA(o,tag){return o.getElementsByTagName(tag)}


function calc_time(n,m)
{
    if (n==0)
    {
        var t1 = d.getElementById('start_time'+[n]).value;
    }
    else if (n>0)
    {
        var t1 = d.getElementById('real_time'+[n-1]).value;
    }

    var t2 = d.getElementById('nom_time'+[n]).value;

    if (n==0)
    {
        var t3 = d.getElementById('trans_time'+[n]).value="00:00";
    }
    else if (n>0)
    {
        var t3 = d.getElementById('trans_time'+[n]).value;
    }
   
    tid1 = sek(t1);
    tid2 = sek(t2);
    tid3 = sek(t3);
    if (n==0)
        tid = tid1 + tid2;
    else
        tid = tid1 + tid2 + tid3;
    strtidtim = Math.floor(tid/3600);
    strtidmin = Math.floor((tid % 3600)/60);
    if (strtidtim < 10) strtidtim = "0" + strtidtim;
    if (strtidmin < 10) strtidmin = "0" + strtidmin;
    return (strtidtim + ":" + strtidmin);
}

function sek(str)
{
    tiden = str.slice(0, 2) * 60 * 60;
    tiden += str.slice(3, 5) * 60;
    return tiden;
}


function calc_all()
{
    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=="showTimeInp")
            {
                inpts[j].value = gE(inpts[j].id).value;
                if ( inpts[j].id.replace(/[0-9]/,"") == "real_time")
                {
                    inpts[j].value = calc_time(i);
                }
            }
        }
    }
}
Avatar billede erikjacobsen Ekspert
16. december 2006 - 21:41 #1
HTML-koden ændrer sig ikke en dyt når du laver om i DOM-træet.
Jeg vil tro du skal sætte className efter kloningen.
Avatar billede bigo Nybegynder
17. december 2006 - 10:12 #2
Ja, jeg vågnede osse her til morgen og tænkte - du er sgu da dum i hovedet.. det kan den sg da ikke... så ja, jeg må jo ty til andre midler..
Avatar billede erikjacobsen Ekspert
17. december 2006 - 10:15 #3
Midlerne er skam gode nok. Når du løber igennem med getElementById eller getElementsByTagName, så får du også dem du har oprettet. Så vidt jeg husker, uden at have prøvet din kode, så vil især IE ikke altid lave korrekte kloner, så måske er det eneste du mangler at sætte className efter kloning. Eller prøv en anden browser. Ellers prøv at se hvad din for-løkke til sidst rent faktisk får fat i.
Avatar billede bigo Nybegynder
17. december 2006 - 10:22 #4
Du mener noget ala:

  newElm = elm.cloneNode(true).className;

eller

cont.insertBefore(newElm.className, gA(cont, "DIV")[i]);
Avatar billede bigo Nybegynder
17. december 2006 - 10:22 #5
Jeg prøver lige og finde ud af hvad den gør.
Avatar billede erikjacobsen Ekspert
17. december 2006 - 10:33 #6
Jeg mente nok, i første omgang, bare:

  newElm.className = 'showTimeInp';

Men prøv med testudskrifter (alert) at se om al ting passer.
Avatar billede bigo Nybegynder
17. december 2006 - 10:44 #7
Nogen resoneren frem og tilbage i mit lille hoved siger mig at det måske ikke er flytningen men mere calc_all funktionen der er noget galt med.. hvorfor ved jeg ikke helt men ... eller nej, når jeg starter uden at have flyttet noget rundt så beregner den fint og rigtigt. damn .. jeg river totter af mit hovede over denne..
Avatar billede bigo Nybegynder
17. december 2006 - 10:51 #8
så når der er flyttet rundt så vil calc_time stadig kunne få fat i de rigtige ting med
var t1 = d.getElementById('start_time'+[n]).value;
Jeg skal ikke have inpts[j] med i kaldet inpts[j].value = calc_time(i);
Avatar billede erikjacobsen Ekspert
17. december 2006 - 11:10 #9
Ja, måske. Det er ikke til at sige hvad der er galt, når man tager det helt ud af sammenhæng.
Avatar billede bigo Nybegynder
17. december 2006 - 11:10 #10
alert (t1tag + "-" + t1  + " " + t2tag + "-" + t2 + " " + t3tag + "-" + t3);
   
blev tilføjet i calc_time og uanset hvad jeg gør så er t1 = f.eks. start_time0 (rigtigt) men værdien er 12:00 uanset hvad jeg flytter rundt på. Så det er som om at værdierne ikke bliver flyttet helt med
Avatar billede bigo Nybegynder
17. december 2006 - 22:24 #11
hvis jeg skriver noget ala alert(cont); så får jeg en temmelig stor alertbox op med al htmlkode mellem <div id='cont'></div>
aDivs = gA(cont, "DIV"); refererer tydeligvis på divs som er imellem cont-diven. Men hvordan kan jeg referere til dette data. Jeg har prøvet cont.getElementById('start_time'+[i]) og aDivs.id (som giver mig ID_[0-2] som jo er id på de divs som er imellem <div id='cont'></div>
Jeg ville jo gerne kunne f.eks. aDivs.start_time[0] eller aDivs.getElementById(start_time+[i]) men det vil den ikke lade mig.. giver fejl omkring objektet ikke understøtter denne form (eller noget der ligner..)

Hjæææææælp.. (pt er jeg vist mere træt i hjernen end som så.. ) - skulle jeg ikke natte nu.. og se hvad næste år byder (o;
Avatar billede erikjacobsen Ekspert
17. december 2006 - 22:38 #12
Det er det, der er så sjovt ved programmering: man aner aldrig på forhånd hvor lang tid, det vil tage at løse et problem ;)

Men vil du have hjælp til det fra os andre, skal du til at sætte et lille eksempel sammen, som vi kan prøve, og rette i.
Avatar billede bigo Nybegynder
18. december 2006 - 07:33 #13
Weeeeelll,, kigger man på den kode jeg har lagt i toppen her så er der noget javascripts som jeg benytter mig af .. Jeg fandt ud af - efter jeg "nattede" at problemet ligger i funktionen calc_all. Den henter data fra
var inpts, divs = gA(gE("cont"), "DIV");

Som er den "yderste" div. som tydeligvis er den der er skrevet og fortalt i den afleverede htmlside. Det gør myMove osse men den leverer en variabel - cont - som jeg ikke kan tilgå - på grund af ignorance og stupiditet.. - Så mine famlende forsøg går ud på at få smasket den variabel cont over til calc_all (subsidært calc_time)= for at beregne på de data der er i variablen.

Lad mig give eksempel - som jeg ser det:

function myMove(elm, dir) {
    var newElm, aDivs, cont=gE("cont");
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);

hvor cont = hent alt hvad der står i elementet "cont" i htmldom (går jeg ud fra).

Samme skidt står i calc_all:

    var inpts, divs = gA(gE("cont"), "DIV");

Og derfor vil alle beregninger blive lavet på "gamle" data som ikke er blevet flyttet rundt. Så jeg vil gerne have "cont" over til calc_all. No problemo. Variabel:

calc_all(cont);

for derefter i calc_all

inpts[j].value = calc_time(i,cont);

en alert (cont); viser at jeg har fået det hele med.. men hvordan tilgår jeg så lige data i cont fra calc_all eller calc_time?
En alert (cont.getElementById('start_time'+[i]); eller andre futile forsøg er alle gået i vasken.

Hvordan jeg skal give et eksempel udover det jeg har gjort i toppen? Jeg vil gerne give hele koden..

Oh what the helle olesen... here comes:


Her sparer jeg jer for en smule php/db kald:


<html>
<head>
    <link rel=stylesheet href='./css/style.css' type='text/css'>
    <script type='text/javascript' src='jscript/time_check.js'></script>

<script language="javascript">
<!--


var d=document;
function gE(id){return d.getElementById(id)}
function gA(o,tag){return o.getElementsByTagName(tag)}

function calc_time(n,aDivs)
{
    if (n==0)
    {
        var t1 = gE('start_time'+[n]).value;
    }
    else if (n>0)
    {
        var t1 = gE('real_time'+[n-1]).value;
    }

    var t2 = gE('nom_time'+[n]).value;

    if (n==0)
    {
        var t3 = gE('trans_time'+[n]).value="00:00";
    }
    else if (n>0)
    {
        var t3 = gE('trans_time'+[n]).value;
    }
   
    tid1 = sek(t1);
    tid2 = sek(t2);
    tid3 = sek(t3);
    if (n==0)
        tid = tid1 + tid2;
    else
        tid = tid1 + tid2 + tid3;
    strtidtim = Math.floor(tid/3600);
    strtidmin = Math.floor((tid % 3600)/60);
    if (strtidtim < 10) strtidtim = "0" + strtidtim;
    if (strtidmin < 10) strtidmin = "0" + strtidmin;
    return (strtidtim + ":" + strtidmin);
}

function sek(str)
{
    tiden = str.slice(0, 2) * 60 * 60;
    tiden += str.slice(3, 5) * 60;
    return tiden;
}


function calc_all(aDivs)
{
    var inpts, divs = gA(gE("cont"), "DIV");
    for ( i=0; i<divs.length; i++ )
    {
        alert (aDivs[i].);
        inpts = gA(divs[i], "INPUT");
        for ( j=0; j<inpts.length; j++ )
        {         
            if (inpts[j].className=="showTimeInp")
            {
                inpts[j].value = gE(inpts[j].id).value;
                if ( inpts[j].id.replace(/[0-9]/,"") == "real_time")
                {
                    inpts[j].value = calc_time(i,aDivs);
                }
            }
        }
    }
}

function findParObj(elm, tag) {
    for (i=0; elm.tagName!=tag; elm = elm.parentNode);
    return elm;
}

function myMove(elm, dir) {
    var newElm, aDivs, cont=gE("cont");
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);
 
    aDivs = gA(cont, "DIV");
    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;
            }
        }
    }
      if (navigator.userAgent.toLowerCase().indexOf("opera")==-1) cont.innerHTML = cont.innerHTML + "";
       
        calc_all(aDivs);
}

//-->
</script>

</head>

<body>
<table>
<tr>
    <td>Drive Leaf</td>
</tr>
</table>
<form name=push_citizen action=<?=$_SERVER[PHP_SELF];?> method=post>


<div id="cont">

<?
    $i=0;
    while ($row = mysql_fetch_assoc($res))
    {
        echo "
    <div id='ID_$i'>
        <table>
                <tr class='header'>
                    <td colspan=4>
                      &nbsp;
                  </td>
                  <td>
                      First Name
                  </td>
                  <td>
                      Last Name
                  </td>
                  <td>
                      Transport Time
                  </td>
                  <td>
                      Start Time
                  </td>
                  <td>
                      Nom. Time
                  </td>
                  <td>
                      Real Time
                  </td>
                </tr>
        <tr>
            <td>
                <input type=image id='$row[c_id]' name=push_citizen src='/images/Left1.gif' border=0 onclick='sent_citizen_id.value=this.id;'>
            </td>
            <td>
                <input type=image src='/images/Up1.gif' border=0 onclick=\"myMove(this, 'up')\">
                <input type=image src='/images/Down1.gif' border=0 onclick=\"myMove(this, 'down')\">
            </td>
            <td>
                <input type=hidden id=citizen_id$i name=citizen_id[] value='$row[c_id]' class='showInxInp'>
            </td>
            <td>
                <input type=hidden id=service_rel_id$i name=service_rel_id[] value='$row[service_rel_id]' class='showInxInp'>
            </td>
            <td>
                <input type=text id=first_name$i name=first_name[] value='$row[c_first_name]' class='showInxInp'>
            </td>
            <td>
                <input type=text id=last_name$i name=last_name[] value='$row[c_last_name]' class='showInxInp'>
            </td>
            <td>
                <input type=text id=trans_time$i name=trans_time[] size=5 value='".(($row[trans_time] != "00:00") ? date("H:i", strtotime($row[trans_time])) : "00:15")."' class='showTimeInp' onchange='this.value=calc_all();'>
            </td>
            <td>
                <input type=text id=start_time$i name=start_time[] size=5 readonly value='".date("H:i", strtotime($row[start_time]))."' class='showTimeInp'>
            </td>
            <td>
                <input type=text id=nom_time$i name=nom_time[] size=5 readonly value='".date("H:i", strtotime($row[nom_time]))."' class='showTimeInp'>
            </td>
            <td>
                <input type=text id=real_time$i name=real_time[] size=5 value='".date("H:i", strtotime($row[real_time]))."' class='showTimeInp' onchange='this.value=calc_all();'>
            </td>
                </tr>
                <tr>
                    <td colspan=4>
                    &nbsp;
                    </td>
            <td colspan=6>
                <textarea id=service_text$i name=service_text[] cols=50 rows=3>$row[service_text]</textarea>
            </td>
                </tr>
            </table>
        </div>
        ";
        $i++;
    } // end while
?>

</div>

her er osse noget php/db dumpap ting.. ignore at will..
Avatar billede erikjacobsen Ekspert
18. december 2006 - 09:23 #14
Et andet eksempel tak - kun med Javascript og HTML - allerhelst et link til en side. Samt en forklaring om hvad der skal virke, som ikke gør.
Avatar billede bigo Nybegynder
18. december 2006 - 09:38 #15
Fik løst det ved at sidde og lege lidt..

function gT(cont, id, pos) {return cont.children[id].getElementsByTagName("input")[pos].value}

function calc_time(n, cont)
{
    // rækkefølge i cont
    // 7=trans_time, 8=start_time, 9=nom_time, 10=real_time
    if (n==0)
    {
        t1 = gT(cont, n, 8);
    }
    else if (n>0)
    {
        t1 = gT(cont, n-1, 10);
    }

    t2 = gT(cont, n, 9);

    if (n==0)
    {
        t3 = gT(cont, n, 7);
    }
    else if (n>0)
    {
        t3 = gT(cont, n, 7);
    }
   
    tid1 = sek(t1);
    tid2 = sek(t2);
    tid3 = sek(t3);
    if (n==0)
        tid = tid1 + tid2;
    else
        tid = tid1 + tid2 + tid3;
    strtidtim = Math.floor(tid/3600);
    strtidmin = Math.floor((tid % 3600)/60);
    if (strtidtim < 10) strtidtim = "0" + strtidtim;
    if (strtidmin < 10) strtidmin = "0" + strtidmin;
    return (strtidtim + ":" + strtidmin);
   
}

function sek(str)
{
    tiden = str.slice(0, 2) * 60 * 60;
    tiden += str.slice(3, 5) * 60;
    return tiden;
}


function calc_all(cont)
{
    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=="showTimeInp")
            {
                inpts[j].value = gE(inpts[j].id).value;
                if ( inpts[j].id.replace(/[0-9]/,"") == "real_time")
                {
                    inpts[j].value = calc_time(i, cont);
                }
            }
        }
    }
}

function findParObj(elm, tag) {
    for (i=0; elm.tagName!=tag; elm = elm.parentNode);
    return elm;
}

function myMove(elm, dir) {
    var newElm, aDivs, cont=gE("cont");
    elm = findParObj(elm, "DIV");
    newElm = elm.cloneNode(true);
 
    aDivs = gA(cont, "DIV");
    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;
            }
        }
    }
      if (navigator.userAgent.toLowerCase().indexOf("opera")==-1) cont.innerHTML = cont.innerHTML + "";
       
        calc_all(cont);
}
Avatar billede bigo Nybegynder
18. december 2006 - 09:45 #16
Yeha.. fedt.. godt.. glad mand.. skal sg æde mig fed i chokolade nu.. og masser af kaffe.. skal have blodtrykket endnu højere op.. arg.. der faldt det igen..
Avatar billede bigo Nybegynder
18. december 2006 - 12:35 #17
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