fehlerhafte Behandlung von <button> in IE7

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • fehlerhafte Behandlung von <button> in IE7

    Ich habe ein Problem mit dem IE 7. Für den Quellcode

    <button type="submit" name="action" value="start">absenden</button>
    Übergibt der IE 7 nicht wie erwartet den Wert action=start sondern action=absenden. In Firefox und IE 6 ging es problemlos. Aber im IE 7 macht mir das einen großen Teil der Formulare kaputt

    Ist das irgendjemandem schon aufgefallen? Kennt jemand einen Hack wie man das Problem für IE 7 umgehen kann?

    PS: ich muss dazu sagen, die Seite ist mit W3C-Validator geprüft und valides HTML 4.1 transitional.
    Zuletzt geändert von Marcusson; 20.10.2006, 15:08.

  • #2
    Fehlerhafte Behandlung deinerseits!

    Prüfe doch einfach, ob der Button gedrückt wurde, nicht welchen Wert er hat.

    if( isset( $_POST['buttonname'] ) ) { ... }
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Du verstehst nicht wovon ich rede!

      Mach mal die folgende Seite mit dem IE7 und dem Firefox auf und vergleiche die Ergebnisse:

      http://dean.edwards.name/IE7/compatibility/button.html

      Dann lies dir den W3C-Standard dazu durch:

      http://www.w3.org/TR/html401/interact/forms.html#h-17.5

      Und du wirst sehen, dass der Firefox es richtig macht und der IE7 sich nicht standardkonform verhält. Es ist also ein Bug.

      Noch ein Beispiel, wo das sehr deutlich wird:

      <form action="index.php">
      <button type="submit" name="action" value="1"><?php print $language[$i][1]; ?></button>
      <button type="submit" name="action" value="2"><?php print $language[$i][2]; ?></button>
      <button type="submit" name="action" value="3"><?php print $language[$i][3]; ?></button>
      </form>
      Ergo: je nachdem welcher Button gedrückt wird, soll das Argument action beim Abschicken des Formulars den Wert 1, 2, oder 3 haben. So wie es der HTML-Standard auch vorsieht! Nur dass der IE7 den innerText des Knotens fälschlicherweise als Value-Attribut übergibt. Und zwar sowohl in JavaScript, als auch beim Versenden des Formulars. Auf die Beschriftung der Buttons kannst du dich als Kriterium übrigens NICHT verlassen, denn der Text kann sich wie in diesem Beispiel je nachdem welche Sprache ausgewählt ist beliebig verändern.

      Leider bringt es auch nichts zu prüfen, ob ein bestimmter Button geklickt worden ist. Das funktioniert in einfachen Fällen, wenn das Skript das Formular "kennt" und umgekehrt, aber das ist 1. sehr schlechter Stil und 2. für Fälle, in denen man ganz explizit den korrekten Wert aus dem Formular braucht bringt das leider auch nichts.

      Im Moment habe ich nur eine JavaScript-Lösung für das Problem Das kann aber keine sinnvolle Dauerlösung sein.
      Zuletzt geändert von Marcusson; 20.10.2006, 16:03.

      Kommentar


      • #4
        Das war aber beim IE < 7 bisher auch nicht viel anders.
        Button und IE vertrugen sich noch nie, und daran scheint sich auch zukünftig nichts zu ändern.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Ich hab grad ma bei SelfHTML geguckt, da is ein Beispiel, das bei mir im IE 6 auch funzt. Und dort steht es würde schon ab IE 4 gehn.
          Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

          Kommentar


          • #6
            Original geschrieben von ArSeN
            Ich hab grad ma bei SelfHTML geguckt, da is ein Beispiel, das bei mir im IE 6 auch funzt.
            Nur von der Optik her - oder auch von der Übergabe der Daten an den Server ...?
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Also mit IE 6 hatte ich diese Probleme bisher nicht - oder sie sind mir nur niemals aufgefallen, weil ich selbst mit Firefox surfe und den IE höchstens mal zum Testen benutze.

              Wie auch immer: ich habe jedenfalls jetzt selbst eine Lösung erarbeitet.

              Code:
              function ie7fix()
              {
                  if (navigator.appName == "Microsoft Internet Explorer") {
                      var buttons = document.getElementsByTagName('button');
                      for (var i=0; i < buttons.length; i++)
                      {
                          var button = buttons.item(i);
                          if (button.type == 'submit') {
                              var o = button.attributes.getNamedItem('value');
                              if (o && o.value) {
                                  button.onclick = function() { this.value = o.value;};
                              }
                          }
                      }
                  }
              }
              Damit funktioniert's im IE7. Leider nur mit JavaScript, aber besser als gar nichts. Das hat den großen Vorteil, dass ich meine paar Hundert Formulare nicht alle auf den Bug kontrollieren und mühsam Workarounds basteln muss, sondern es genügt diese Funktion zentral einzubinden und aus die Maus.

              Ich werde das in den nächsten Stability-Release meines Frameworks mit einbauen: http://all-community.de/pub.

              Damit kann ich dann alle älteren Versionen ohne Eingriff in den Code oder die Templates auf einmal patchen.

              Ansonsten gibt's natürlich noch den hervorragenden Bugfix von Dean Edwards auf http://dean.edwards.name/IE7/, der noch einige weitere, IMHO nicht ganz so kritische, IE7-Bugs korrigiert.

              Kommentar


              • #8
                Damit funktioniert's im IE7. Leider nur mit JavaScript, aber besser als gar nichts. Das hat den großen Vorteil, dass ich meine paar Hundert Formulare nicht alle auf den Bug kontrollieren und mühsam Workarounds basteln muss, sondern es genügt diese Funktion zentral einzubinden und aus die Maus.
                und wenn du die Beschriftung der Button änderst, kannst auch den kompletten PHP Code nach deinem "Bug" durchsuchen. Alle deine Bedingungen hauen dann nicht mehr hin.
                TBT

                Die zwei wichtigsten Regeln für eine berufliche Karriere:
                1. Verrate niemals alles was du weißt!


                PHP 2 AllPatrizier II Browsergame

                Kommentar


                • #9
                  Der Fix hat mit der Beschriftung der Buttons und dem PHP-Code gar nichts zu tun. Er ersetzt lediglich für alle button[type=submit] den Wert des Objekts button.value durch den korrekten Wert button/@value aus dem Parserbaum des Dokuments. Das bewirkt in einem Browser der gemäß W3C-Standard arbeitet absolut gar nichts, weil nach W3C beide Werte identisch sein sollten. (sollte sich z.Bsp. Opera als IE ausgeben und den Block ausführen schadet es nichts) Es behebt allerdings das Problem im IE7, weil dort der Wert button.value falsch ist, der Wert im Parserbaum jedoch korrekt abgelegt wird.

                  Wenn der IE-Nutzer JavaScript natürlich deaktiviert hat, dann hat er 'nen Zonk und bekommt nur in dem speziellen Fall, dass er ausgerechnet ein solches Formular erwischt, dass der IE fehlerhaft verarbeitet, eine entsprechende Fehlermeldung ("Action 'foo' is undefined") mit einer Beschreibung dazu. Aber ich denke das kann man gerade noch verkraften, zumal JavaScript im IE per Default aktiviert ist und alle anderen Browser von dem Bug im IE nicht betroffen sind. Firefox-Nutzern zum Beispiel kann das alles herzlich egal sein

                  Kommentar


                  • #10
                    Was passiert wenn du die Beschriftung des Buttons änderst?
                    Das ist doch der value Wert
                    TBT

                    Die zwei wichtigsten Regeln für eine berufliche Karriere:
                    1. Verrate niemals alles was du weißt!


                    PHP 2 AllPatrizier II Browsergame

                    Kommentar


                    • #11
                      Nope. Der Tag "Button" hat ein Attribut "value", welches - wie der Name schon sagt - den Wert angibt. Die Beschriftung entspricht button.innerHTML, also eben NICHT button.value. Genau darin besteht die fehlerhafte Behandlung im IE.

                      Falls du das bisher anders gehandhabt hast und der IE-Logik gefolgt bist, dann werden deine Seiten in standardkonformen Browsern, wie Firefox oder Opera, möglicherweise nicht funktionieren.

                      Lies doch einfach in der W3C-Spezifikation des Button-Elements nach. Da ist es doch eindeutig beschrieben - sogar mit einem Beispiel dazu
                      Zuletzt geändert von Marcusson; 23.10.2006, 16:03.

                      Kommentar


                      • #12
                        Original geschrieben von Marcusson
                        Leider bringt es auch nichts zu prüfen, ob ein bestimmter Button geklickt worden ist. Das funktioniert in einfachen Fällen, wenn das Skript das Formular "kennt" und umgekehrt, aber das ist 1. sehr schlechter Stil und 2. für Fälle, in denen man ganz explizit den korrekten Wert aus dem Formular braucht bringt das leider auch nichts.
                        Also ich muss sagen das ich noch nie den Fall hatte, das mich das Value-Attribut eines Buttons interressiert, entweder der Button wurde gedrückt oder nicht. Da du dieses Attribut ja eh statisch setzt (in deinem Template) kannst du diesen Teil doch auch auf deinen Server auslagern (oder du benutzt ein verstecktes Feld).

                        Meine Formulare funktionieren auch ohne diesen Wert und wenn ich ehrlich bin finde ich es eher einen schlechten Stil wenn man den Wert eines Button verwendet!

                        MFG
                        BLG

                        PS: Das Formular kennt das Serverscript??? WTF

                        Kommentar


                        • #13
                          Das ist Blödsinn. Die Semantik des Button-Tags ist durch das W3C eindeutig und unmißverständlich festgelegt. Wie kann eine standardkonforme, vom W3C empfohlene Umsetzung also schlechter Stil sein? Was wäre dann "guter Stil"? Webseiten nach den Bugs in Microsoft's Browser zu entwerfen?

                          Wie dem auch sei: Die Templates sind in meinem Fall Skins, die Hinz und Kunz nach eigener Lust und Laune anpassen können. Und die haben von diesem IE-Bug vielleicht noch nie etwas gehört. Ergo werden diese Leute erwarten, dass sich Formulare standardkonform verhalten und genau das werde ich gewährleisten. Nicht mehr und nicht weniger.

                          Kommentar


                          • #14
                            @topicstarter
                            Kennst du einen Browser, der sich gänzlich an die W3 Spez hält ? imho gibt es das schlicht und ergreifend nicht. Damit musst du als Webdesigner leben und wenn du Seiten so entwickelst, dass nur 100% konforme Browser das korrekt umsetzen, dann knallst du eh immer wieder mal an ne Wand. Es gibt Dinge die der IE korrekt macht und der FF nicht. Gleiches gilt für andere Browser.
                            Klar es ist nicht gut wenn sich Browser nicht an die Vorgaben halten. Aber ändern kannst du daran nicht viel.

                            Gruss

                            tobi
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar


                            • #15
                              Nicht Äpfel mit Birnen vergleichen.

                              Wenn irgendein Browser irgendwas um ein paar Pixel verschoben anzeigt oder sonstwas optisch verkehrt macht - das braucht einen nicht sonderlich zu kratzen.

                              Aber hier geht's um (Formular-)Datenübergabe, und dabei ist es für die serverseitige Logik eben doch oft entscheidend, dass eine bestimmte Struktur eingehalten wird.
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X