Ответ 1
Оберните содержимое всей формы тегом <fieldset>
и установите атрибут disabled
.
<form>
<fieldset disabled>
<input/>
<input/>
<input/>
</fieldset>
</form>
У меня есть две страницы с формами HTML. Первая страница имеет форму отправки, а вторая страница имеет форму подтверждения. Первая форма предлагает выбор из множества элементов управления, а на второй странице снова отображаются данные из формы отправки с сообщением подтверждения. На этой второй форме все поля должны быть статическими.
Из того, что я вижу, некоторые элементы управления формой могут быть доступны только для readonly
и все они могут быть disabled
, с той разницей, что вы все еще можете переходить в поле только для чтения.
Вместо того, чтобы делать это поле за полем, есть ли способ пометить всю форму как readonly/disabled/static так, чтобы пользователь не мог изменить ни один из элементов управления?
Оберните содержимое всей формы тегом <fieldset>
и установите атрибут disabled
.
<form>
<fieldset disabled>
<input/>
<input/>
<input/>
</fieldset>
</form>
Оберните поля ввода и другие материалы в <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>
readonly
, например: Тогда разумным решением было бы установить для всех disabled
атрибутов всех элементов формы значение true
, поскольку в OP не указывалось, что конкретная "заблокированная" форма должна быть отправлена на сервер (что 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>
Вы можете использовать эту функцию для отключения формы:
function disableForm(formID){
$('#' + formID).children(':input').attr('disabled', 'disabled');
}
См. рабочую демонстрацию здесь
Обратите внимание, что он использует jQuery.
На странице подтверждения не помещайте содержимое в редактируемые элементы управления, просто напишите их на странице.
Я не знаю встроенного способа сделать это, поэтому вам нужно будет придумать индивидуальное решение в зависимости от сложности вашей формы. Вы должны прочитать этот пост:
Конвертировать HTML-формы только для чтения (Обновление: неработающая ссылка на публикацию, архивная ссылка)
РЕДАКТИРОВАТЬ: Основываясь на вашем обновлении, почему вы так беспокоитесь о том, чтобы оно только для чтения? Вы можете сделать это через клиентскую часть, но если это не так, вам придется добавить требуемый тег в каждый элемент управления или преобразовать данные и отобразить их в виде необработанного текста без элементов управления. Если вы пытаетесь сделать его доступным только для чтения, чтобы следующий пост не был изменен, у вас возникла проблема, потому что любой может связываться с постом, чтобы произвести все, что он хочет, поэтому, когда вы на самом деле наконец-то получите данные, вам лучше их проверить. еще раз, чтобы убедиться, что это действительно.
Нет полностью совместимого, официального HTML-способа сделать это, но немного javascript может пройти долгий путь. Другая проблема, с которой вы столкнетесь, - это то, что отключенные поля не отображаются в данных POST.
Имейте все пронумерованные формы и запустите цикл for в JS.
for(id = 0; id<NUM_ELEMENTS; id++)
document.getElementById(id).disabled = false;
Я бы предпочел использовать jQuery:
$('#'+formID).find(':input').attr('disabled', 'disabled');
find() будет намного глубже до n-го вложенного дочернего элемента, чем children(), который ищет только для детей.
Самый простой способ
$('#yourform *').prop('readonly', true);
Это идеальное решение для отключения всех входов, текстовых полей, селекторов и кнопок в указанном элементе.
Для 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');
Вы добавляете html невидимый слой поверх формы. Например
<div class="coverContainer">
<form></form>
</div>
и стиль:
.coverContainer{
width: 100%;
height: 100%;
z-index: 100;
background: rgba(0,0,0,0);
position: absolute;
}
Конечно, пользователь может скрыть этот слой в веб-браузере.