Ich habe eine Menge Kontrollkästchen, die standardmäßig aktiviert sind. Meine Benutzer werden wahrscheinlich einige (falls vorhanden) der Kontrollkästchen deaktivieren und den Rest aktiviert lassen.
Gibt es eine Möglichkeit, das Formular POST zu den Kontrollkästchen zu machen, die nicht aktiviert sind, und nicht zu den Kontrollkästchen, die aktiviert sind ?
checkbox
Elements schrecklich ist? Sie sind eine binäre Steuerung, sie sollten binäre Werte senden.Die Lösung, die mir bisher am besten gefallen hat, besteht darin, eine versteckte Eingabe mit demselben Namen wie das Kontrollkästchen einzufügen, die möglicherweise nicht aktiviert ist. Ich denke, es funktioniert so, dass, wenn das Kontrollkästchen nicht aktiviert ist, die versteckte Eingabe immer noch erfolgreich ist und an den Server gesendet wird. Wenn das Kontrollkästchen aktiviert ist, wird die versteckte Eingabe davor überschrieben. Auf diese Weise müssen Sie nicht verfolgen, welche Werte in den veröffentlichten Daten voraussichtlich von Kontrollkästchen stammen.
quelle
Ich habe es mit Vanille-JavaScript gelöst:
Achten Sie darauf, dass zwischen diesen beiden Eingabeelementen keine Leerzeichen oder Zeilenumbrüche auftreten!
Sie können verwenden
this.previousSibling.previousSibling
, um "obere" Elemente zu erhalten.Mit PHP können Sie das benannte versteckte Feld auf 0 (nicht gesetzt) oder 1 (gesetzt) überprüfen.
quelle
<fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>
* Angenommen, es gab dort neue Zeilen. Sie scheinen nicht in Mini-Markup-Codeblöcken zu arbeitenpreviousElementSibling
anstelle von verwendenpreviousSibling
. Es wird fast überall unterstützt und ignoriert Textknoten.Mein persönlicher Favorit ist das Hinzufügen eines ausgeblendeten Feldes mit demselben Namen, das verwendet wird, wenn das Kontrollkästchen deaktiviert ist. Aber die Lösung ist nicht so einfach, wie es scheint.
Wenn Sie diesen Code hinzufügen:
Dem Browser ist es egal, was Sie hier tun. Der Browser sendet beide Parameter an den Server, und der Server muss entscheiden, was mit ihnen geschehen soll.
PHP verwendet beispielsweise den letzten zu verwendenden Wert (siehe: Autorisierende Position doppelter HTTP-GET-Abfrageschlüssel )
Aber andere Systeme, mit denen ich gearbeitet habe (basierend auf Java), machen es umgekehrt - sie bieten Ihnen nur den ersten Wert. Stattdessen erhalten Sie mit .NET ein Array mit beiden Elementen
Ich werde versuchen, dies irgendwann mit node.js, Python und Perl zu testen.
quelle
request.getParameterValues
Eine übliche Technik besteht darin, eine versteckte Variable zusammen mit jedem Kontrollkästchen zu tragen.
Auf der Serverseite erkennen wir zuerst eine Liste versteckter Variablen und versuchen für jede versteckte Variable zu prüfen, ob der entsprechende Kontrollkästcheneintrag in den Formulardaten gesendet wird oder nicht.
Der serverseitige Algorithmus würde wahrscheinlich folgendermaßen aussehen:
Das Obige beantwortet die Frage nicht genau, bietet jedoch ein alternatives Mittel, um ähnliche Funktionen zu erreichen.
quelle
Sie müssen nicht für alle Kontrollkästchen ein verstecktes Feld erstellen, sondern nur meinen Code kopieren. es wird den Wert der Option ändern , wenn nicht der überprüft
value
wird zuweisen0
und wenn Checkbox dann assign geprüftvalue
in1
quelle
Wenn Sie den Namen des Kontrollkästchens weglassen, wird es nicht übergeben. Nur das Array test_checkbox.
quelle
Sie können Javascript im Submit-Ereignis des Formulars ausführen. Das ist alles, was Sie tun können. Es gibt keine Möglichkeit, Browser dazu zu bringen, dies selbst zu tun. Dies bedeutet auch, dass Ihr Formular für Benutzer ohne Javascript unterbrochen wird. Besser ist es, auf dem Server zu wissen, welche Kontrollkästchen vorhanden sind, damit Sie daraus schließen können, dass diejenigen, die in den veröffentlichten Formularwerten (
$_POST
in PHP) nicht vorhanden sind, deaktiviert sind.quelle
$_REQUEST
Dies ist eine gute Vorgehensweise, da es die Wiederverwendung von Code ermöglicht, wenn Ihr Skript beide Methoden unterstützt.Ich würde eigentlich folgendes tun.
Habe mein verstecktes Eingabefeld mit dem gleichen Namen mit dem Kontrollkästchen eingegeben
und wenn ich dann poste, entferne ich zuerst die doppelten Werte, die im $ _POST-Array aufgenommen wurden, und zeige dann jeden der eindeutigen Werte an.
Ich habe dies von einem Beitrag erhalten , der doppelte Werte aus dem Array entfernt
quelle
checkbox_name[]
jeder Wert in ein Array eingegeben, das Sie dann abrufen können. Beispiel:$_POST['checkbox_name'][0]
und so weiter mit der Erhöhung, wie viele Felder denselben Namen hatten. Ein anderes Beispiel ist, wenn Sie drei Felder mit dem Namen hattenfield_name[]
, können Sie den zweiten Wert vonfield_name
like erhalten$_POST['field_name'][1]
. Der Zweck kann erstaunlich sein, wenn Sie mehrere Felder mit demselben Namen haben."Ich habe mich für den Server-Ansatz entschieden. Scheint gut zu funktionieren - danke. - Reach4thelasers 1. Dezember 09 um 15:19" Ich möchte es vom Eigentümer empfehlen. Wie zitiert: Javascript-Lösung hängt davon ab, wie der Server-Handler (ich habe es nicht überprüft)
sowie
quelle
Ich weiß, dass diese Frage 3 Jahre alt ist, aber ich habe eine Lösung gefunden, die meiner Meinung nach ziemlich gut funktioniert.
Sie können überprüfen, ob die Variable $ _POST zugewiesen ist, und sie in einer Variablen speichern.
Die Funktion isset () prüft, ob die Variable $ _POST zugewiesen ist. Wenn es nicht zugewiesen ist, ist das Kontrollkästchen logischerweise nicht aktiviert.
quelle
Die meisten Antworten hier erfordern die Verwendung von JavaScript oder doppelten Eingabesteuerelementen. Manchmal muss dies vollständig serverseitig erledigt werden.
Ich glaube, der (beabsichtigte) Schlüssel zur Lösung dieses häufigen Problems ist die Kontrolle der Übermittlungseingabe des Formulars.
Um nicht aktivierte Werte für Kontrollkästchen erfolgreich zu interpretieren und zu verarbeiten, müssen Sie über folgende Kenntnisse verfügen:
Durch Überprüfen, ob das Formular gesendet wurde (dem Übermittlungseingabeelement wird ein Wert zugewiesen), können alle nicht aktivierten Kontrollkästchenwerte angenommen werden .
Zum Beispiel:
Bei der Verwendung von PHP ist es ziemlich trivial zu erkennen, welche Kontrollkästchen aktiviert wurden.
Die anfänglichen Daten konnten bei jedem Laden der Seite geladen werden, sollten jedoch nur geändert werden, wenn das Formular gesendet wurde. Da die Namen der Kontrollkästchen im Voraus bekannt sind, können sie einzeln durchlaufen und überprüft werden, sodass das Fehlen ihrer einzelnen Werte darauf hinweist, dass sie nicht aktiviert sind.
quelle
Ich habe zuerst Sams Version ausprobiert. Gute Idee, aber es gibt mehrere Elemente im Formular mit demselben Namen. Wenn Sie Javascript verwenden, das Elemente basierend auf dem Namen findet, wird jetzt ein Array von Elementen zurückgegeben.
Ich habe Shaileshs Idee in PHP ausgearbeitet, sie funktioniert für mich. Hier ist mein Code:
quelle
Ich mag auch die Lösung, dass Sie nur ein zusätzliches Eingabefeld posten und JavaScript verwenden, scheint mir ein wenig hackig.
Je nachdem, was Sie für Ihr Backend verwenden, hängt es davon ab, welche Eingabe zuerst erfolgt.
Für ein Server-Backend, in dem das erste Vorkommen (JSP) verwendet wird, sollten Sie Folgendes tun.
Für ein Server-Backend, in dem das letzte Vorkommen verwendet wird (PHP, Rails), sollten Sie Folgendes tun.
Für ein Server-Backend, in dem alle Vorkommen in einem Listendatentyp (
[]
,array
) gespeichert sind . (Python / Zope)Sie können in beliebiger Reihenfolge posten. Sie müssen lediglich versuchen, den Wert aus der Eingabe mit dem
checkbox
type-Attribut abzurufen. Also der erste Index der Liste, wenn sich das Kontrollkästchen vor dem versteckten Element befand, und der letzte Index, wenn sich das Kontrollkästchen nach dem versteckten Element befand.Bei einem Server-Backend, bei dem alle Vorkommen mit einem Komma (ASP.NET / IIS) verknüpft sind, müssen Sie die Zeichenfolge mithilfe eines Kommas als Trennzeichen (teilen / explodieren), um einen Listendatentyp zu erstellen. (
[]
)Jetzt können Sie versuchen, den ersten Index der Liste abzurufen, wenn sich das Kontrollkästchen vor dem ausgeblendeten Element befand, und den letzten Index abzurufen, wenn sich das Kontrollkästchen nach dem ausgeblendeten Element befand.
Bildquelle
quelle
Ich verwende diesen Block von jQuery, der bei der Übermittlung zu jedem nicht aktivierten Kontrollkästchen eine versteckte Eingabe hinzufügt. Dies garantiert, dass Sie jedes Mal einen Wert für jedes Kontrollkästchen erhalten, ohne Ihr Markup zu überladen und das Risiko einzugehen, dass Sie es bei einem später hinzugefügten Kontrollkästchen vergessen. Es ist auch unabhängig von dem Backend-Stack (PHP, Ruby usw.), den Sie verwenden.
quelle
Sie können das Ereignis form.submit auch abfangen und vor dem Senden erneut prüfen
quelle
Ich sehe, dass diese Frage alt ist und so viele Antworten hat, aber ich werde trotzdem meinen Cent geben. Ich stimme für die Javascript-Lösung beim "Submit" -Ereignis des Formulars, wie einige betont haben. Keine Verdoppelung der Eingaben (insbesondere wenn Sie lange Namen und Attribute mit PHP-Code gemischt mit HTML haben), keine serverseitigen Probleme (die erfordern würden, alle Feldnamen zu kennen und sie einzeln zu überprüfen), rufen Sie einfach alle ungeprüften Elemente ab Weisen Sie ihnen einen Wert von 0 zu (oder was auch immer Sie benötigen, um den Status "nicht geprüft" anzugeben) und ändern Sie dann ihr Attribut "geprüft" in "wahr"
Auf diese Weise erhalten Sie ein $ _POST-Array wie folgt:
quelle
quelle
Was ich getan habe, war ein bisschen anders. Zuerst habe ich die Werte aller nicht aktivierten Kontrollkästchen geändert. Auf "0", dann alle auswählen, damit der Wert übermittelt wird.
quelle
Ich würde es vorziehen, die $ _POST zusammenzustellen
Es macht etwas aus, wenn der POST nicht den Wert 'Checkboxname' hat, wurde er deaktiviert, also weisen Sie einen Wert zu.
Sie können ein Array Ihrer ckeckbox-Werte erstellen und eine Funktion erstellen, die prüft, ob Werte vorhanden sind. Wenn dies nicht der Fall ist, werden sie deaktiviert, und Sie können einen Wert zuweisen
quelle
Beispiel für Ajax-Aktionen ist (': check') jQuery anstelle von .val ();
Parameter erhalten den Wert in TRUE OR FALSE.
quelle
Kontrollkästchen stellen normalerweise Binärdaten dar, die in der Datenbank als Ja / Nein-, J / N- oder 1/0-Werte gespeichert sind. HTML-Kontrollkästchen haben einen schlechten Charakter, um nur dann einen Wert an den Server zu senden, wenn das Kontrollkästchen aktiviert ist! Das bedeutet, dass das Serverskript auf einer anderen Site im Voraus wissen muss, welche Kontrollkästchen auf der Webseite möglich sind, um positive (aktivierte) oder negative (nicht aktivierte) Werte speichern zu können. Tatsächlich sind nur negative Werte problematisch (wenn der Benutzer den zuvor (vor) geprüften Wert deaktiviert - wie kann der Server dies wissen, wenn nichts gesendet wird, wenn er nicht im Voraus weiß, dass dieser Name gesendet werden soll). Wenn Sie ein serverseitiges Skript haben, das dynamisch ein UPDATE-Skript erstellt, liegt ein Problem vor, da Sie nicht wissen, welche Kontrollkästchen empfangen werden sollen, um den Y-Wert für aktivierte und den N-Wert für nicht aktivierte (nicht empfangene) festzulegen.
Da ich die Werte 'Y' und 'N' in meiner Datenbank speichere und sie über aktivierte und deaktivierte Kontrollkästchen auf der Seite darstelle, habe ich für jeden Wert (Kontrollkästchen) ein ausgeblendetes Feld mit 'Y'- und' N'-Werten hinzugefügt und dann Kontrollkästchen nur zur visuellen Darstellung verwendet Darstellung und verwenden Sie die einfache JavaScript-Funktion check (), um den Wert von if entsprechend der Auswahl festzulegen.
Verwenden Sie einen JavaScript-Onclick-Listener und rufen Sie die Funktion check () für jedes Kontrollkästchen auf meiner Webseite auf:
Auf diese Weise werden "Y" - oder "N" -Werte immer an das serverseitige Skript gesendet. Es weiß, welche Felder aktualisiert werden sollten, und es ist nicht erforderlich, den Wert "checbox" on "in" Y "umzuwandeln oder das Kontrollkästchen nicht empfangen in" N "zu konvertieren '.
HINWEIS: Leerzeichen oder neue Zeilen sind ebenfalls Geschwister, daher benötige ich hier .previousSibling.previousSibling.value. Wenn kein Leerzeichen dazwischen ist, dann nur .previousSibling.value
Sie müssen den Onclick-Listener nicht wie zuvor explizit hinzufügen. Mit der jQuery-Bibliothek können Sie den Click-Listener mit der Funktion dynamisch hinzufügen, um den Wert aller Kontrollkästchen auf Ihrer Seite zu ändern:
quelle
Alle Antworten sind großartig, aber wenn Sie mehrere Kontrollkästchen in einem Formular mit demselben Namen haben und den Status jedes Kontrollkästchens veröffentlichen möchten. Dann habe ich dieses Problem gelöst, indem ich ein verstecktes Feld mit dem Kontrollkästchen platziert habe (Name bezogen auf das, was ich will).
Steuern Sie dann den Änderungsstatus des Kontrollkästchens mithilfe des folgenden Abfragecodes:
Wenn Sie jetzt ein Kontrollkästchen ändern, wird der Wert des zugehörigen ausgeblendeten Felds geändert. Auf dem Server können Sie nur nach ausgeblendeten Feldern anstatt nach Kontrollkästchen suchen.
Hoffe, dies wird jemandem helfen, diese Art von Problem zu haben. jubeln :)
quelle
Das Problem mit Kontrollkästchen besteht darin, dass sie nicht mit Ihrem Formular gebucht werden, wenn sie nicht aktiviert sind. Wenn Sie ein Kontrollkästchen aktivieren und ein Formular veröffentlichen, erhalten Sie den Wert des Kontrollkästchens in der Variablen $ _POST, mit dem Sie ein Formular verarbeiten können. Wenn das Kontrollkästchen deaktiviert ist, wird der Variablen $ _POST kein Wert hinzugefügt.
In PHP umgehen Sie dieses Problem normalerweise, indem Sie ein isset () - Check für Ihr Checkbox-Element durchführen. Wenn das erwartete Element nicht in der Variablen $ _POST festgelegt ist, wissen wir, dass das Kontrollkästchen nicht aktiviert ist und der Wert falsch sein kann.
Wenn Sie jedoch ein dynamisches Formular erstellt haben, kennen Sie das Namensattribut Ihrer Kontrollkästchen nicht immer. Wenn Sie den Namen des Kontrollkästchens nicht kennen, können Sie mit der Funktion isset nicht überprüfen, ob dieses Formular gesendet wurde die Variable $ _POST.
quelle
quelle
Es gibt eine bessere Problemumgehung. Geben Sie zunächst nur den Kontrollkästchen, die aktiviert sind, ein Namensattribut. Klicken Sie dann beim Klicken
submit
über ein JavaScriptfunction
auf alle nicht aktivierten Kontrollkästchen. Wenn Sie alsosubmit
nur diejenigen abrufenform collection
, die sie habenname
Eigentum haben.Vorteil: Sie müssen keine zusätzlichen versteckten Boxen erstellen und bearbeiten.
quelle
@cpburnz hat es richtig gemacht, aber zu viel Code, hier ist die gleiche Idee mit weniger Code:
JS:
HTML (notieren Sie den Feldnamen mit einem Array-Namen):
Und für PHP:
quelle
jQuery-Version von @ vishnus Antwort.
Wenn Sie jQuery 1.5 oder niedriger verwenden, verwenden Sie bitte die Funktion .attr () anstelle von .prop ().
quelle
Diese Lösung ist von der von @ desw inspiriert.
Wenn Ihre Eingabenamen im "Formularstil" vorliegen, verlieren Sie die Array-Indexzuordnung zu Ihren Chekbox-Werten, sobald eine Chekbox aktiviert ist, und erhöhen diese "Dissoziation" bei jeder Überprüfung einer Chekbox um eine Einheit. Dies kann der Fall sein bei einem Formular zum Einfügen von Mitarbeitern, die aus bestimmten Feldern bestehen, z. B.:
Wenn Sie drei Mitarbeiter gleichzeitig einfügen und der erste und der zweite Mitarbeiter einzeln sind, erhalten Sie ein 5-Element
isSingle
Array , sodass Sie beispielsweise nicht sofort durch die drei Arrays iterieren können, um dies zu tun , Mitarbeiter in eine Datenbank einfügen.Sie können dies mit einer einfachen Array-Nachbearbeitung überwinden. Ich verwende PHP auf der Serverseite und habe Folgendes getan:
quelle
Diese Lösung ist für diese Frage übertrieben, aber sie hat mir geholfen, als ich das gleiche Kontrollkästchen hatte, das für verschiedene Zeilen in einer Tabelle häufig vorkam. Ich musste die Zeile kennen, die das Kontrollkästchen darstellt, und auch den Status des Kontrollkästchens kennen (aktiviert / deaktiviert).
Ich habe das Namensattribut aus meinen Checkbox-Eingaben entfernt, allen dieselbe Klasse zugewiesen und eine versteckte Eingabe erstellt, die das JSON-Äquivalent der Daten enthält.
HTML
Javascript zum Ausführen auf Formular senden
Die JSON-Zeichenfolge wird mit dem Formular $ _POST ["has-permissions-values"] übergeben. Dekodieren Sie in PHP die Zeichenfolge in ein Array, und Sie erhalten ein assoziatives Array mit jeder Zeile und dem True / False-Wert für jedes entsprechende Kontrollkästchen. Es ist dann sehr einfach, durch die aktuellen Datenbankwerte zu gehen und diese zu vergleichen.
quelle