• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] FOR-Schleifenabbruch, sobald diese auf eine Funktion stößt

centauros

New member
Hi Forum,

ich habe ein Formular, in dem ich alle Checkboxes mit einem Button aktiviere und gleichzeitig alle dahinter liegenden Values und dazugehörigen Id's an eine Funktion übergebe und durch eine For-Schleife jage.

Diese For-Schleife enthält eine weitere Funktion an die die übergebenen Id's und Values ebenfalls übergeben werden.

Problem dabei ist das die For-Schleife immer nur einmal durchlaufen wird, obwohl alle genannten Werte, die hinter den Checkboxen stehen, an die erste Funktion übergeben werden.

Kommentiere ich die Funktion in der For-Schleife aus und setze stattdessen ein alert(id), dann zeigt mir das alert(id) nacheinander alle id's an.
Das sagt mir das meine Schleife also richtig funktioniert.
Sobald ich jedoch die Funktion in der For-Schleife wieder rein nehme, dann unterbricht die For-Schleife den weiteren Durchlauf, sobald sie auf die darin enthaltene Funktion stößt.

Ich habe auch schon in die zweite Funktion ein alert(id) gesetzt und es kommt tatsächlich immer nur die erste id an.

Auch wenn ich die Funktion in der For-Schleife in ein "setTimeOut("Funktion()", 50)" setze, kommt auch nur die erste id an.

Wo ist der Haken?

Hier der Code:

HTML:
           function selection(opt) {
            var selected = new Array();
            var index = 0;
            var id="";
            var invoicenr="";
            for (var intLoop = 0; intLoop < opt.length; intLoop++) {
                opt[intLoop].checked = true;
               if ((opt[intLoop].selected) ||
                   (opt[intLoop].checked)) {
                  index = selected.length;
                  selected[index] = new Object;
                  selected[index].value = opt[intLoop].value;
                  selected[index].index = intLoop;
                  id = selected[index].index;
                  invoicenr = selected[index].value;
                  catch_rowid_to_print(id, invoicenr); //Alle id's und Rechnungsnummern an diese Funktion übergeben--->klappt leider nicht! :-(
               }
            }
                  document.getElementById('print').style.display="block";
            //return selected;
            
         }  

<form>
            <table width="100%">
        <?php        
        $heute = strtotime(date("d.m.Y"));
        $datum = date("d.m.Y");
        $i=1;
                while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                                $Rechnungsnummer = $row["Rechnungsnummer"];
                                $mahnempfaenger = $row["Mahnempfaenger"];
                                $zahlungsziel_calc = strtotime($row['Zahlungsziel']);
                                $zahlungsziel = $row['Zahlungsziel'];
                                $mahnstufe = $row['Mahnstufe'];
                                $differenz = $heute-$zahlungsziel_calc;
                                $differenz = $differenz / 86400;
                                $faellig = round($differenz,0);
                        
                        ?>
                        
                        <tr><td class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>' width="130px"><font color='#000000'><?php echo $row['Rechnungsnummer']; ?></font></td>
                        <td class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>'  width="96px"><font color='#000000'><?php echo $zahlungsziel; ?></font></td>
                        <?php 
                        if ($zahlungsziel>$heute) {
                            ?> 
                            <td class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>'></td>
                        <?php
                        } else {
                            
                                $timestamp = time();
                                $systemdatum = date("d.m.Y", $timestamp);
                            ?> 
                            
                            <td class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>' width="92px"><font color='#000000'> <?php if ($faellig<$systemdatum) { echo "in ".$faellig*-1;  } else { echo "seit ".$faellig; } ?> Tagen</font></td>
                        <?php
                        }
                        ?>
                        <td class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>' width="25px"><font color='#000000'><center><?php echo $mahnstufe; ?></center></font></td>
                        <td align='center' class='row_<?PHP echo $i % 2; ?>' value='<?php echo $i; ?>' width="23px"><input type='checkbox' name='prnt' id='<?php echo $i; ?>' value='<?php echo $Rechnungsnummer; ?>' onChange='javascript:catch_rowid_to_print(this.id, this.value);'></td></tr>

        <?php
                $i++;
                }

        ?>

<td colspan="2"><input type="button" value=" Alle selektieren " onClick="this.value=selection(this.form.prnt_cbx)"></td>
</form>

Wäre echt große Klasse, wenn Ihr mir weiterhelfen würdet.

Besten Dank und schöne Grüße aus Kölle
 
Zuletzt bearbeitet von einem Moderator:
Wie sieht denn die Funktion "catch_rowid_to_print" aus? Hat die eventuell ein return?
 
Die sieht folgendermaßen aus:

HTML:
<script type="text/javascript">
	var needle = [];
	function catch_rowid_to_print(id, invoicenr) {
alert(invoicenr);
		check_invoice = document.getElementById(id);
		send_id = "id[]='"+invoicenr+"'";
		
		if (check_invoice.checked==true) {
			needle.push(send_id); 
		} else {
			for (var i=needle.length-1; i>0; i--) {
				if (needle[i] == send_id) {
					needle.splice(i, 1);
					break;
				}
			}
		}

	if (check_invoice.checked==false && needle.length===1) {
		document.getElementById('print').style.display = "none"; 
	} else {
		document.getElementById('print').style.display = "block"; 
	}

		var x=document.getElementById("invoicenumbers");
		picup_needles = needle.join("&&");
	 
	 	x.value = picup_needles;
	 	
	 	print_documents(picup_needles, false);
	}
</script>

Wenn ich die Checkboxen einzeln anklicke, dann funktioniert alles ohne Probleme.
 
Hi!

Für den PHP-Code entschuldige ich mich. Der Vollständigkeit halber wollte ich einfach mal alles zusammen posten. Hat auch nen positiven Nebeneffekt....wer es braucht, kann es verwenden, wenn es fertig ist.


Und.....ich habe den Fehler gefunden:
In der Funktion catch_rowid_to_print(id, invoicenr) wird als id der erste Array-Wert übergeben, der gefunden wurde. Das ist in der Regel "0".
Da meine Checkboxen mit dem Wert "1" beginnen, ist die Funktion vor die Wand gefahren und hat zum Abbruch geführt.

Grund ist:

check_invoice = document.getElementById(id);
if (check_invoice.checked==true) { <----------
needle.push(send_id);
}

Genau diese Anweisung hat die Funktion zum Scheitern verurteilt, da das Ergebnis "null" ist.

Lösung:

Ich addiere in der Funktion catch_rowid_to_print(id, invoicenr), die in der For-Schleife steckt, zur "id" eine 1-----> also catch_rowid_to_print(id+1, invoicenr) , dann wird auch alles korrekt verarbeitet und es gibt keinerlei Fehler in der Fehlerkonsole.

Allerdings gibt es noch ein kleines Problem:

Der Button, der mir alle Checkboxen anhakt erhält nach dem Klick darauf den Text "undefined". ?!?!?!?!?!

Wisst Ihr warum? Ich finde gerade die Lösung nicht.
 
Zuletzt bearbeitet:
Weil du im onclick ein this.value = ... machst. Damit veränderst du den value, also den Text des Buttons. Ein
Code:
onclick="selection(this.form.prnt_cbx);"
dürfte reichen.

BTW: Die neue (schöne) Schreibweise ist onclick nicht onClick...
 
Ach jau....ich hätte es sehen sollen/müssen. ;-)

Besten Dank!

MOD--->Bitte Post schließen! Thx und schönen Tag noch!
Bis zum nächsten Mal!!!
 
Zurück
Oben