Làm cách nào tôi có thể tạo toàn bộ biểu mẫu HTML có thể đọc thành tiếng HTML?


154

Tôi có hai trang với các mẫu HTML. Trang đầu tiên có biểu mẫu gửi và trang thứ hai có biểu mẫu xác nhận. Biểu mẫu đầu tiên cung cấp nhiều lựa chọn điều khiển, trong khi trang thứ hai hiển thị lại dữ liệu từ biểu mẫu gửi với thông báo xác nhận. Trên mẫu thứ hai này, tất cả các trường phải tĩnh.

Từ những gì tôi có thể thấy, một số điều khiển biểu mẫu có thể readonlyvà tất cả đều có thể disabled, sự khác biệt là bạn vẫn có thể chuyển sang trường chỉ đọc.

Thay vì thực hiện trường này theo trường, có cách nào để đánh dấu toàn bộ biểu mẫu là chỉ đọc / tắt / tĩnh để người dùng không thể thay đổi bất kỳ điều khiển nào không?

Câu trả lời:


306

Bọc các trường đầu vào và các thứ khác vào một <fieldset>và cung cấp cho nó disabled="disabled"thuộc tính.

Ví dụ ( 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
giải pháp đơn giản và tuyệt vời cho tôi. Cảm ơn
bản demo

2
Giải pháp tốt nhất cho phía khách hàng :) +1
Sisir

1
Khá đơn giản, đây là giải pháp phía khách hàng tốt nhất cho đến nay.
brunocoelho

Lưu ý: Điều này có tác dụng phụ là tạo ra "các điều khiển biểu mẫu là hậu duệ [trường con], ngoại trừ hậu duệ của phần tử <Legend> tùy chọn đầu tiên của nó ... [không] nhận bất kỳ sự kiện duyệt nào, như nhấp chuột hoặc liên quan đến tiêu điểm "( developer.mozilla.org/en-US/docs/Web/HTML/Euity/fieldset ). Vì vậy, bất kỳ trình nghe sự kiện js nào bạn có thể đã xác định trên con cháu có thể không hoạt động.
Eric Freese

2
@EricFreese Chỉ trong trạng thái bị vô hiệu hóa, đó là những gì bạn muốn trong 99% trường hợp.
Honza Kalfus

11

Không phải tất cả các yếu tố hình thức có thể được đặt thành readonly, ví dụ:

  • hộp kiểm
  • hộp radio
  • tải lên tập tin
  • ...hơn..

Sau đó, giải pháp hợp lý sẽ là đặt các disabledthuộc tính của tất cả các thành phần của biểu mẫu true, vì OP không nói rõ rằng biểu mẫu "bị khóa" cụ thể phải được gửi đến máy chủ (mà disabledthuộc tính không cho phép).

Một giải pháp khác, được trình bày trong bản demo bên dưới, là đặt một lớp lên trên formphần tử, điều này sẽ ngăn mọi tương tác với tất cả các phần tử bên trong formphần tử, vì lớp đó được đặt với z-indexgiá trị lớn hơn :

BẢN GIỚI THIỆU:

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
Xin lưu ý rằng giải pháp CSS không đầy đủ vì nó không ngăn điều hướng bàn phím.
Tanriol

7

Bạn có thể sử dụng chức năng này để vô hiệu hóa biểu mẫu:

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

Xem bản demo làm việc tại đây

Lưu ý rằng nó sử dụng jQuery.


+1 Cảm ơn, nhưng tôi không thể sử dụng các giải pháp phía khách hàng, xem câu hỏi được cập nhật (xin lỗi, tôi rất tệ)
Mawg nói rằng phục hồi Monica

6

Trên trang xác nhận, không đặt nội dung trong các điều khiển có thể chỉnh sửa, chỉ cần viết chúng vào trang.


1
Đây thực sự là cách tiếp cận sanest. Đừng trình bày một hình thức không thể chỉnh sửa cho người dùng, hoặc cuối cùng bạn sẽ trở thành một mục trong câu hỏi "Ít ngạc nhiên nhất".
kibibu

1
làm sao? Làm cách nào tôi có thể hiển thị hộp kiểm và điều kiện kiểm tra / không kiểm tra hoặc nhóm radio với mục đã chọn, v.v.?
Mawg nói rằng phục hồi Monica

1
@Mawg có thể là một tùy chọn để chỉ liệt kê các mục 'được chọn', không có hộp kiểm. Giống như trên một xác nhận đặt hàng pizza: chỉ cần liệt kê tất cả các thành phần bạn đã chọn.
marc82ch

Trong trường hợp này thì không, nhưng cảm ơn vì một suy nghĩ tốt bên có thể giúp đỡ người khác.
Mawg nói rằng phục hồi Monica

4

Không có cách tích hợp nào mà tôi biết để làm điều này vì vậy bạn sẽ cần đưa ra một giải pháp tùy chỉnh tùy thuộc vào mức độ phức tạp của biểu mẫu của bạn. Bạn nên đọc bài viết này:

Chuyển đổi các biểu mẫu HTML thành chỉ đọc ( Cập nhật : liên kết bài bị hỏng, liên kết lưu trữ )

EDIT: Dựa trên bản cập nhật của bạn, tại sao bạn lại lo lắng về việc nó chỉ đọc? Bạn có thể thực hiện thông qua phía máy khách nhưng nếu không, bạn sẽ phải thêm thẻ yêu cầu vào mỗi điều khiển hoặc chuyển đổi dữ liệu và hiển thị dưới dạng văn bản thô không có điều khiển. Nếu bạn đang cố gắng làm cho nó chỉ đọc để bài đăng tiếp theo sẽ không được sửa đổi thì bạn có vấn đề vì bất kỳ ai cũng có thể gây rối với bài đăng để tạo ra bất cứ điều gì họ muốn vì vậy thực tế cuối cùng bạn cũng nhận được dữ liệu. một lần nữa để đảm bảo nó là hợp lệ.


+1 Cảm ơn, nhưng tôi không thể sử dụng các giải pháp phía khách hàng, xem câu hỏi được cập nhật (xin lỗi, tôi rất tệ)
Mawg nói rằng phục hồi Monica

"Dựa trên bản cập nhật của bạn, tại sao bạn lại lo lắng về việc chỉ đọc nó? Bạn có thể thực hiện thông qua phía khách hàng" Xin lỗi, nhưng 1) Tôi không thể thực hiện phía khách hàng (không phải lựa chọn của tôi) và 2) nếu nó trông Đối với người dùng như anh ta đang thay đổi những thứ có thể gây nhầm lẫn cho anh ta.
Mawg nói rằng phục hồi Monica

@mawg tốt nếu nó hoàn toàn dành cho hình ảnh thì điều duy nhất tôi có thể khuyên là thay thế tất cả các điều khiển nội tuyến bằng văn bản tương đương hoặc thêm thuộc tính chỉ đọc vào các điều khiển. Không có viên đạn bạc và tôi có cảm giác đó là thứ bạn đang tìm kiếm. Bạn có thể đăng một đoạn mã mà bạn được phép sửa đổi không? Nó sẽ giúp để có được một cơ sở cho những gì bạn đang làm việc với.
Kelsey

+1 cảm ơn vì lời đề nghị. Tôi chưa bao giờ thực sự chú ý trước đây, nhưng tôi phải điền vào 100 hoặc 1.000 nếu các hình thức & mơ hồ nhớ một phiên bản chỉ đọc của chúng, không chỉ là văn bản. Có lẽ tôi nên điền thêm một chút và quan sát :-)
Mawg nói rằng phục hồi lại

3
Thật ngạc nhiên ... 6 năm sau, liên kết không hoạt động nữa.
mwallisch

3

Không có cách HTML chính thức, tuân thủ đầy đủ để làm điều đó, nhưng một ít javascript có thể đi một chặng đường dài. Một vấn đề khác bạn sẽ gặp phải là các trường bị vô hiệu hóa không hiển thị trong dữ liệu POST


4
Nếu bạn đã xác thực dữ liệu, bạn cần lưu dữ liệu phía máy chủ. Gửi nó qua lại cho khách hàng là một lỗ hổng bảo mật lớn. Ngay cả khi bạn sử dụng css, js hoặc html để đóng băng các trường bạn có thể chỉnh sửa bằng fireorms hoặc bằng cách thay đổi thủ công yêu cầu HTTP tiếp theo
Michael Clerx

+1 Cảm ơn, nhưng tôi không thể sử dụng các giải pháp phía khách hàng, xem câu hỏi được cập nhật (xin lỗi, tôi rất tệ)
Mawg nói rằng phục hồi Monica

3

Đây là một giải pháp lý tưởng để vô hiệu hóa tất cả các yếu tố đầu vào , textareas , selectnút trong một phần tử được chỉ định.

Đối với jQuery 1.6 trở lên :

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

Hoặc là

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

jQuery 1.5 trở xuống :

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

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

2

Một cách đơn giản khác được tất cả các trình duyệt hỗ trợ là:

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

Nhưng hãy lưu ý rằng việc lập bảng vẫn hoạt động với phương pháp này và các yếu tố tập trung vẫn có thể được người dùng thao tác.


1

Có tất cả id của biểu mẫu được đánh số và chạy một vòng lặp for trong JS.

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

+1 Cảm ơn, nhưng tôi không thể sử dụng các giải pháp phía khách hàng, xem câu hỏi được cập nhật (xin lỗi, tôi rất tệ)
Mawg nói rằng phục hồi Monica

1

Tôi muốn sử dụng jQuery:

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

find () sẽ đi sâu hơn nhiều cho đến khi đứa trẻ lồng nhau thứ n hơn trẻ em (), chỉ tìm những đứa trẻ ngay lập tức.


1
Cảm ơn, tôi sẽ nâng cao bạn vì đã cố gắng, vì bạn là người mới. NHƯNG, xin lưu ý rằng tôi rõ ràng yêu cầu một giải pháp chỉ dành cho phía máy chủ. Lúc đó tôi chỉ mã hóa PHP và chưa có JS. Một gợi ý thân thiện để đọc câu hỏi vì một số người thực sự có thể
hạ bệ

1

Cách dễ nhất

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

đó là sự thật, nhưng đây chỉ là ví dụ rìu, bạn có thể thay đổi bộ chọn thứ hai của mình thành bất kỳ ví dụ nào khác ví dụ $ ('# yourform .your class_for_inputs'). prop ('readonly', true);
Samir Rahimy

1

Bạn thêm lớp vô hình html trên biểu mẫu. Ví dụ

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

và phong cách:

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

Người dùng Ofcference có thể ẩn lớp này trong trình duyệt web.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.