webForumDet fria alternativet

Problem med funktionsanrop från funktion

JavaScriptur Javascript

5 svar · 377 visningar · startad av mangan

Medlem sedan feb. 2003216 inlägg
Frågan#1

Hej!

Jag har en funktion som kopierar ett ifyllt värde till andra delar av mitt formulär. Dock så exikverar inte scriptet som jag förväntar mig.

function setShipment(box){
    // Kolla om boxen är ifylld
    if(box.checked){
        boxId            = box.id;
        selId             = 'sel' + boxId.substring(3);
        selectedIndex = document.getElementById(selId).selectedIndex;

        // Gå igenom alla checkboxar och se om dom skall kryssas i
        boxes = document.getElementsByTagName("input");
        for(i=0;i<boxes.length;i++){
            boxObj   = boxes[i];
            boxObjId = boxObj.id;
            // Ska vi fylla i denna box?
            if(boxObjId.indexOf(boxId+'Batch') > -1){
                // Fyll i box
                boxObj.checked = true;
                // Sätter index på motsvarande SELECT
                selId = 'sel' + boxObjId.substring(3);
                selObj = document.getElementById(selId);
                selObj.selectedIndex = selectedIndex;
                // Kör setBatch
                setBatch(boxObj);
            }
        }
    }
}

function setBatch(box){
    // Kolla om boxen är ifylld
    if(box.checked){
        boxId = box.id;
        selId  = 'sel' + boxId.substring(3);
        index = document.getElementById(selId).selectedIndex;
        sels   = document.getElementsByTagName("select");
        // Kolla om vi ska ändra index på denna SELECT
        for(j=0;j<sels.length;j++){
            obj   = sels[j];
            objId = obj.id;
            // Skall vi ändra index?
            if(objId.indexOf(selId + 'Serial') > -1){
                obj.selectedIndex = index;
            }
        }
    }
}

Först anropas setShippment och därifrån skall det ske minst 2 anrop till setBatch i if-satsen. Dock sker det bara ett och sen så avslutas funktionen. Detta är väldigt konstigt. Jag har skrivit ut vad i är när jag går ur funktionen och det är i mitt fall 5 vilket är rätt. Dock går man in i if-satsen när i är 3 och sen ska man göra det när i == 4 också men det verkar som om den inte "hänger med" pga sitt anrop till setBatch. När jag struntar i anropet till setBatch så funkar setShipment som den skall. Fattar inget och har felsökt som en idiot utan något resultat.

Är det något man måste veta när man gör anrop till andra funktioner inom en funktion i JavaScript?

Medlem sedan dec. 20025 483 inlägg
#2

Du har inte lust att skicka med ett komplett exempel som visar på problemet? Det blir lättare att följa med i svängarna då ;)

Medlem sedan feb. 2003216 inlägg
#3

Jag har gjort vad jag tycker är en workaround som funkar.

function setShipment(box){
    // Check if box is checked
    if(box.checked){
        // En liten array för att lagra objekt
        boxArr = new Array();
        boxId         = box.id;
        selId         = 'sel' + boxId.substring(3);
        selectedIndex = document.getElementById(selId).selectedIndex;

        // Lookup boxes to check
        boxes = document.getElementsByTagName("input");
        for(i=0;i<boxes.length;i++){
            boxObj   = boxes[i];
            boxObjId = boxObj.id;
            // Should we check this box?
            if(boxObjId.indexOf(boxId+'Batch') > -1){
                // Check box
                boxObj.checked = true;
                // Set corresponding SELECT
                selId = 'sel' + boxObjId.substring(3);
                selObj = document.getElementById(selId);
                selObj.selectedIndex = selectedIndex;
                // Call setBatch
                // Fyll på arrayen med de objekt som skall skickas till setBatch
                boxArr.push(boxObj);
            }
        }
        // Gör samtliga anrop till setBatch
        for(h=0;h<boxArr.length;h++)
            setBatch(boxArr[h]);
    }
}

Nu funkar det som sagt men jag kan verkligen inte se varför detta skulle funka och inte det andra.
Är det samma objekt som man använder i dom två anropen?
Skickas objektet per referens eller som en kopia till setBatch i första exemplet?
Isf kan man ju tänka sig att det blir något fel om man pekar om referensen. Mycket mystiskt tycker jag ändå.

Vill ni fortfarande se mer kod?

Medlem sedan dec. 20025 483 inlägg
#4

Det jag menade var att tillhörande HTML-kod kan vara av intresse, så man ser med blotta ögat vad som går fel.

Skickas objektet per referens eller som en kopia till setBatch i första exemplet?

Referens.

Medlem sedan feb. 2003216 inlägg
#5

Ok, här kommer en maffig klistring av kod! :D Som ni ser så är det en massa PHP också, hoppas det itne gör något:

  <table width="970" border="0" cellpadding="1" cellspacing="0">

          <?php
if(isset($shipments) && isset($status)){
    $db = new dbHandler();
    $bnr      = 0;
    $shipNr   = 0;
    $i        = 0;

    reset($shipments);
    foreach($shipments as $shipNr => $shipment){
        $shipId = "Ship$shipNr";

        echo "<tr>\n";
        echo "<td>\n";

        echo "<table width=\"100%\" border=\"0\" cellpadding=\"1\" ";
        echo "cellspacing=\"0\" class=\"shipment\">\n";
        echo "<tr>\n";
        echo "<td colspan=\"4\" align=\"left\" valign=\"middle\" ";
        echo "class=\"bigBlueTextBold\">\n";
        echo "Skeppning: $shipNr</td>\n";
        echo "</tr>\n";

        echo "<tr>\n";
        echo "<td colspan=\"4\" align=\"left\" valign=\"middle\" ";
        echo "class=\"greyCellBlackText\">\n";
        echo "<input type=\"checkbox\" id=\"box$shipId\" value=\"yes\" ";
        echo "onClick=\"setShipment(this)\">";
        echo "Sätt status&nbsp;";
        echo "<select class=\"dropDown\" id=\"sel$shipId\" ";
        echo "onChange=\"setShipment(document.getElementById('box$shipId'))\" ";
        echo "id=\"$id\">\n";
        reset($status);
        foreach($status as $stNr => $stText)
            if($stNr == 5)
                echo "<option value=\"$stNr\" selected>$stText</option>\n";
            else
                echo "<option value=\"$stNr\">$stText</option>\n";
        echo "</select>\n";
        echo "för denna skeppning</td>\n";
        echo "</tr>\n";

        // Loop through all batches
        reset($shipment);
        foreach($shipment as $bnr){
            $batchId = $shipId."Batch$bnr";
            echo "<tr>\n";
            echo "<td colspan=\"4\" align=\"left\" valign=\"middle\" ";
            echo "class=\"whiteCellBlackText\">\n";
            echo "&nbsp;</td>\n";
            echo "</tr>\n";

            echo "<tr>\n";
            echo "<td colspan=\"4\" align=\"left\" valign=\"middle\" ";
            echo "class=\"bigBlueTextBold\">\n";
            echo "Batch: $bnr</td>\n";
            echo "</tr>\n";

            echo "<tr>\n";
            echo "<td colspan=\"4\" align=\"left\" valign=\"middle\" ";
            echo "class=\"greyCellBlackText\">\n";
            echo "<input type=\"checkbox\" id=\"box$batchId\" value=\"yes\" ";
            echo "onClick=\"setBatch(this)\">";
            echo "Sätt status&nbsp;";
            echo "<select class=\"dropDown\" id=\"sel$batchId\" ";
            echo "onChange=\"setBatch(document.getElementById('box$batchId'))\">\n";
            reset($status);
            foreach($status as $stNr => $stText)
                if($stNr == 5)
                    echo "<option value=\"$stNr\" selected>$stText</option>\n";
                else
                    echo "<option value=\"$stNr\">$stText</option>\n";
            echo "</select>\n";
            echo "för denna batch</td>\n";
            echo "</tr>\n";

            echo "<tr>\n";
            echo "<td align=\"left\" valign=\"middle\" ";
            echo "class=\"redCellWhiteTextBold\" width=\"100\">\n";
            echo "Serienummer</td>\n";
            echo "<td align=\"left\" valign=\"middle\" ";
            echo "class=\"redCellWhiteTextBold\" width=\"230\">\n";
            echo "Status</td>\n";
            echo "<td align=\"left\" valign=\"middle\" class=\"redCellWhiteTextBold\">\n";
            echo "Klar senast</td>\n";
            echo "</tr>\n";

            // Get batch
            if($batch = $db->getBatch($bnr)){
                // Loop through all prods
                $i = 0;
                reset($batch);
                foreach($batch as $prod){
                    $snr    = $prod["serial"];
                    $st     = $prod["statusNr"];
                    $done   = $prod["done"];
                    $prodId = $batchId."Serial$snr";

                    if($i % 2 == 0)
                        $class = "greyCellBlackText";
                    else
                        $class = "whiteCellBlackText";

                    echo "<tr>\n";
                    echo "<td align=\"left\" valign=\"middle\" class=\"$class\">\n";
                    echo "$snr</td>\n";
                    echo "<td align=\"left\" valign=\"middle\" class=\"$class\">\n";
                    echo "<select class=\"dropDown\" id=\"sel$prodId\" ";
                    echo "name=\"sel$prodId\">\n";
                    reset($status);
                    foreach($status as $stNr => $stText)
                        if($st == $stNr)
                            echo "<option value=\"$stNr\" selected>$stText</option>\n";
                        else
                            echo "<option value=\"$stNr\">$stText</option>\n";

                    echo "</select>\n";
                    echo "</td>\n";
                    echo "<td align=\"left\" valign=\"middle\" class=\"$class\">\n";
                    echo "$done</td>\n";
                    echo "</tr>\n";
                    $i++;
                }
            }
        }

        echo "</table>";
        echo "</td>\n";
        echo "</tr>\n";

        echo "<tr>\n";
        echo "<td>\n";
        echo "&nbsp;";
        echo "</td>\n";
        echo "</tr>\n";

    }
    // Close database connection
    $db->close();

} // End IF batches
?>
  </table>

SÅ, det var det hela.

Medlem sedan dec. 20025 483 inlägg
#6

Bättre vore det om du klistrade in HTML-kod endast (Visa källa) :)

138 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)