Romina: Rechenweg mit onKeyup ??

Hallo liebe Forengemeinde :o)

's will einfach nicht :o(

--------------------------------------------------------------------

<script language = "text/javascript">

function rechnen_i(i)
{
   window.document.konf.ergebnis[i].value = window.document.konf.bez[i].value * window.document.konf.addit[i].value;
}

</script>

<table width="575" cellspacing="0" cellpadding="10" border="0">
  <tr>
    <td>
   <pre>
   <form name="konf">
   <table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr>
    <td bgcolor="#B4B4B4"> Option</td>
    <td bgcolor="#C3C3C3"> Preis</td>
    <td bgcolor="#D2D2D2"> Bedarf</td>
    <td bgcolor="#E1E1E1"> Preis</td>
  </tr>
  <?
  for ($numero=1; $numero<=7; $numero++)
  {
  include("inc/zusatz_ini.php"); ?>
  <tr>
    <td><? echo "$bezeichnung"; ?></td>
    <td><input type="text" name="addit[<?=$numero;?>]" size="5" value="<? echo "$preis_m"; ?>" readonly></td>
    <td><input type="text" name="bez[<?=$numero;?>]" value="0" size="5" onKeyup="rechnen_i(<?=$numero;?>);"></td>
    <td><input type="text" name="ergebnis[<?=$numero;?>]" value="0" size="5" readonly></td>
  </tr>
  </table>
</form>
</pre>
 </td>
  </tr>
</table>

--------------------------------------------------------------------

Hat Jemand ne Idee, wie es funktionieren könnte?

Gruß Romi :o)

  1. Hallo,

    hönntest du erklären, was passieren soll, und es ohne PHP posten?

    Grüße aus Düsseldorf,

    Aleksej

    1. Klar :o)

      mit dieser Funktion sollen bez[X] und addit[X] multipliziert und als ergebnis[X] ausgegeben werden.
      Da das ganze aus einer For-Schleife aufgerufen wird, muß das ganze indexiert werden (nehme ich an).

      <script language = "text/javascript">

      function rechnen_i(i)
      {
         window.document.konf.ergebnis[i].value = window.document.konf.bez[i].value * window.document.konf.addit[i].value;
      }

      </script>

      <table width="575" cellspacing="0" cellpadding="10" border="0">
        <tr>
          <td>
            <form name="konf">
            <table width="100%" cellspacing="0" cellpadding="0" border="0">

      <tr>
                <td><input type="text" name="addit[1]" size="5" value="23" readonly></td>
                <td><input type="text" name="bez[1]" value="0" size="5" onKeyup="rechnen_i(1);"></td>
                <td><input type="text" name="ergebnis[1]" value="0" size="5" readonly></td>
              </tr>

      <tr>
                <td><input type="text" name="addit[2]" size="5" value="15" readonly></td>
                <td><input type="text" name="bez[2]" value="0" size="5" onKeyup="rechnen_i(2);"></td>
                <td><input type="text" name="ergebnis[2]" value="0" size="5" readonly></td>
              </tr>

      <tr>
                <td><input type="text" name="addit[3]" size="5" value="13" readonly></td>
                <td><input type="text" name="bez[3]" value="0" size="5" onKeyup="rechnen_i(3);"></td>
                <td><input type="text" name="ergebnis[3]" value="0" size="5" readonly></td>
              </tr>

      </table>
            </form>
          </td>
        </tr>
      </table>

      1. Klar :o)

        mit dieser Funktion sollen bez[X] und addit[X] multipliziert und als ergebnis[X] ausgegeben werden.

        Das wussten wir schon! :)

        Dein Fehler ist also, dass keine Berechnung zustande kommt, oder das etwas falsch berechnet wird oder ...?

        Wenn ich vom ersteren ausgehe, prüfe mal ob onKeyup überhaupt funktioniert und
        setzte anstatt der funktion mal ein alert
        wenn das geht, setzte die funktion wieder ein und in ihr ein alert und lass dir dort die beiden werte ausgeben, die du multiplizieren willst,
        geht das auch , lass dir mit einem alert das ergebnis danach ausgeben
        Irgendwo in dieser Reihe, schätze ich wirst Du ein Problem finden, poste das dann mal, wenn Du nicht schon selbst darauf kommst
        Manchmal liegt der Teufel im Detail

        grüsse
        romy

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        ->Alles ist gut wenn es aus Schokolade ist
      2. Hallo,

        window.document.konf.ergebnis[i].value = window.document.konf.bez[i].value * window.document.konf.addit[i].value;

        Hier liegt der fehler: Du darfst bei einer Namenszuweisung keine Eckigen klammern verwenden, sonst denkt der JS Interpretator, du würdest auf ein Formularelement zugreifen mit der nummer i.

        <td><input type="text" name="addit[1]" size="5" value="23" readonly></td>
                  <td><input type="text" name="bez[1]" value="0" size="5" onKeyup="rechnen_i(1);"></td>
                  <td><input type="text" name="ergebnis[1]" value="0" size="5" readonly></td>

        Grüße aus Düsseldorf,

        Aleksej

        1. Wie kann ich denn die Sache sonst aus einer Schleife heraus aufrufen?

          Hallo,

          window.document.konf.ergebnis[i].value = window.document.konf.bez[i].value * window.document.konf.addit[i].value;

          Hier liegt der fehler: Du darfst bei einer Namenszuweisung keine Eckigen klammern verwenden, sonst denkt der JS Interpretator, du würdest auf ein Formularelement zugreifen mit der nummer i.

          <td><input type="text" name="addit[1]" size="5" value="23" readonly></td>
                    <td><input type="text" name="bez[1]" value="0" size="5" onKeyup="rechnen_i(1);"></td>
                    <td><input type="text" name="ergebnis[1]" value="0" size="5" readonly></td>

          Grüße aus Düsseldorf,

          Aleksej

          1. Wie kann ich denn die Sache sonst aus einer Schleife heraus aufrufen?

            du redest immer von einer schleife. Ich sehe keine Schleife.

            Struppi.

            1. du redest immer von einer schleife. Ich sehe keine Schleife.

              Hallo Struppi,

              klar hat mir Deine Lösung gefallen. Es wäre doch aber schön gewesen, wenn das auch aus der FOR-Schleife heraus funktioniert hätte:

              <? for ($numero=1; $numero<=7; $numero++)
                {
                include("inc/zusatz_ini.php"); ?>
                <tr<? if ($gz == 2) {?> bgcolor="#F0F7F0"<?} ?>>
                  <td><? if ($anzahl != "0") { echo "$anzahl"; ?>  <? } ?><? echo "$bezeichnung"; ?></td>
                  <td><input type="text" name="addit[<?=$numero;?>]" size="5" value="<? echo "$preis_m"; ?>" <? if ($gz == 2) {?>class="ergebnis"<?} else {?>class="ergebnis1"<?} ?> readonly></td>
                  <td><input type="text" name="bez[<?=$numero;?>]" value="0" size="5" onKeyup="rechnen_i(<? echo "$numero"; ?>);"></td>
                  <td><input type="text" name="ergebnis[<?=$numero;?>]" value="0" size="5" <? if ($gz == 2) {?>class="ergebnis"<? $gz = 0;} else {?>class="ergebnis1"<?} ?> readonly></td>
                </tr>
                <?
                $gz=$gz+1;
                } ?>

              1. du redest immer von einer schleife. Ich sehe keine Schleife.

                Hallo Struppi,

                klar hat mir Deine Lösung gefallen. Es wäre doch aber schön gewesen, wenn das auch aus der FOR-Schleife heraus funktioniert hätte:

                Tut es auch, dein Problem ist PHP nicht Javascript (ich kann kein PHP aber probier's mal).

                <? for ($numero=1; $numero<=7; $numero++)

                Du musst bei 0 anfangen in den meisten Programiersprachen fangen Arrays bei null an.

                <? for ($numero=0; $numero<=6; $numero++)
                  {
                  include("inc/zusatz_ini.php"); ?>
                  <tr<? if ($gz == 2) {?> bgcolor="#F0F7F0"<?} ?>>
                    <td><? if ($anzahl != "0") { echo "$anzahl"; ?>  <? } ?><? echo "$bezeichnung"; ?></td>

                <td><input type="text" name="addit[]" size="5" value="<? echo "$preis_m"; ?>" <? if ($gz == 2) {?>class="ergebnis"<?} else {?>class="ergebnis1"<?} ?> readonly></td>
                    <td><input type="text" name="bez[]" value="0" size="5" onKeyup="rechnen_i(<? echo "$numero"; ?>, this.form);"></td>
                    <td><input type="text" name="ergebnis[]" value="0" size="5" <? if ($gz == 2) {?>class="ergebnis"<? $gz = 0;} else {?>class="ergebnis1"<?} ?> readonly></td>
                  </tr>
                  <?
                  $gz=$gz+1;
                  } ?>

                und das Javascript:

                funtion rechnen_i(i, f)
                {
                     var val = f['bez[]'][i].value * f['addit[]'][i].value;
                     f['ergebnis[]'][i].value = val;
                }

                Und in PHP kannst du irgendwie das als Array empfangen (in Perl ist das alles viel einfacher).

                Struppi.

                1. Moin!

                  du redest immer von einer schleife. Ich sehe keine Schleife.

                  Hallo Struppi,

                  klar hat mir Deine Lösung gefallen. Es wäre doch aber schön gewesen, wenn das auch aus der FOR-Schleife heraus funktioniert hätte:

                  Tut es auch, dein Problem ist PHP nicht Javascript (ich kann kein PHP aber probier's mal).

                  Gerade _umgekehrt_: Das Problem ist Javascript, nicht PHP.

                  <? for ($numero=1; $numero<=7; $numero++)

                  Du musst bei 0 anfangen in den meisten Programiersprachen fangen Arrays bei null an.

                  Irrelevant! Man kann Schleifen anfangen, wo man will.

                  funtion rechnen_i(i, f)
                  {
                       var val = f['bez[]'][i].value * f['addit[]'][i].value;
                       f['ergebnis[]'][i].value = val;
                  }

                  Diese Lösung funktioniert - bitte zweimal rot unterstreichen!

                  Kern der Sache: Wenn ein Formularfeld "addit[2]" heißt, kann man es nicht mit document.formular.addit[2] ansprechen, weil name[X] in Javascript eine eigene Bedeutung hat - das ist ein Arrayzugriff. Ein einzelnes Formularfeld ist aber kein Array!

                  Deshalb kann man nur über den Namensindex gehen:
                  document.formular.elements['addit[2]'] -> greift auf das Formularfeld mit dem Namen "addit[2]" zu.

                  Den Namen kann man vorher auch als String zusammensetzen lassen:
                  index = 2
                  feldname = 'addit['+ index + ']'
                  document.formular.elements[feldname]

                  Das ist im Prinzip von der Wirkung her analog zu PHP.

                  Wenn die einzelnen Formularfelder mit "addit[]" bezeichnet werden, erhält man in PHP zwar ein schönes Array, in Javascript hingegen kann man die einzelnen Felder dann nicht mehr am Namen auseinanderhalten (die heißen ja alle gleich), sondern muß über ein Array zugreifen:

                  document.formular.elements['addit[]'][2]

                  Das gilt aber nur, wenn mehr als ein Element namens 'addit[]' vorhanden ist - andernfalls bildet Javascript kein Array. Man müßte also, falls der Sonderfall "nur ein Feld" eintreten kann, mit document.elements['addit[]'].length prüfen, ob es mehrere Elemente gleichen Namens gibt, oder nur eines, und dann entsprechend zugreifen.

                  Und in PHP kannst du irgendwie das als Array empfangen (in Perl ist das alles viel einfacher).

                  Ich würde das Gegenteil behaupten. In PHP empfängt man die Daten automatisch als Array.

                  - Sven Rautenberg

                  --
                  Diese Signatur gilt nur am Freitag.
                  1. Moin!

                    du redest immer von einer schleife. Ich sehe keine Schleife.

                    Hallo Struppi,

                    klar hat mir Deine Lösung gefallen. Es wäre doch aber schön gewesen, wenn das auch aus der FOR-Schleife heraus funktioniert hätte:

                    Tut es auch, dein Problem ist PHP nicht Javascript (ich kann kein PHP aber probier's mal).

                    Gerade _umgekehrt_: Das Problem ist Javascript, nicht PHP.

                    Nein, sie könnte ohne Probleme auf ein Formularfelder-Array mit den Namen 'addit' und 'bez' und 'ergebnis' zugreifen, da sie die vermutlich aber mit PHP auswerten will muss sie die Namen in addit[] ändern (was in Perl nich notwendig ist, dort kann man mit Hilfe des CGI Moduls

                    my @addit = param('addit');

                    auf das Array zugreifen wie in JS.

                    <? for ($numero=1; $numero<=7; $numero++)

                    Du musst bei 0 anfangen in den meisten Programiersprachen fangen Arrays bei null an.

                    Irrelevant! Man kann Schleifen anfangen, wo man will.

                    Nein, wenn sie das ausgibt  (mit den Änderungen die ich Vorschlug) dann hat sie mehrere Arrays von gleichnamigen  Formularelementen und greift auf die Funktion rechnen_i(index, form) auf diese zu. Und hier ist index null das nullte element.

                    Allerdings ist die tatsächlich bei meinen Änderungen irrelevant, da ich keinen Indexwert mehr angabe im HTML Code.

                    [...Erklärung stimmt]

                    Und in PHP kannst du irgendwie das als Array empfangen (in Perl ist das alles viel einfacher).

                    Ich würde das Gegenteil behaupten. In PHP empfängt man die Daten automatisch als Array.

                    Das ist aber eine Sicherheitslücke, die heute soweit ich weiss nicht mehr genutzt wird, du musst schon explizit das Array abfragen, genau wie in Perl (s.o.).
                    aber mit komplizierter meinte ich auch, das du diese bescheuerten Namen verwenden musst 'addit[]' statt 'addit' und dann Probleme im JS bekomst.

                    So, dann hoff ich mal Romina hat was gelernt und kommt weiter.

                    Struppi.

                    1. Moin!

                      Ich würde das Gegenteil behaupten. In PHP empfängt man die Daten automatisch als Array.

                      Das ist aber eine Sicherheitslücke, die heute soweit ich weiss nicht mehr genutzt wird, du musst schon explizit das Array abfragen, genau wie in Perl (s.o.).

                      [ ] Du hast Ahnung von PHP.

                      Auch in PHP greift man natürlich nicht auf $addit als direkt durch das Formular definierte Array zu, sondern mit $_POST['addit'][index].

                      aber mit komplizierter meinte ich auch, das du diese bescheuerten Namen verwenden musst 'addit[]' statt 'addit' und dann Probleme im JS bekomst.

                      Hat alles seine Vor- und Nachteile.

                      - Sven Rautenberg

                      --
                      Diese Signatur gilt nur am Freitag.
                      1. Moin!

                        Ich würde das Gegenteil behaupten. In PHP empfängt man die Daten automatisch als Array.

                        Das ist aber eine Sicherheitslücke, die heute soweit ich weiss nicht mehr genutzt wird, du musst schon explizit das Array abfragen, genau wie in Perl (s.o.).

                        [ ] Du hast Ahnung von PHP.

                        Nein, hab ich auch mehrmals gesagt. aber leider hat ja die OP ein PHP Problem gehabt (?) und von daher musste ich mich in diese Niederungen herabwagen

                        Struppi.

                        1. Ja, Romi hat was gelernt :o)

                          Inzwischen funktionierts auch :o)

                          Kann man das alles nun auch in eine Datei packen?
                          So, daß sie Fremdzugriffen geschützt ist?

                          Gruß Romi :o)

                          1. Ja, Romi hat was gelernt :o)

                            Inzwischen funktionierts auch :o)

                            Kann man das alles nun auch in eine Datei packen?
                            So, daß sie Fremdzugriffen geschützt ist?

                            Was?
                            Das Javascript?
                            Ja man kann, es ist aber nicht geschützt.

                            Das PHP? (es kommt nur die Ausgabe an)
                            Das kommt nie beim User an und ist insofern geschützt.

                            Struppi.

                            1. Ja, meinte das JS. :o(

                              Aber wenns nicht geht, trotzdem 1000 x Danke ... :o)

  2. Hallo liebe Forengemeinde :o)

    's will einfach nicht :o(

    Dir gefiel meine Lösung nicht, die super klappte :-(

    Struppi.

  3. ... ich gebs auf :o(
    ich unterlass die Schleife und pack es alles einzeln.

    Weiß Jemand wie ich das in eine externe Datei packen kann, sodaß man sich den Quelltext nicht ansehen kann?

    Gruß Romi.