Optionsfeld beim zweiten Klick deaktivieren

Lesezeit: 6 Minuten

Benutzer-Avatar
Brian

Ich habe viele Optionsfelder, die einen Wert aus meiner Datenbank abrufen, und wenn es auf “1” gesetzt ist, mache ich das Optionsfeld aktiviert.

Wenn eine Optionsschaltfläche aktiviert ist und ein Benutzer erneut darauf klickt, möchte ich diese Schaltfläche trotzdem löschen können. Hat jemand eine Idee?

$radio1 greift Daten aus der Datenbank und ist entweder 0, 1 oder 2

<input value="1" name="radio1" type="radio"<?php if($radio1==1){echo " checked";} ?>>
<input value="2" name="radio2" type="radio"<?php if($radio1==2){echo " checked";} ?>>

Varun Malhotras Antwort leicht modifiziert:
Ich habe 2 Codezeilen geändert, die für mich etwas besser funktionierten. Aber insgesamt war Varuns Antwort PERFEKT!

$('input[type="radio"]').click(function(){
    var $radio = $(this);

    // if this was previously checked
    if ($radio.data('waschecked') == true)
    {
        $radio.prop('checked', false);
        $radio.data('waschecked', false);
    }
    else
    {
         $radio.prop('checked', true);
         $radio.data('waschecked', true);
    }

    // remove was checked from other radios
    $radio.siblings('input[type="radio"]').data('waschecked', false);
});

  • Das klingt eher so, als wollten Sie ein Kontrollkästchen.

    – Bernstein

    10. November 2013 um 20:57 Uhr

  • @Amber Ich möchte ein Optionsfeld, weil ich nicht möchte, dass ein Benutzer mehr als eine Option auswählt.

    – Brian

    10. November 2013 um 20:57 Uhr


  • Erwägen Sie dann, ein weiteres Optionsfeld für „keine der oben genannten Optionen“ hinzuzufügen.

    – Bernstein

    10. November 2013 um 20:58 Uhr

  • @Amber Für Stylingzwecke ist dies keine Option für mich. Es muss ein zweiter Klick sein. Ich kann keine weiteren Optionsfelder hinzufügen.

    – Brian

    10. November 2013 um 20:59 Uhr


  • Was meinst du mit clear this button? was entfernen?

    – Softvar

    10. November 2013 um 21:02 Uhr

Benutzer-Avatar
Softvar

Ich schlage vor, ein benutzerdefiniertes Attribut hinzuzufügen, um den vorherigen Zustand jedes Radios wie folgt zu verfolgen:

$(function(){
    $('input[name="rad"]').click(function(){
        var $radio = $(this);

        // if this was previously checked
        if ($radio.data('waschecked') == true)
        {
            $radio.prop('checked', false);
            $radio.data('waschecked', false);
        }
        else
            $radio.data('waschecked', true);

        // remove was checked from other radios
        $radio.siblings('input[name="rad"]').data('waschecked', false);
    });
});

Sie müssen dieses Attribut auch dem anfänglich überprüften Radio-Markup hinzufügen

<input type="radio" name="rad" id="Radio0" checked="checked" data-waschecked="true" />

JSFIDDLE-DEMO

AKTUALISIEREN:

 $(function(){
        $('input[name="rad"]').click(function(){
            var $radio = $(this);

            // if this was previously checked
            if ($radio.data('waschecked') == true)
            {
                $radio.prop('checked', false);
                $radio.data('waschecked', false);
            }
            else
                $radio.data('waschecked', true);

            // remove was checked from other radios
            $radio.siblings('input[type="radio"]').data('waschecked', false);
        });
    });

Stellen Sie jedoch sicher, dass Sie keine anderen Funkgruppen haben, mit denen Sie arbeiten können, da Sie sonst einige Attribute angeben müssen, um diese Schaltflächen zu spezifizieren, wie z. B. Name Prop, auf den ich mich zuvor konzentriert habe.

  • Gibt es einen Grund, warum ich den vorherigen Zustand verfolgen muss? Auch dies ist ein wirklich schönes Beispiel! Aber was ist, wenn ich 30 Funkgruppen habe? Es muss einen einfacheren Weg geben, anstatt sie alle zu benennen

    – Brian

    10. November 2013 um 21:46 Uhr

  • Sie können die Namensstütze für Ihre Bequemlichkeit entfernen, aber Sie müssen etwas haben, um auf ein bestimmtes Optionsfeld zu verweisen. Daher ist die Benennung eines Optionsfelds die gebräuchlichste Methode. Sie müssen lediglich denselben Namen angeben. Wenn Sie möchten, dass Sie für alle unterschiedliche IDs haben können, wäre dies der schlimmste Fall, denke ich.

    – Softvar

    10. November 2013 um 22:12 Uhr

  • Danke Varrun! Muss ich also für jedes Optionsfeld, das ich habe, eine separate Klickfunktion haben? Am Ende dieses Projekts werde ich ungefähr 100 haben. Würde ich dies auch in eine Datenbank übertragen, wie ich es normalerweise tun würde?

    – Brian

    11. November 2013 um 0:53 Uhr


  • Am Ende habe ich gesetzt $('input[type="radio"]').click stattdessen und es funktionierte am Ende sehr gut. Lassen Sie mich wissen, ob dies ein Problem verursachen wird, aber so weit, so gut.

    – Brian

    11. November 2013 um 3:07 Uhr

  • Ich glaube nicht, dass es irgendwelche Probleme geben würde. Sie können sogar auf jedes andere Attribut zugreifen, indem Sie einfach darauf verweisen this in deinem $('input[type="radio"]').click Funktion. this gibt Ihnen das jeweilige Optionsfeld, auf das geklickt wird, damit Sie weitere Transformationen vornehmen können. Bitte hinterlassen Sie eine Nachricht, wenn Sie nicht zufrieden sind.

    – Softvar

    11. November 2013 um 12:20 Uhr

Dies sollte allgemeiner funktionieren als die anderen Lösungen, da es Fälle behandelt, in denen sich nicht alle Funkgeräte im selben übergeordneten Element befinden.

var $radios = $('input[type="radio"]');
$radios.click(function () {
  var $this = $(this);
  if ($this.data('checked')) {
    this.checked = false;
  }
  var $otherRadios = $radios.not($this).filter('[name="'
                                               + $this.attr('name') + '"]');
  $otherRadios.prop('checked', false).data('checked', false);
  $this.data('checked', this.checked);
});

  • Hat mich darüber aufgeklärt, dass die Filterfunktion nicht in der Index-, Elementfunktionssyntax übergeben werden muss, um zu funktionieren, was meinen Code auf lange Sicht kürzer und effizienter machen wird.

    – Alexander Dixon

    9. Januar 2018 um 14:50 Uhr

Benutzer-Avatar
mrsnowin

Ändern Sie das Auslösen von Ereignissen vor dem Klicken, wenn Sie zum ersten Mal klicken. Sie können sie verwenden. Arbeiten mit vielen Funkgruppen und selbst wenn Sie vorab markierte Funkfelder haben.

$("input[type=radio]").each(function() {
    var secondClick = true;
    $(this).change(function() {
        secondClick = false;
    });
    $(this).click(function() {
        if (secondClick) {
            $(this).prop("checked", false);
        }
        secondClick = true;
    });
});

JSFIDDLE-DEMO

Versuche dies

 $('input[name="rad"]').click(function(){
                    var $radio = $(this);
                    // if this was previously checked
                    if ($radio.data('waschecked') == true)
                    {
                        $radio.prop('checked', false);
                        $radio.data('waschecked', false);
                    }
                    else{
                        $radio.data('waschecked', true);
                    }
                    // remove was checked from other radios
                    $('input[name="rad"]').not($(this)).data('waschecked', false);
                });

$("input[type=radio]").on('click', function () {
    if ($(this).is(':checked')) {
        $(this).prop("checked", false);
    } else {
        $(this).prop("checked", true);
    }
});

  • Dies scheint die vernünftigste und logischste Methode zu sein, aber ich habe eine Reihe von Optionsfeldern, bei denen dies nicht funktioniert.

    – Mark Carpenter jr

    23. Juli 2019 um 18:00 Uhr

Benutzer-Avatar
Besserer Deal

Hier ist meine Lösung, die sowohl für Touch-Geräte als auch für Mausklicks funktioniert:

$('input[type=radio]').bind('touchstart mousedown', function() {
    this.checked = !this.checked
}).bind('click touchend', function(e) {
    e.preventDefault()
});

https://codepen.io/robbiebow/pen/bjPvEO

  • Dies scheint die vernünftigste und logischste Methode zu sein, aber ich habe eine Reihe von Optionsfeldern, bei denen dies nicht funktioniert.

    – Mark Carpenter jr

    23. Juli 2019 um 18:00 Uhr

Benutzer-Avatar
Envayo

Ich weiß nicht genau warum, aber die ausgewählte Antwort des Benutzers Softvar hat bei mir nicht funktioniert, also kam ich nach etwa zwei Stunden Versuch auf der Grundlage der Antwort von Softvar auf Folgendes. Stellen Sie es hier ein, falls es jemand anderem helfen könnte. Sie können „data-active“ in HTML als 0 oder 1 angeben, basierend auf dem „ausgewählten“ Wert, den Sie aus der DB erhalten.

<input type="radio" name="user" value="1" data-active="0"> User 1
<input type="radio" name="user" value="2" data-active="0"> User 2

und

$('input[name="user"]').on('click', function() {
    if ($(this).data('active') == 0) {
        $('input[name="user"]').data('active', 0);
        $(this).data('active', 1);
    } else {
        $(this).data('active', 0);
        $(this).prop('checked', false);
    }
});

1005750cookie-checkOptionsfeld beim zweiten Klick deaktivieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy