전체 HTML 양식을 "읽기 전용"으로 만들려면 어떻게해야합니까?


155

HTML 양식이있는 두 페이지가 있습니다. 첫 번째 페이지에는 제출 양식이 있고 두 번째 페이지에는 승인 양식이 있습니다. 첫 번째 양식은 많은 컨트롤을 선택할 수있는 반면, 두 번째 페이지는 제출 양식의 데이터를 확인 메시지와 함께 다시 표시합니다. 이 두 번째 양식에서 모든 필드는 정적이어야합니다.

내가 볼 수 있듯이, 일부 양식 컨트롤은 readonly모두 가능하며 disabled, 차이점은 여전히 ​​읽기 전용 필드로 탭 할 수 있다는 것입니다.

이 필드를 필드별로 수행하는 대신 사용자가 컨트롤을 변경할 수 없도록 전체 양식을 읽기 전용 / 비활성화 / 정적으로 표시하는 방법이 있습니까?

답변:


309

입력 필드 및 기타 항목을 a로 랩핑하고 속성을 <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> 요소의 자손을 제외한 [fieldset] 자손 인 폼 컨트롤을 만드는 부작용이 있습니다. [not] 마우스 클릭이나 포커스 관련 요소와 같은 브라우징 이벤트를받지 않습니다. "( developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset ). 따라서 자손에 정의한 모든 js 이벤트 리스너가 작동하지 않을 수 있습니다.
Eric Freese

2
@EricFreese 비활성화 된 상태에서만, 99 %의 경우에 원하는 것입니다.
혼자 칼 푸스

11

readonly예를 들어, 모든 양식 요소를로 설정할 수있는 것은 아닙니다 .

  • 확인란
  • 라디오 박스
  • 파일 업로드
  • ...더..

OP가 특정 "잠금"양식을 서버로 보내야한다고 명시하지 않았기 때문에 합리적인 해결책은 모든 양식 요소의 disabled속성을 로 설정 true하는 것입니다.disabled 속성이 허용하지 않음).

아래 데모에서 제시되는 또 다른 솔루션은 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는 Monica Monica를 복원

6

확인 페이지에서 내용을 편집 가능한 컨트롤에 넣지 말고 페이지에 쓰십시오.


1
이것은 실제로 가장 성가신 접근 방식입니다. 사용자에게 편집 할 수없는 양식을 제시하지 마십시오. 그렇지 않으면 "최소한의 놀랍게도"질문에 입력됩니다.
kibibu

1
어떻게? 체크 박스와 체크 / 체크되지 않은 상태 또는 선택된 항목이있는 라디오 그룹을 표시하려면 어떻게해야합니까?
Mawg는 모니카

1
@Mawg 아마도 '선택된'항목을 체크 박스없이 나열하는 옵션 일 수 있습니다. 피자 주문 확인서처럼 : 선택한 모든 재료를 나열하십시오.
marc82ch

이 경우는 아니지만 다른 사람들을 도울 수있는 좋은 측면 사고에 감사드립니다.
Mawg는 모니카 복원

4

이 작업을 수행하는 기본 제공 방법이 없으므로 양식이 얼마나 복잡한 지에 따라 사용자 지정 솔루션을 만들어야합니다. 이 게시물을 읽어야합니다.

HTML 양식을 읽기 전용으로 변환 ( 업데이트 : 손상된 게시물 링크, 보관 된 링크 )

편집 : 업데이트에 따라 왜 읽기 전용이 걱정됩니까? 클라이언트 측을 통해 할 수 있지만 그렇지 않은 경우 각 컨트롤에 필요한 태그를 추가하거나 데이터를 변환하여 컨트롤이없는 원시 텍스트로 표시해야합니다. 다음 게시물이 수정되지 않도록 읽기 전용으로 만들려고하면 누구나 게시물을 엉망으로 만들 수 있기 때문에 실제로 데이터를받을 때 원하는 게시물을 생성하여 확인하는 것이 좋습니다. 다시 유효한지 확인하십시오.


+1 감사합니다. 그러나 클라이언트 측 솔루션을 사용할 수 없습니다. 업데이트 된 질문 (죄송합니다, 내 나쁜 점)을 참조하십시오.
Mawg는 Monica를 복원

"업데이트를 기반으로 한 이유만으로도 읽기 전용이 걱정 되십니까? 클라이언트 측을 통해 할 수 있습니다."죄송합니다. 1) 클라이언트 측 (내 선택이 아님)과 2)가 보이는 경우에는 할 수 없습니다. 자신을 혼란스럽게 할 수있는 것을 바꾸는 것처럼 사용자에게
Mawg는 모니카

@mawg 잘 시각적 인 경우라면 내가 추천 할 수있는 유일한 것은 모든 컨트롤을 해당 텍스트로 바꾸거나 읽기 전용 속성을 컨트롤에 추가하는 것입니다. 은 총알이 없으며 나는 당신이 찾고있는 감각을 얻습니다. 수정할 수있는 코드 스 니펫을 게시 할 수 있습니까? 작업하는 내용의 기초를 얻는 것이 도움이 될 것입니다.
Kelsey

제안 해 주셔서 +1 감사합니다. 나는 이전에 실제로 눈치 채지 못했지만 양식뿐만 아니라 텍스트가 아닌 읽기 전용 버전을 모호하게 기억한다면 100 대 또는 1,000 대를 채워야합니다. 어쩌면 나는 몇 가지를 더 작성하고 관찰해야합니다 :-)
Mawg는 모니카가

3
놀랍게도 ... 6 년 후 링크가 더 이상 작동하지 않습니다.
mwallisch

3

완벽하게 호환되는 공식 HTML 방법은 없지만 약간의 자바 스크립트는 먼 길을 갈 수 있습니다. 또 다른 문제는 POST 데이터에 비활성화 된 필드가 표시되지 않는다는 것입니다.


4
이미 데이터의 유효성을 검사 한 경우 어쨌든 서버 측에 저장해야합니다. 고객에게주고받는 것은 큰 보안 허점입니다. css, js 또는 html을 사용하여 필드를 고정하더라도 파이어 버그 또는 다음 HTTP 요청을 수동으로 변경하여 m을 편집 할 수 있습니다
Michael Clerx

+1 감사합니다.하지만 클라이언트 측 솔루션을 사용할 수 없습니다. 업데이트 된 질문 (죄송합니다, 내 나쁜 점)을 참조하십시오.
Mawg는 Monica Monica를 복원했습니다 : Monica

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는 Monica Monica를 복원했습니다 : Monica

1

오히려 jQuery를 사용하고 싶습니다.

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

find ()는 children ()보다 n 번째로 중첩 된 자식까지 훨씬 깊어 질 것입니다. 즉, 즉시 자식 만 찾습니다.


1
고마워, 난 당신이 새로운이기 때문에 시도에 대한 투표를합니다. 그러나 서버 측 전용 솔루션을 분명히 요청했습니다. 당시에는 PHP 만 코딩했지만 아직 JS는 아닙니다. 일부 사람들이 실제로 당신을 위해 이것을
내려

1

가장 쉬운 방법

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

사실이지만 이것은 도끼 예일뿐입니다. 두 번째 선택기를 다른 것으로 바꿀 수 있습니다. 예 : $ ( '# yourform .yourclass_for_inputs'). prop ( 'readonly', true);
Samir Rahimy 2012 년

1

양식 위에 HTML 보이지 않는 레이어를 추가합니다. 예를 들어

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

그리고 스타일 :

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

물론 사용자는 웹 브라우저에서이 계층을 숨길 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.