HTMLフォーム全体を「読み取り専用」にするにはどうすればよいですか?


154

HTMLフォームを含む2つのページがあります。最初のページには送信フォームがあり、2番目のページには確認フォームがあります。最初のフォームでは多くのコントロールを選択できますが、2番目のページには送信フォームのデータが確認メッセージとともに再度表示されます。この2番目のフォームでは、すべてのフィールドが静的でなければなりません。

私が見ることができるものから、一部のフォームコントロールはreadonlyすべてのdisabled場合があり得ますが、読み取り専用フィールドにタブで移動できるという違いがあります。

このフィールドごとに行うのではなく、ユーザーがコントロールを変更できないようにフォーム全体を読み取り専用/無効/静的としてマークする方法はありますか?

回答:


307

入力フィールドとその他のものをにラップし<fieldset>て、disabled="disabled"属性を与えます。

例(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>


2
私のためのシンプルで素晴らしいソリューション。ありがとう
デモ

2
クライアント側に最適なソリューション:) +1
Sisir

1
非常に単純ですが、これはこれまでのところ最高のクライアント側ソリューションです。
brunocoelho

注:これには、「最初のオプションの<legend>要素の子孫を除いて、[フィールドセット]の子孫であるフォームコントロール... "(developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset)。したがって、子孫で定義したjsイベントリスナーは機能しない可能性があります。
Eric Freese

2
@EricFreese無効な状態でのみ、99%のケースでこれが必要です。
Honza Kalfus、2018年

11

readonlyたとえば、すべてのフォーム要素をに設定できるわけではありません。

  • チェックボックス
  • ラジオボックス
  • ファイルのアップロード
  • ...もっと..

次に、OPが特定の「ロックされた」フォームをサーバーに送信する必要があることを属性が許可していないため、OPがすべてのフォーム要素のdisabled属性をに設定するのが妥当な解決策です。truedisabled

以下のデモに示されている別の解決策は、form要素の上にレイヤーを配置することです。これにより、要素内のすべての要素との相互作用が防止formされz-indexます。

デモ:

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>


1
CSSソリューションはキーボードナビゲーションを妨げないため、不完全です。
Tanriol

7

この関数を使用して、フォームを無効にすることができます。

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

ここで実際のデモを見る

jQueryを使用していることに注意してください。


+1ありがとうございます。ただし、クライアント側のソリューションを使用することはできません。更新された質問を参照してください(申し訳ありませんが、私の悪い)
Mawgはモニカを

6

確認ページでは、コンテンツを編集可能なコントロールに配置せず、ページに書き込んでください。


1
これは本当に正直なアプローチです。編集不可能なフォームをユーザーに提示しないでください。そうしないと、「最小の驚き」の質問のエントリーになります。
kibibu

1
どうやって?チェックボックスとそのチェック/チェックなしの状態、または選択したアイテムを含むラジオグループなどを表示するにはどうすればよいですか?
Mawg氏によると、モニカは

1
@Mawgチェックボックスなしで「選択された」アイテムのみをリストするオプションかもしれません。ピザの注文確認のように:選択したすべての材料をリストするだけです。
marc82ch 2015

この場合はそうではありませんが、他の人を助けるかもしれない側面的な考え方の良い部分に感謝します。
Mawg氏は、

4

これを行うための組み込みの方法はないので、フォームの複雑さに応じてカスタムソリューションを考え出す必要があります。あなたはこの投稿を読むべきです:

HTMLフォームを読み取り専用に変換更新壊れた投稿リンク、アーカイブされたリンク

編集:更新に基づいて、なぜそれを読み取り専用にすることについてそれほど心配しているのですか?クライアント側で行うことができますが、そうでない場合は、各コントロールに必要なタグを追加するか、データを変換して、コントロールなしの未加工テキストとして表示する必要があります。次の投稿が変更されないように読み取り専用にしようとしている場合、誰もが投稿を操作して必要なものを作成できるため、実際に最終的にデータを受信するときにチェックすることをお勧めします。再びそれが有効であることを確認します。


+1おかげで、クライアント側のソリューションを使用できません。更新された質問を参照してください(申し訳ありませんが、私の悪い)
Mawgはモニカを

「更新に基づいて、なぜそれだけを読み取り専用にするのが心配なのですか?クライアント側から実行できます」申し訳ありませんが、1)クライアント側では実行できません(私の選択ではありません)。ユーザーを混乱させるかもしれないものを変更しているように。
Mawgはモニカを

@mawgがビジュアルのみの場合は、インラインですべてのコントロールを同等のテキストに置き換えるか、コントロールにreadonlyプロパティを追加することだけをお勧めします。特効薬はありませんが、あなたが探しているものだと感じます。変更が許可されているコードのスニペットを投稿できますか?それはあなたが作業しているものの基礎を取得するのに役立ちます。
ケルシー2010

提案を+1してくれてありがとう。今まで気が付かなかったのですが、フォームだけでなくテキストの読み取り専用バージョンを漠然と覚えている場合は、数百または数千を入力したに違いありません。多分私はさらにいくつか記入して観察する必要があります:-)
モーグはモニカを

3
驚き... 6年後、リンクは機能しなくなります。
mwallisch 2016

3

完全に準拠した公式のHTMLを使用する方法はありませんが、小さなJavaScriptは長い道のりを行くことができます。遭遇するもう1つの問題は、無効化されたフィールドがPOSTデータに表示されないことです。


4
データを既に検証済みの場合は、とにかくサーバー側に保存する必要があります。それをクライアントとの間でやり取りすることは、大昔のセキュリティホールです。css、js、またはhtmlを使用してフィールドをフリーズしても、
firebugを使用

+1ありがとうございます。ただし、クライアント側のソリューションを使用することはできません。更新された質問を参照してください(申し訳ありませんが、私の悪い)
Mawgはモニカを

3

これは、指定された要素のすべての入力テキストエリア選択ボタンを無効にするための理想的なソリューションです。

jQuery 1.6以降の場合

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

または

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

jQuery 1.5以下

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

そして

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

2

すべてのブラウザでサポートされている別の簡単な方法は次のとおりです。

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;
}

ただし、タブは引き続きこのアプローチで機能し、フォーカスのある要素はユーザーが引き続き操作できることに注意してください。


1

すべてのフォームIDに番号を付け、JSでforループを実行します。

 for(id = 0; id<NUM_ELEMENTS; id++)
   document.getElementById(id).disabled = false; 

+1ありがとうございます。ただし、クライアント側のソリューションを使用することはできません。更新された質問を参照してください(申し訳ありませんが、私の悪い)
Mawgはモニカを

1

私はむしろjQueryを使いたいです:

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

find()はn番目のネストされた子まで、直接の子のみを検索するchildren()よりも深くなります。


1
ありがとうございます。あなたは新しいので、試してみてください。ただし、サーバー側のみのソリューションを明確に求めたことに注意してください。当時、私はPHPのみをコーディングし、JSはまだコーディングしていませんでした。一部の人が実際にこれに反対票を投じる可能性があるので、質問を読むためのフレンドリーなヒント:-(ようこそ:-)
Mawgはモニカを2015

1

最も簡単な方法

$('#yourform *').prop('readonly', true);

これはtrueですが、これは単なる2番目の例であり、2番目のセレクターを他のセレクターに変更できます。例:$( '#yourform .yourclass_for_inputs')。prop( 'readonly'、true);
Samir Rahimy

1

フォームにhtml非表示レイヤーを追加します。例えば

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

とスタイル:

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

もちろん、ユーザーはWebブラウザーでこのレイヤーを非表示にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.