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
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
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
$(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
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[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
Besserer Deal
Hier ist meine Lösung, die sowohl für Touch-Geräte als auch für Mausklicks funktioniert:
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
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
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