Martina: onclick="alert(this.checked)"; ?!?

Hi zusammen,

ich möchte bei onclick auf einem Radiobutton abfragen, ob er bereits selektiert ist. Wie mache ich das OHNE einen anderen Handler wie onfocus zu verwenden? Die Zeile

onclick="alert(this.checked)";

liefert immer true, da bei onclick offenbar zuerst checked auf true gesetzt wird. Wie komme ich an den vorigen Wert???

lg,
Martina

  1. Hi!
    mir kommt da ein umweg über 3 variable in den kopf - um sich nicht unnötig zu blamieren sollte ich zwar schweigen aber..
    Es geht aber darum das du die jeweils den id des selectierten "radio"
    in $a oder $b speicherst je nachdem ob $c 1 oder 0 ist. Der wert von $c wird jeweils "geswitcht" un gibt auch an in welcher variable der Zuvor selektierte knopf ist. sollte es bcith der gleich sein den du angeklcikt hast - war er vorher "off" ;)

    P.S: ich bereite shcon mal seife und hocker vor.

    MFG
    bleicher

    --
    __________________________-
    Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
    1. Sorry, aber da blick ich schon gleich mal gar nix!

      Danke trotzdem.

      Martina

  2. Hi Martina,

    ich möchte bei onclick auf einem Radiobutton abfragen, ob er bereits selektiert ist. »» [...] Wie komme ich an den vorigen Wert???

    Speichere den Status in einer Variablen und frage diese ab (statt this.checked), danach setzt Du die Variable auf true,
    bzw. checked oder was auch immer.

    LG

    1. Speichere den Status in einer Variablen und frage diese ab (statt this.checked), danach setzt Du die Variable auf true,
      bzw. checked oder was auch immer.

      Na ja, also voll verstanden hab ich net, aber die Erleuchtung wird schon noch kommen. Vielen Dank erstmal...

      Martina

  3. Liebe Martina,

    ich möchte bei onclick auf einem Radiobutton abfragen, ob er bereits selektiert ist. Wie mache ich das OHNE einen anderen Handler wie onfocus zu verwenden?

    welchen Sinn sollte denn das Ganze haben? Vielleicht ist Dein Herangehen an dieses Problem nicht ganz optimal...

    Die bereits geäußerte Idee mit einer zusätzlichen Variable ist nicht schlecht, aber vielleicht gibt es eine völlig andere Herangehensweise an Dein Problem?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hi Felix,

      Grund für das Ganze ist die Situation wie sie bereits in http://forum.de.selfhtml.org/archiv/2006/10/t138128/#m897103 beschrieben wird: onchange wird in FF und IE anders behandelt. Eigentlich will ich das Verhalten von FF (obwohl nicht standardkonform). Um aber IE und FF unter einen Hut zu kriegen, wollte ich onclick verwenden und onchange programmatisch nachbilden.

      lg, Martina

      1. Liebe Martina,

        Eigentlich will ich das Verhalten von FF (obwohl nicht standardkonform). Um aber IE und FF unter einen Hut zu kriegen, wollte ich onclick verwenden und onchange programmatisch nachbilden.

        mir ist noch immer nicht klar _wozu_ Du das brauchst. Gibt es denn keine sinnvollere Herangehensweise an Dein Projekt, als mit Javascript irgendeine Browsermacke bezüglich eines Eventhandlers aufzugreifen? Könnte man das nicht serverseitig lösen (oder besser ganz bleiben lassen, da es nur einen idealistischen Wert hat)?

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Wozu? Ich will bei onchange bzw. onclick (im letzteren Fall aber nur wenn sich wirklich was geändert hat) ein Formular absenden. Und da serverseitig nix passiert wenn der Radiobutton bereits gechecked war, will ich mir den Roundtrip sparen.

          Natürlich könnte ich mir serverseitig ein eigenes Attribut zum Inputfeld ausdenken, das den vorigen Zustand speichert. Aber das finde ich irgendwie zu aufwändig.

          Grüße,
          Martina

          1. Hi,

            Natürlich könnte ich mir serverseitig ein eigenes Attribut zum Inputfeld ausdenken, das den vorigen Zustand speichert. Aber das finde ich irgendwie zu aufwändig.

            na dann speichere den Zustand halt _clientseitig_ und prüfe den vorm Absenden.

            1. na dann speichere den Zustand halt _clientseitig_ und prüfe den vorm Absenden.

              Ja und WANN? onclick ist der alte Zustand ja nicht mehr erreichbar. Und pro verwendetem Radiobutton eine Variable einführen, finde ich noch häßlicher, da die Anzahl der RadioButtons hochgradig dynamisch ist. Da plötzlich 20 globale Variablen zu halten find ich net gut. Das mag bei 3-4 statischen Radiobuttons anders sein.

              Vielleicht steh ich aber auch aufm Schlauch und versteh deinen Ansatz nicht ganz...

              lg, Martina

          2. Liebe Martina,

            Wozu? Ich will bei onchange bzw. onclick [...] ein Formular absenden.

            seit wann wird denn beim Klicken eines Radio-Buttons ein Formular abgeschickt?

            Du kannst über den Eventhandler "onsubmit" im <form>-Element den aktuellen Zustand des Radio-Buttons prüfen, um dann mit einem "return false" das Abschicken des Formulars bei Bedarf zu blocken.

            Ohne Javascript ist aber all mein aufgeblasenes Gerede natürlich noch mehr heiße Luft, als es das sowieso schon ist. Nur gut, dass Dein Server sich bei Bedarf nicht rührt!

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            1. seit wann wird denn beim Klicken eines Radio-Buttons ein Formular abgeschickt?

              Au mann, ich versuch doch auch nur ein komplexeres Problem aufs Wesentliche zu reduzieren. Was bringts dir denn, wenn ich dir sage, dass ich ein Java-GUI-Framework baue bei dem es eben zu solchen Situationen kommen kann??? NIX. Ich muss es einfach.

              Nur gut, dass Dein Server sich bei Bedarf nicht rührt!

              Genau das ist der Punkt. Er soll sich AUSSCHLIEßLICH bei Bedarf rühren und nicht wenn es für so ein vermeindlich Pipifaxproblem vielleicht auch clientseitig gehen könnte.

              Grüße,

              Martina

              1. Liebe Martina,

                mein Vorschlag (ins Unreine geschrieben!):

                // globales Array definieren, in welches alle relevanten Radio-Buttons und ihre Zustände gespeichert werden sollen  
                var myRadioButtons = new Array();  
                  
                /* Alle Radio-Buttons ermitteln und im Array ablegen!  
                   Jedes Array-Element ist ein Objekt, welches zwei Eigenschaften hat:  
                   "object" - eine Referenz zum "echten" Radio-Button und  
                   "checked" - der Wert der checked-Eigenschaft des Radio-Buttons. */  
                function init_array() {  
                    var alleInputs = document.getElementsByTagName("input"); // ermittelt alle <input>-Elemente  
                    for (var i = 0; i < alleInputs.length; i++) {  
                        if (alleInputs[i].type && alleInputs[i].type == "radio") { // ist es ein Radio-Button?  
                           // Button und seinen Zustand speichern  
                           myRadioButtons[myRadioButtons.length] = {  
                               object : alleInputs[i],  
                               checked : alleInputs[i].checked  
                           };  
                        }  
                    }  
                }
                

                Nun hast Du den Zustand aller Radio-Buttons zum Zeitpunkt des Aufrufs der Funktion "init_array". Wenn Du nun in Deiner Handler-Funktion auf dieses Array zugreifst, dann brauchst Du nur zu prüfen, ob "myRadioButtons[i].object" mit dem angeklickten Element übereinstimmt. Jetzt kannst Du prüfen, welcher Zustand zuletzt abgelegt worden war und entsprechend reagieren. Vergiss aber nicht, den aktuellen Zustand in "myRadioButtons[i].checked" einzutragen!

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

                1. Wow, vielen Dank für den enormen Aufwand, den du hierfür auf dich genommen hast. Hut ab, danke!

                  Ich werds gleich mal ausprobieren.

                  Schönen Abend noch.
                  lg, Martina

                2. Moin!

                  Mein Verbesserungsvorschlag: Nicht den Zustand jeden einzelnen Buttons speichern, sondern nur den Value des aktivierten Buttons. Ich gehe einfach mal davon aus, daß alle Buttons einer Gruppe unterschiedliche Werte liefern. Zwei Buttons einer Gruppe, die denselben Wert liefern halte ich nicht für sinnvoll.

                  Ein Beispiel dafür ist in meinem vorherigen Post hier zu finden. Wenn man das nun für alle Radiobutton-Gruppen machen möchte, statt nur für eine, wie in meinem Post gezeigt, dann geht man, wie Du das ins Unreine geschrieben hat, alle Input Elemente durch und speichert in einem Array, unter dem Namen des Buttons den Wert des selektierten Elements:

                  for (var i= AllButtons.length; i--; ) {
                    if ( AllButtons[i].checked == false ) continue;
                    old_value[ AllButtons[i].name ]= AllButtons[i].value;
                  }

                  Die Überprüfung ist dann so:
                  function check( radio ) {
                    if ( old_value[ radio.name ] != radio.value ) {
                      old_value[ radio.name ] = radio.value;
                      // waren unerschiedlich
                    }
                  }

                  -- Skeeve

          3. Abend.

            Ich will bei onchange bzw. onclick (im letzteren Fall aber nur wenn sich wirklich was geändert hat) ein Formular absenden.

            So funktioniert es in IE (getestet ab 5.5) und FF (1.5): In onchange die Aktion, in onclick ein 'this.blur(); this.focus();'.

            Kleines Beispiel:

              
            <form action="#">  
             <input type="radio" name="test" value="1" onclick="this.blur(); this.focus();"  
              onchange="alert(this.value)" checked> 1<br>  
             <input type="radio" name="test" value="2" onclick="this.blur(); this.focus();"  
              onchange="alert(this.value)"> 2<br>  
             <input type="radio" name="test" value="3" onclick="this.blur(); this.focus();"  
              onchange="alert(this.value)"> 3<br>  
             <input type="radio" name="test" value="4" onclick="this.blur(); this.focus();"  
              onchange="alert(this.value)"> 4<br>  
            </form>  
            
            

            Meine mentalen Fähigkeiten reichten aber nicht aus, um die Implementierung von onchange bei Radiobuttons im IE nachzuvollziehen.

            Das this.focus() bewirkt, dass das FOrmular auch mit der Tastatur benutzbar bleibt.

            Gruß
             Christoph

  4. ich möchte bei onclick auf einem Radiobutton abfragen, ob er bereits selektiert ist. Wie mache ich das OHNE einen anderen Handler wie onfocus zu verwenden? Die Zeile

    onclick="alert(this.checked)";

    liefert immer true, da bei onclick offenbar zuerst checked auf true gesetzt wird. Wie komme ich an den vorigen Wert???

    Bei mir nicht:

      
    <form>  
    <input type="checkbox" onclick="alert(this.checked)" checked>  
    </form>  
    
    

    1. Klick => false
    2. Klick => true
    3. Klick => false
    usw.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Moin!

      ich möchte bei onclick auf einem Radiobutton abfragen,
                                       ^^^^^^^^^^^
      Bei mir nicht:

      <form>
      <input type="checkbox" onclick="alert(this.checked)" checked>
                   ^^^^^^^^
      </form>

      Du siehst den Untersfchied?  
        
      \-- Skeeve
      
      1. Du siehst den Untersfchied?

        Jaja, schon gesehen :-)
        Das kommt davon, wenn man zwischen Tür und Angel was schreibt.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
  5. Moin!

    Das hier ist es, was Dir die anderen versucht haben nahezubringen:

      
    <html>  
    <head>  
    <script language="JavaScript" type="text/JavaScript" >  
    
    
      
     var old_value= null;  
     function storecheck (cb){  
      for (var i= cb.length; i--;) {  
       if ( ! cb[i].checked ) continue;  
       old_value= cb[i].value;  
       return;  
      }  
     }  
     function check( me ) {  
      if ( me.value == old_value ) {  
       alert( 'Noe... will ned!');  
      }  
      else {  
       alert( "Na gut!\n" + "Jetzt: " + me.value + "\nVorher: " + old_value );  
       old_value= me.value;  
      }  
     }  
    
    
      
    </script>  
    </head>  
    <body onload="storecheck(document.forms['mainform'].elements['cb'])">  
    <form method="post" name="mainform" action="http://www.google.de/" onsubmit="return false;">  
     <input onclick="check(this)" type="radio" name="cb" value="dies"/> mach dies<br/>  
     <input onclick="check(this)" type="radio" name="cb" value="das"/> mach das<br/>  
     <input onclick="check(this)" type="radio" name="cb" value="was anderes"/> mach was anderes<br/>  
     <input onclick="check(this)" type="radio" name="cb" value="erstmal nix" checked/> erstmal nix<br/>  
    </form>  
    </body>  
    </html>  
    
    

    Hilft's?
    -- Skeeve

    1. also doch variablenswitcher ;) also ich komme dann ohne der schlinge aus! yoho!
      MFG
      bleicher

      --
      __________________________-
      Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).