Christopher: Generierter HTML-Code wird anders interpretiert als Hardcode

Ich bin etwas perplex...

Habe hier eine Funktion, die mir den HTML-Code für eine Combo-Box zurechtschnipselt. Gibt da ca. 10 Parameter. Nun ja, klappt super, nur werden die Mehrfachauswahl-Combos NUR beim Firefox fehlinterpretiert. Sie erscheinen als Einzeiler ohne Pfeile (schaut aus wie ein normales Input)

Das Verrückte: Wenn ich in den generierten HTML-Source schau und diesen rauskopier und schlicht in eine .html-Datei schreibe und diese wiederrum im Firefox öffne, klappt alles prima. Verrückt, oder?

Hier die FUnktion

  
 function get_dropdown($name_select,$array_key_to_val,$preselect='',$indent=5,$attributes='',$isSelfSubmit=false,$trim_length=-1,$multipleSelect=-1)  
 {  
  $multi_sel = ($multipleSelect >0 ? ' size="'.$multipleSelect.'" multiple="multiple"' : '');  
  
  $dropdown ='';  
  $dropdown.= "<select name='$name_select'$attributes$multi_sel onKeyPress='simulate_enter(this.form,event)'>";  
  $dropdown.= ($isSelfSubmit ? "<option value='-1'".($preselect==-1 ? ' selected' : '').">...</option>" : '');  
  foreach ($array_key_to_val as $key => $val)  
  {  
   $dropdown.= "<option value='".$key."'".($key==$preselect ? ' selected' : '').">".trim_str($trim_length,$val)."</option>";  
  }  
  $dropdown.= "</select>\n";  
  return $dropdown;  
 }  

Die HTML-Ausgabe (konkret) sieht so aus:

  
<select name="departments_unowned[]" onfocus='this.style.border="1px solid #ccc";' onblur='this.style.border="1px solid #737678";' size="5" multiple="multiple" onkeypress="simulate_enter(this.form,event)">  
 <option value="5">Buchhaltung</option>  
 <option value="1">Entwicklung</option>  
  
 <option value="2">Geschäftsleitung</option>  
 <option value="4">Marketing</option>  
 <option value="3">Vertrieb</option>  
</select>  

  1. Mir fällt auf, dass noch einige andere Funktionen mit notiert sind. Von diesen darf aber auch diese "Verwirrung" nicht ausgehen. Wie kann so was gehen?

    Totaler Quatsch. Und gerade der IE machts noch richtig.

  2. echo $begrüßung;

    Wer weiß, was du machst ... Dein Problem ist mit den von dir gegebenen Fakten nicht nachvollziehbar.

    Hier die FUnktion

    [...]

    Die HTML-Ausgabe (konkret) sieht so aus:

    [...]

    Die angegebenen Funktion ist nicht in der Lage, den dargestellten Quelltext zu erzeugen. Die Funktion erzeugt beispielsweise keine Zeilenumbrüche und Einrückungen, wie sie in der angeblichen Ausgabe zu sehen sind. Du verschweigst auch, welche Parameter du beim Aufruf verwendest. Außerdem verwendest du eine Funktion namens trim_str() ohne deren Quelltext zu veröffentlichen.

    Versuche dein Problem nachvollziehbar zu beschreiben!

    echo "$verabschiedung $name";

    1. Außerdem verwendest du eine Funktion namens trim_str() ohne deren Quelltext zu veröffentlichen.

      Ich hatte vor, alle weiteren Funktionsaufrufe zu entfernen. Dazu gehörte u.a. auch die Funktion für die Zeilenumbruch-Generierung im HTML-Code. Die Fktn trim_str habe ich vergessen, zu entnehmen. Sie "kappt" einen String ab einer gegebenen Länge.

      Mein Funktionsaufruf im Source sieht wiefolgt aus:
      get_dropdown('departments_unowned[]',$unowned_departments,'',0,GBL_INPT.' onClick="admin_move_icon(\'move_department\',true)"',false,-1,$height)

      Die Array-Struktur von $unowned_departments lautet folgendermassen:

      Array  
      (  
          [5] => Buchhaltung  
          [1] => Entwicklung  
          [2] => Geschäftsleitung  
          [4] => Marketing  
          [3] => Vertrieb  
      )
      

      $height hat den Wert 5 und gibt später den Wert des select-Attributs "size" an.

      1. Da gibts doch noch so viel zu erläutern. Die Konstante GBL_INPT beinhaltet die Js-Eventhandler onBlur und onFocus usw.

        Viel wichtiger ist doch das allgemeine Problem; dass der Firefox vielleicht selbst an dem generierten Code rumwerkelt. Denn, wie gesagt, wird der Code korrekt interpretiert, wenn ich die Generierung aus dem Source kopiere und in eine blank-Seite einfüge.

        Warum macht der Firefox das? Ist schonmal solch eine Schwierigkeit aufgetreten?

        1. echo $begrüßung;

          Da gibts doch noch so viel zu erläutern. Die Konstante GBL_INPT beinhaltet die Js-Eventhandler onBlur und onFocus usw.

          Ich bin ein Mensch, kein PHP-Parser. Deswegen übersehe ich manchmal Dinge, die der PHP-Parser anders macht, als ich mir das vorstelle. Um dem Problem auf den Grund gehen zu können, ist mir eine nachstellbare Problembeschreibung lieber als Rätselraten mit halbem Code. Letzteren kann ich nicht in meiner Testumgebung laufen lassen und dann auch nicht das von dir beschriebene Phänomen begutachten.

          Viel wichtiger ist doch das allgemeine Problem; dass der Firefox vielleicht selbst an dem generierten Code rumwerkelt. Denn, wie gesagt, wird der Code korrekt interpretiert, wenn ich die Generierung aus dem Source kopiere und in eine blank-Seite einfüge.

          Warum macht der Firefox das? Ist schonmal solch eine Schwierigkeit aufgetreten?

          Hast du eventuell die Funktion "Auswahl-Quelltext anzeigen" verwendet? Dann bekommst du nicht unbedingt den vom Server gesendeten Code sondern das was der FF bereits interpretiert und gegebenenfalls fehlertoleranterweise korrigiert hat.

          echo "$verabschiedung $name";

          1. Hast du eventuell die Funktion "Auswahl-Quelltext anzeigen" verwendet? Dann bekommst du nicht unbedingt den vom Server gesendeten Code sondern das was der FF bereits interpretiert und gegebenenfalls fehlertoleranterweise korrigiert hat.

            Guter Hinweis! Jedoch ist die Ausgabe von <pre> mit htmlentities identisch. (Führt wieder zur gewünschten Ausgabe im Firefox, wenn ich sie hardcoded kopiere)

            Gerne kopiere ich auch die anderen Funktionen

              
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
             // - Line indent (wie weit soll im Code eingerueckt sein?) ----------------------------------------------------------------------------------------  
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
             function indent_to_str($indent)  
             {  
              $str="\n";  
              for ($i=0; $i<$indent; $i++)  
               $str=$str."\t";  
              
              return $str;  
             }  
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
              
              
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
             // - get Dropdown erzeugt ein Selectfeld ----------------------------------------------------------------------------------------------------------  
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
             function get_dropdown($name_select,$array_key_to_val,$preselect='',$indent=5,$attributes='',$isSelfSubmit=false,$trim_length=-1,$multipleSelect=-1)  
             {  
              $multi_sel = ($multipleSelect >0 ? ' size="'.$multipleSelect.'" multiple="multiple"' : '');  
              
              $dropdown ='';  
              $dropdown.= indent_to_str($indent)."<select name='$name_select'$attributes$multi_sel onKeyPress='simulate_enter(this.form,event)'>";  
              $dropdown.= ($isSelfSubmit ? indent_to_str($indent+1)."<option value='-1'".($preselect==-1 ? ' selected' : '').">...</option>" : '');  
              foreach ($array_key_to_val as $key => $val)  
              {  
               $dropdown.= indent_to_str($indent+1)."<option value='".$key."'".($key==$preselect ? ' selected' : '').">".trim_str($trim_length,$val)."</option>";  
              }  
              $dropdown.= indent_to_str($indent)."</select>\n";  
              return $dropdown;  
             }  
             // ------------------------------------------------------------------------------------------------------------------------------------------------  
              
             // Im weiten Sinne auch eine Navigations-Funktion: Wir haben eine Maximallaenge und wenn ein String drueber hinausschiesst, soll er gekuerzt werden.  
             function trim_str($max_length,$str)  
             {  
                  if ($max_length!=-1)  
                  {  
                   $replace_restrum         = ' ..';  
              
                   while (strlen($str) > $max_length)  
                    $str = substr( $str,0, ((strlen($str)-1) - strlen($replace_restrum))   ).$replace_restrum;  
              
                      }  
              return $str;  
             }  
            $unowned_departments = array(0=>'Abteilung a',5=>'Abteilung b', 19=>'Abteilung c');  
            echo '<pre>'.htmlentities(get_dropdown('departments_unowned[]',$unowned_departments,'',($indent+3),GBL_INPT.' style="width:125px" onChange="admin_move_icon(\'move_department\',true)"',false,-1,$height)).'</pre>';  
            
            
            1. echo $begrüßung;

              Gerne kopiere ich auch die anderen Funktionen

              Schon besser. Ich ergänzte außerdem noch

              $indent = 1;  
              define('GBL_INPT', '');  
              $height = 1;
              

              Bei diesem $height-Wert ergibt sich <select ... size="1" multiple="multiple" ...> und der beschriebene "Einzeiler ohne Pfeile (schaut aus wie ein normales Input)". Size=1 und multiple ist auch nicht unbedingt eine sinnvolle Kombination. Das dürfte weder übersichtlich noch einfach zu bedienen sein. Setze ich für $height größere Werte an, kommen die Auswahl-Pfeile. Bei mir gab es keinen Unterschied zwischen generiertem und kopiertem HTML-Code (wobei bei meinen Versuchen nur der generierte Schnipsel zum Einsatz kam, und keinerlei weiterer HTML-Code drumrum war).

              echo "$verabschiedung $name";

              1. Schon besser. Ich ergänzte außerdem noch

                Vielen Dank für die rege Bemühung, ich bin wirklich beeindruckt. Allerdings zeigt mein Firefox selbst dann noch "Einzeiler", wenn der IE schon bis zum Boden reicht. Benutzt du eine andere Version? (Hier noch der 1.5)

                Dann bitte ich dich noch darum, eine sinnvollere Möglichkeit zur Darstellung der multiple-Select-Boxen vorzuschlagen. Im eigentlich Programm hat der User zwei dieser Boxen, in welchen er mit JavaScript bequem Datensätze hin -und herschieben kann. Die Verwaltung übernimmt übrigens JavaScript, indem sie alle value-Attribute in einem hidden-Feld mit einem Glue ablegt. Benutzerfreundlichkeit siegt eben beim Kundenwunsch über guten Sourcecode. Sonst wäre Javascript ja nicht so verbreitet.

                1. echo $begrüßung;

                  Vielen Dank für die rege Bemühung, ich bin wirklich beeindruckt. Allerdings zeigt mein Firefox selbst dann noch "Einzeiler", wenn der IE schon bis zum Boden reicht. Benutzt du eine andere Version? (Hier noch der 1.5)

                  Ja, ich habe hier mit Version 2.0 getestet. Aber auch Version 1.5.0.8 zeigt das gleiche Verhalten. Ab size > 1 gibt es die Pfeile. Vielleicht ärgert dich ein Cache?

                  Dann bitte ich dich noch darum, eine sinnvollere Möglichkeit zur Darstellung der multiple-Select-Boxen vorzuschlagen.

                  Ich schlage einen size-Wert vor, der zwischen ca. 5 und einer angemessenen Obergrenze liegt, je nachdem, wieviel Platz du zur Verfügung stellen möchtest. Bei weniger als $max_size Elementen wäre auch size = Elementeanzahl angebracht.

                  Im eigentlich Programm hat der User zwei dieser Boxen, in welchen er mit JavaScript bequem Datensätze hin -und herschieben kann.

                  In dem Fall kann die Begrenzung auf die aktuelle Elementeanzahl entfallen.

                  echo "$verabschiedung $name";