Michelle: Formularfeld via Popup ändern --> Feldname is not defined

Guten Tag

Ich möchte ein Formular bestehend aus mehreren Select-Feldern über ein Popup anpassen. Um dies zu realisieren, habe ich das Script "Neue Elemente in Auswahlliste einfügen" (http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente) abgeändert. Leider kommt nun immer die Fehlermeldung "upload_anlass1 is not defined". Hat jemand eine Idee, woran das liegen könnte?

Mein vereinfachter Code:

Formular im Hauptfenster:

<form name="fupload" method="post" action="index.php">
 Modell:
 <select name="upload_modell" onChange="popnewentry('<?php echo $cat; ?>',this.options[this.selectedIndex].value)">
  <option value="1" selected>Wert 1</option>
  <option value="2" selected>Wert 2</option>
 </select>

Anlass 1:
 <select name="upload_anlass1" onChange="popnewentry('<?php echo $cat; ?>',this.options[this.selectedIndex].value)">
  <option value="neu">neu ...</option>
  <option value="1" selected>Wert 1</option>
  <option value="2" selected>Wert 2</option>
 </select>

<input type="submit" name="upload_go" value="OK">
</form>

Die Funktion popnewentry sieht so aus:

<script language="JavaScript">
<!--
 function popnewentry(cat,val) {
  if (val == "neu")
  {
   var sURL = "includes/read_popup_new.php?cat=" + cat;
   var sName = "pop_newentry";
   var sOptions = "dependent=yes,left=100,top=200,scrollbars=yes,resizable=yes";
   var sWidth = 495;
   var sHeight = 625;
   msg = window.open(sURL, sName, sOptions + ',width=' + sWidth + ',height=' + sHeight);
  }
 }
//-->
</script>

Im Popup hab ich dann ein Formular mit einem Textfeld, in welches ein neuer Eintrag eingegeben werden kann.

<input type="text" name="newentry">

Das Formular ruft sich selbst wieder auf und im Header checke ich mit PHP, ob der neue Eintrag sinn macht. Wenn ja, führe ich die folgende Funktion onload aus:

<script language="JavaScript">
<!--
 function insert_newoption(newval, newid, fieldname) {
  if (opener && opener.closed!=1) {
   var newoption = new Option(newval, newid, false, true);
   opener.document.fupload.fieldname.options[opener.document.fupload.fieldname.length] = newoption;
   self.close();
  }
 }
//-->
</script>

<body onLoad="insert_newoption('<?php echo $newentry; ?>', '<?php echo $newid; ?>', <?php echo $fieldname; ?>)">
(wobei $newentry = Wert aus dem obigen Textfeld "newentry", $newid = value des neuen Eintrags (kommt aus MySQL) und $fieldname = Name der entsprechenden Select-Box, z.B. "upload_anlass1".

Wenn ich das dann ausprobiere, erhalte ich dann wie gesagt die Fehlermeldung "upload_anlass1 is not defined" oder "upload_modell is not defined" (je nach gewählter Select-Box).

In diesem Code steckt mein ganzes mageres Javascript-Wissen... Ich komm hier keinen Schritt mehr weiter und wäre unheimlich froh, wenn mir jemand helfen könnte!!!

Vielen Dank und lg, Michelle

  1. Mein vereinfachter Code:

    Eins vorweg, für JS Probleme ist der PHP Code völlig uninteressant, lediglich das was im Browser ankommt spielt eine Rolle.

    Formular im Hauptfenster:

    <form name="fupload" method="post" action="index.php">
    Modell:
    <select name="upload_modell" onChange="popnewentry('<?php echo $cat; ?>',this.options[this.selectedIndex].value)">
      <option value="1" selected>Wert 1</option>
      <option value="2" selected>Wert 2</option>
    </select>

    Anlass 1:
    <select name="upload_anlass1" onChange="popnewentry('<?php echo $cat; ?>',this.options[this.selectedIndex].value)">
      <option value="neu">neu ...</option>
      <option value="1" selected>Wert 1</option>
      <option value="2" selected>Wert 2</option>
    </select>

    <input type="submit" name="upload_go" value="OK">
    </form>

    Die Funktion popnewentry sieht so aus:

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

    Das hats du aber nicht aus selfhtml, das language Attribut ist lange out und nicht mehr erwünscht, stattdessen fehlt aber das type Attribut. Auch die HTML Kommentare im JS Block sind nur noch historisch relevant (für die erste Browsergeneration)

    function popnewentry(cat,val) {
      if (val == "neu")
      {
       var sURL = "includes/read_popup_new.php?cat=" + cat;

    In URLs müssen Sonderzeichen kodiert werden, damit das immer funktioniert solltest du cat mit z.b. escape() kodieren.

    function insert_newoption(newval, newid, fieldname) {
      if (opener && opener.closed!=1) {

    Die Eigenschaft closed ist entweder true oder false, aber niemals 1

    Die Frage ist, ob hier opener überhaupt nmoch existiert?
    Das merkst du, wenn du dir opener mal anzeigen läßt:
    Was ergibt: alert(opener)
    und falls hier ein sinnvoller Wert drin steht immer weiter:
    alert(opener.document)
    alert(opener.document.fupload)
    alert(opener.document.fupload.fieldname)

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hallo Struppi

      Erst mal danke für die Tipps. Hab alles korrigiert.

      Alert gibt mir allerdings immer nur [object Window] aus. Leider hab ich bis jetzt noch nicht rausgefunden, was das zu bedeuten hat. Aber wohl nix gutes... Gibt es denn eine andere Möglichkeit, auf das "Hauptfenster" zuzugreifen?

      Danke und lg, Michelle

      1. Alert gibt mir allerdings immer nur [object Window] aus. Leider hab ich bis jetzt noch nicht rausgefunden, was das zu bedeuten hat. Aber wohl nix gutes... Gibt es denn eine andere Möglichkeit, auf das "Hauptfenster" zuzugreifen?

        Wieso soll das nichts gutes sein? Das ist das was du möchtest. und die anderen Tests?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Wieso soll das nichts gutes sein? Das ist das was du möchtest. und die anderen Tests?

          Danke für deine Geduld... Also, das Folgende wird ausgegeben:

          alert(opener); // object Window
          alert(opener.document); // object HTMLDocument
          alert(opener.document.fupload); // object HTMLFormElement
          alert(opener.document.fupload.upload_modell); // object HTMLSelectElement
          alert(opener.document.fupload.fieldname); // undefined

          Undefined wird auch dann ausgegeben, wenn ich fieldname in der Funktion als Variable definiere (und nicht übergebe):

          function insert_newoption(newval, newid) {
           if (opener && opener.closed != true) {
            var fieldname = "upload_modell";
            alert(opener.document.fupload.fieldname); // undefined
           }
          }

          Nochmals danke und lg, Michelle

          1. alert(opener); // object Window
            alert(opener.document); // object HTMLDocument
            alert(opener.document.fupload); // object HTMLFormElement
            alert(opener.document.fupload.upload_modell); // object HTMLSelectElement
            alert(opener.document.fupload.fieldname); // undefined

            Undefined wird auch dann ausgegeben, wenn ich fieldname in der Funktion als Variable definiere (und nicht übergebe):

            Das hatte ich gar nicht gesehen, das geht so nicht.
            Wenn der Feldname eine Variabel ist musst das Element so referenzieren:
            opener.document.fupload[fieldname]

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Das hatte ich gar nicht gesehen, das geht so nicht.
              Wenn der Feldname eine Variabel ist musst das Element so referenzieren:
              opener.document.fupload[fieldname]

              Juhuuu, es klappt! Vielen Dank, Struppi!