Wie kann ich ein ganzes HTML-Formular "schreibgeschützt" machen?

154

Ich habe zwei Seiten mit HTML-Formularen. Die erste Seite hat ein Einreichungsformular und die zweite Seite hat ein Bestätigungsformular. Das erste Formular bietet eine Auswahl vieler Steuerelemente, während auf der zweiten Seite die Daten aus dem Übermittlungsformular erneut mit einer Bestätigungsnachricht angezeigt werden. In diesem zweiten Formular müssen alle Felder statisch sein.

Soweit ich sehen kann, können einige Formularsteuerelemente sein readonlyund alle können es sein disabled, mit dem Unterschied, dass Sie immer noch zu einem schreibgeschützten Feld wechseln können.

Gibt es eine Möglichkeit, das gesamte Formular als schreibgeschützt / deaktiviert / statisch zu markieren, anstatt es Feld für Feld auszuführen, sodass der Benutzer keines der Steuerelemente ändern kann?

Mawg sagt, Monica wieder einzusetzen
quelle

Antworten:

306

Wickeln Sie die Eingabefelder und andere Dinge in ein <fieldset>und geben Sie ihm das disabled="disabled"Attribut.

Beispiel ( http://jsfiddle.net/7qGHN/ ):

<form>
    <fieldset disabled="disabled">
        <input type="text" name="something" placeholder="enter some text" />
        <select>
            <option value="0" disabled="disabled" selected="selected">select somethihng</option>
            <option value="1">woot</option>
            <option value="2">is</option>
            <option value="3">this</option>
        </select>
    </fieldset>
</form>

Klemen Tušar
quelle
2
einfache und großartige Lösung für mich. Danke
Demo
2
Beste Lösung für Kundenseite :) +1
Sisir
1
Ziemlich einfach, dies ist die bisher beste clientseitige Lösung.
Brunocoelho
Hinweis: Dies hat den Nebeneffekt, dass "die Formularsteuerelemente, die [die Feldsätze] Nachkommen sind, mit Ausnahme der Nachkommen des ersten optionalen <legend> -Elements ... [nicht] Browsing-Ereignisse wie Mausklicks oder fokusbezogene erhalten "( developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset ). Daher funktionieren alle js-Ereignis-Listener, die Sie möglicherweise für Nachkommen definiert haben, möglicherweise nicht.
Eric Freese
2
@EricFreese Nur im deaktivierten Zustand, was in 99% der Fälle gewünscht wird.
Honza Kalfus
11

Nicht alle Formularelemente können festgelegt werden readonly, zum Beispiel:

  • Kontrollkästchen
  • Radioboxen
  • Datei-Upload
  • ...Mehr..

Dann wäre die vernünftige Lösung, die disabledAttribute aller Formularelemente auf zu setzentrue , da das OP nicht angegeben hat, dass das spezifische "gesperrte" Formular an den Server gesendet werden soll (was das disabledAttribut nicht zulässt).

Eine andere Lösung, die in der folgenden Demo vorgestellt wird, besteht darin, eine Ebene über dem formElement zu platzieren, die jegliche Interaktion mit allen Elementen innerhalb des formElements verhindert, da diese Ebene mit einer größeren Ebene festgelegt istz-index Wert festgelegt ist:

DEMO:

var form = document.forms[0], // form element to be "readonly"
    btn1 = document.querySelectorAll('button')[0],
    btn2 = document.querySelectorAll('button')[1]

btn1.addEventListener('click', lockForm)
btn2.addEventListener('click', lockFormByCSS)

function lockForm(){
  btn1.classList.toggle('on');
  [].slice.call( form.elements ).forEach(function(item){
      item.disabled = !item.disabled;
  });
}

function lockFormByCSS(){
  btn2.classList.toggle('on');
  form.classList.toggle('lock');
}
form{ position:relative; } 
form.lock::before{
  content:'';
  position:absolute;
  z-index:999;
  top:0;
  right:0;
  bottom:0;
  left:0;
}

button.on{ color:red; }
<button type='button'>Lock / Unlock Form</button>
<button type='button'>Lock / Unlock Form (with CSS)</button>
<br><br>
<form>
  <fieldset>
    <legend>Some Form</legend>
    <input placeholder='text input'>
    <br><br>
    <input type='file'>
    <br><br>
    <textarea placeholder='textarea'></textarea>
    <br><br>
    <label><input type='checkbox'>Checkbox</label>
    <br><br>
    <label><input type='radio' name='r'>option 1</label>
    <label><input type='radio' name='r' checked>option 2</label>
    <label><input type='radio' name='r'>option 3</label>
    <br><br>
    <select>
      <option>options 1</option>
      <option>options 2</option>
      <option selected>options 3</option>
    </select>
  </fieldset>
</form>

vsync
quelle
1
Bitte beachten Sie, dass die CSS-Lösung unvollständig ist, da sie die Tastaturnavigation nicht verhindert.
Tanriol
7

Mit dieser Funktion können Sie das Formular deaktivieren:

function disableForm(formID){
  $('#' + formID).children(':input').attr('disabled', 'disabled');
}

Sehen Sie hier die Arbeitsdemo

Beachten Sie, dass jQuery verwendet wird.

Sarfraz
quelle
+1 Danke, aber ich kann keine clientseitigen Lösungen verwenden, siehe aktualisierte Frage (sorry, meine schlechte)
Mawg sagt, Monica
6

Fügen Sie den Inhalt auf der Bestätigungsseite nicht in bearbeitbare Steuerelemente ein, sondern schreiben Sie ihn einfach auf die Seite.

Doobi
quelle
1
Dies ist wirklich der vernünftigste Ansatz. Präsentieren Sie einem Benutzer kein nicht bearbeitbares Formular, sonst werden Sie zum Eintrag in der Frage "Am wenigsten erstaunt".
Kibibu
1
Wie? Wie kann ich ein Kontrollkästchen und seinen aktivierten / nicht aktivierten Zustand oder eine Funkgruppe mit dem ausgewählten Element usw. anzeigen?
Mawg sagt, Monica
1
@Mawg Vielleicht wäre es eine Option, nur die 'ausgewählten' Elemente ohne Kontrollkästchen aufzulisten. Wie auf einer Pizza-Bestellbestätigung: Listen Sie einfach alle Zutaten auf, die Sie ausgewählt haben.
März 82ch
In diesem Fall nicht, aber danke für ein gutes Stück Querdenken, das anderen helfen könnte.
Mawg sagt, Monica
4

Ich kenne keine integrierte Methode, um dies zu tun. Je nachdem, wie kompliziert Ihr Formular ist, müssen Sie eine benutzerdefinierte Lösung finden. Sie sollten diesen Beitrag lesen:

HTML-Formulare in schreibgeschützte konvertieren ( Update : defekter Post-Link, archivierter Link )

BEARBEITEN: Warum sind Sie aufgrund Ihres Updates so besorgt, dass es schreibgeschützt ist? Sie können dies clientseitig tun. Andernfalls müssen Sie jedem Steuerelement das erforderliche Tag hinzufügen oder die Daten konvertieren und als Rohtext ohne Steuerelemente anzeigen. Wenn Sie versuchen, es schreibgeschützt zu machen, damit der nächste Beitrag nicht geändert wird, haben Sie ein Problem, da jeder mit dem Beitrag herumspielen kann, um das zu produzieren, was er will. Wenn Sie also tatsächlich die Daten erhalten, sollten Sie sie besser überprüfen erneut, um sicherzustellen, dass es gültig ist.

Kelsey
quelle
+1 Danke, aber ich kann keine clientseitigen Lösungen verwenden, siehe aktualisierte Frage (sorry, meine schlechte)
Mawg sagt, Monica
"Warum sind Sie aufgrund Ihres Updates so besorgt, dass es schreibgeschützt ist? Sie können es auf der Clientseite ausführen." Entschuldigung, aber 1) Ich kann es nicht auf der Clientseite ausführen (nicht meine Wahl) und 2) wenn es aussieht für den Benutzer, als würde er Dinge ändern, die ihn verwirren könnten.
Mawg sagt, Monica
@mawg Nun, wenn es nur für visuelle Zwecke gedacht ist, kann ich nur empfehlen, alle Steuerelemente inline durch ihre Textäquivalente zu ersetzen oder die schreibgeschützte Eigenschaft zu den Steuerelementen hinzuzufügen. Es gibt keine Silberkugel und ich habe das Gefühl, dass Sie danach suchen. Können Sie einen Ausschnitt des Codes veröffentlichen, den Sie ändern dürfen? Es würde helfen, nur eine Grundlage für das zu bekommen, mit dem Sie arbeiten.
Kelsey
+1 danke für den vorschlag. Ich habe es noch nie wirklich bemerkt, aber ich muss 100er oder 1000er ausgefüllt haben, wenn Formulare und sich vage an eine schreibgeschützte Version erinnern, nicht nur an Text. Vielleicht sollte ich noch ein paar ausfüllen und beachten :-)
Mawg sagt, Monica
3
Überraschung ... 6 Jahre später funktioniert der Link nicht mehr.
Mwallisch
3

Es gibt keine vollständig konforme, offizielle HTML-Methode, aber ein wenig Javascript kann viel bewirken. Ein weiteres Problem besteht darin, dass deaktivierte Felder in den POST-Daten nicht angezeigt werden

Michael Clerx
quelle
4
Wenn Sie die Daten bereits validiert haben, müssen Sie sie trotzdem serverseitig speichern. Das Senden an den Kunden ist eine große Sicherheitslücke. Selbst wenn Sie CSS, JS oder HTML verwenden, um die Felder einzufrieren, können Sie sie mit Firebug bearbeiten oder die nächste HTTP-Anfrage manuell ändern
Michael Clerx
+1 Danke, aber ich kann keine clientseitigen Lösungen verwenden, siehe aktualisierte Frage (sorry, meine schlechte)
Mawg sagt, Monica
3

Dies ist eine ideale Lösung zum Deaktivieren aller Eingaben , Textbereiche , Auswahlen und Schaltflächen in einem bestimmten Element.

Für jQuery 1.6 und höher :

// To fully disable elements
$('#myForm :input').prop('disabled', true); 

Oder

// To make elements readonly
$('#myForm :input').prop('readonly', true); 

jQuery 1.5 und niedriger :

$('#myForm :input').prop('disabled', 'disabled');

Und

$('#myForm :input').prop('readonly', 'readonly');
Mystisch
quelle
2

Eine andere einfache Möglichkeit, die von allen Browsern unterstützt wird, ist:

HTML:

<form class="disabled">
  <input type="text" name="name" />
  <input type="radio" name="gender" value="male">
  <input type="radio" name="gender" value="female">
  <input type="checkbox" name="vegetarian">
</form>

CSS:

.disabled {
  pointer-events: none;
  opacity: .4;
}

Beachten Sie jedoch, dass das Tabbing bei diesem Ansatz weiterhin funktioniert und die Elemente mit Fokus weiterhin vom Benutzer bearbeitet werden können.

M. Neuweiler
quelle
1

Lassen Sie alle Formular-IDs nummerieren und führen Sie eine for-Schleife in JS aus.

 for(id = 0; id<NUM_ELEMENTS; id++)
   document.getElementById(id).disabled = false; 
TTT
quelle
+1 Danke, aber ich kann keine clientseitigen Lösungen verwenden, siehe aktualisierte Frage (sorry, meine schlechte)
Mawg sagt, Monica
1

Ich würde lieber jQuery verwenden:

$('#'+formID).find(':input').attr('disabled', 'disabled');

find () würde bis zum n-ten verschachtelten Kind viel tiefer gehen als children (), das nur nach unmittelbaren Kindern sucht.

user163861
quelle
1
Danke, ich werde dich dafür unterstützen, dass du es versuchst, da du neu bist. ABER bitte beachten Sie, dass ich eindeutig nach einer Lösung nur für den Server gefragt habe. Zu dieser Zeit habe ich nur PHP und noch nicht JS codiert. Ein freundlicher Hinweis, um die Frage zu lesen, da einige Sie tatsächlich dafür ablehnen könnten :-( Willkommen an Bord :-)
Mawg sagt, Monica
1

Einfachster Weg

$('#yourform *').prop('readonly', true);
Samir Rahimy
quelle
es ist wahr, aber dies ist nur ein Beispiel dafür, dass Sie Ihren zweiten Selektor in einen anderen ändern können, zum Beispiel $ ('# yourform .yourclass_for_inputs'). prop ('readonly', true);
Samir Rahimy
1

Sie fügen dem Formular eine unsichtbare HTML-Ebene hinzu. Zum Beispiel

<div class="coverContainer">
<form></form>
</div>

und Stil:

.coverContainer{
    width: 100%;
    height: 100%;
    z-index: 100;
    background: rgba(0,0,0,0);
    position: absolute;
}

Natürlich kann der Benutzer diese Ebene im Webbrowser ausblenden.

Marcin Żurek
quelle