У меня есть флажок, который при определенных условиях должен быть отключен. Оказывается, HTTP не отправляет отключенные входы.
Как я могу обойти это? подавая вход, даже если он отключен и недействительный вход отключен?
У меня есть флажок, который при определенных условиях должен быть отключен. Оказывается, HTTP не отправляет отключенные входы.
Как я могу обойти это? подавая вход, даже если он отключен и недействительный вход отключен?
UPDATE: READONLY
не работает с флажками
Вы можете использовать disabled="disabled"
, но в этот момент значение флажка не будет отображаться в значениях POST
. Одна из стратегий заключается в добавлении значения флажка скрытого поля, хранящегося в той же форме, и чтения значения из этого поля
Просто измените disabled
на READONLY
Я решил эту проблему.
Так как тег readonly="readonly"
не работает (я пробовал разные браузеры), вы должны использовать disabled="disabled"
вместо. Но ваше значение флажка не будет опубликовано...
Вот мое решение:
Чтобы получить "readonly" и POST значение флажка в одно и то же время, просто добавьте скрытый "enter" с тем же именем и значением, что и ваш флажок. Вы должны держать его рядом с вашим флажком или между тегами <form></form>
:
<input type="checkbox" checked="checked" disabled="disabled" name="Tests" value="4">SOME TEXT</input>
<input type="hidden" id="Tests" name="Tests" value="4" />
Кроме того, просто чтобы я знал, что readonly="readonly", readonly="true", readonly="",
или просто READONLY
НЕ РЕШЕТ! Я потратил несколько часов, чтобы понять это!
Эта ссылка также НЕ актуальна (может быть, еще нет, или нет, я не знаю): http://www.w3schools.com/tags/att_input_readonly.asp
Если вы счастливы с помощью JQuery, тогда удалите атрибут disabled при отправке формы:
$("form").submit(function() {
$("input").removeAttr("disabled");
});
Вы можете обработать его таким образом... Для каждого флажка создайте скрытое поле с тем же атрибутом name
. Но установите значение этого скрытого поля с некоторым значением по умолчанию, с которым вы могли бы протестировать. Например..
<input type="checkbox" name="myCheckbox" value="agree" />
<input type="hidden" name="myCheckbox" value="false" />
Если флажок установлен на флажке при отправке формы, значение этого параметра формы будет
"agree,false"
Если флажок не установлен, значение будет
"false"
Вы можете использовать любое значение вместо "false", но вы получите эту идею.
<input type="checkbox" checked="checked" onclick="this.checked=true" />
Я начал с проблемы: "Как установить POST/Отправить флажок ввода, который отключен?" и в своем ответе я пропустил комментарий: "Если мы хотим отключить флажок, нам обязательно нужно сохранить префиксное значение (отмечено или не отмечено), а также мы хотим, чтобы пользователь знал об этом (в противном случае мы должны использовать скрытый тип и а не флажок)". В моем ответе я предположил, что мы хотим, чтобы всегда проверялся флажок, и этот код работает таким образом. Если мы нажмем на этот ckeckbox, он будет проверяться вечно, и его значение будет POSTED/Submitted! Точно так же, если я пишу onclick = "this.checked = false" без checked = "checked" (примечание: default unchecked) он будет навсегда снят, и его значение не будет POSTED/Submitted!.
Самый простой способ:
<input type="checkbox" class="special" onclick="event.preventDefault();" checked />
Это не позволит пользователю отменить выбор этого флажка, и он все равно отправит свое значение при отправке формы. Удалить флажок, если вы хотите, чтобы пользователь не мог установить этот флажок.
Кроме того, вы можете использовать javascript для очистки onclick, как только определенное условие будет выполнено (если это вам нужно). Здесь внизу-грязная скрипка, показывающая, что я имею в виду. Это не идеально, но вы получаете суть.
Это работает как прелесть:
Единственным недостатком является короткое мигание отключенных полей ввода при отправке. По крайней мере, в моем сценарии это не проблема!
$('form').bind('submit', function () {
var $inputs = $(this).find(':input'),
disabledInputs = [],
$curInput;
// remove attributes
for (var i = 0; i < $inputs.length; i++) {
$curInput = $($inputs[i]);
if ($curInput.attr('disabled') !== undefined) {
$curInput.removeAttr('disabled');
disabledInputs.push(true);
} else
disabledInputs.push(false);
}
// add attributes
setTimeout(function() {
for (var i = 0; i < $inputs.length; i++) {
if (disabledInputs[i] === true)
$($inputs[i]).attr('disabled', true);
}
}, 1);
});
Не отключайте его; вместо этого задайте его только для чтения, хотя это не влияет на то, что не позволяет пользователю изменять состояние. Но вы можете использовать jQuery для обеспечения этого (запретите пользователю изменять состояние флажка:
$('input[type="checkbox"][readonly="readonly"]').click(function(e){
e.preventDefault();
});
Это предполагает, что все флажки, которые вы не хотите изменять, имеют атрибут "readonly". например.
<input type="checkbox" readonly="readonly">
С
Я собираюсь предложить вам еще одну возможность:
Установите флажок как отключенный, как обычно. И до того, как форма будет отправлена пользователем, установите этот флажок с помощью JavaScript.
<script>
function beforeSumbit() {
var checkbox = document.getElementById('disabledCheckbox');
checkbox.disabled = false;
}
</script>
...
<form action="myAction.do" method="post" onSubmit="javascript: beforeSubmit();">
<checkbox name="checkboxName" value="checkboxValue" disabled="disabled" id="disabledCheckbox" />
<input type="submit />
</form>
Поскольку флажок включен до отправки формы, его значение публикуется обычным способом. Единственное, что не очень приятно в этом решении, заключается в том, что этот флажок становится включенным некоторое время, и это видно пользователям. Но это просто деталь, с которой я могу жить.
К сожалению, нет "простого" решения. Атрибут readonly не может быть применен к флажкам. Я прочитал спецификацию W3 о флажке и нашел виновника:
Если элемент управления не имеет текущего значения при отправке формы, пользовательские агенты не обязаны рассматривать его как успешный элемент управления. (http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2)
Это приводит к тому, что состояние unchecked и отключенное состояние приводят к тому же анализируемому значению.
Единственный полнофункциональный способ сделать это - добавить скрытый ввод с тем же именем с javascript при отправке формы.
Вы можете использовать небольшой фрагмент, который я сделал для этого:
function disabled_checkbox() {
var theform = document.forms[0];
var theinputs = theform.getElementsByTagName('input');
var nrofinputs = theinputs.length;
for(var inputnr=0;inputnr<nrofinputs;inputnr++) {
if(theinputs[inputnr].disabled==true) {
var thevalueis = theinputs[inputnr].checked==true?"on":"";
var thehiddeninput = document.createElement("input");
thehiddeninput.setAttribute("type","hidden");
thehiddeninput.setAttribute("name",theinputs[inputnr].name);
thehiddeninput.setAttribute("value",thevalueis);
theinputs[inputnr].parentNode.appendChild(thehiddeninput);
}
}
}
Это поиск первой формы в документе, сбор всех входов и поиск отключенных входов. Когда обнаружен отключенный ввод, скрытый ввод создается в parentNode с тем же именем и значением 'on' (если оно "проверено" ) и "(если оно указано" '- не отмечено).
Эта функция должна запускаться событием "onsubmit" в элементе FORM как:
<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>
Добавить onsubmit="this['*nameofyourcheckbox*'].disabled=false"
в форму.
<html>
<head>
<script type="text/javascript">
function some_name() {if (document.getElementById('first').checked) document.getElementById('second').checked=false; else document.getElementById('second').checked=true;}
</script>
</head>
<body onload="some_name();">
<form>
<input type="checkbox" id="first" value="first" onclick="some_name();"/>first<br/>
<input type="checkbox" id="second" value="second" onclick="some_name();" />second
</form>
</body>
</html>
Функция some_name является примером предыдущего предложения для управления вторым флажком, который проверяется (публикует его значение) или не отмечен (не публикует его значение) в соответствии с предложением, и пользователь не может изменять свой статус; нет необходимости управлять отключением второго флажка
Нет другого параметра, кроме поля hidden
, поэтому попробуйте использовать поле hidden
, как показано в приведенном ниже коде:
<input type="hidden" type="text" name="chk1[]" id="tasks" value="xyz" >
<input class="display_checkbox" type="checkbox" name="chk1[]" id="tasks" value="xyz" checked="check" disabled="disabled" >Tasks
Вы можете отключить его по желанию, а затем удалить отключенный атрибут перед отправкой формы.
$('#myForm').submit(function() {
$('checkbox').removeAttr('disabled');
});