POST непроверенные флажки HTML - PullRequest
272 голосов
/ 27 ноября 2009

У меня есть множество флажков, которые отмечены по умолчанию. Мои пользователи, вероятно, снимают флажки с нескольких (если они есть), а остальные оставляют отмеченными.

Есть ли способ сделать форму POST флажками, которые не отмечены, вместо тех, которые проверены ?

Ответы [ 40 ]

425 голосов
/ 02 января 2010

Решение, которое мне понравилось больше всего, состоит в том, чтобы поместить скрытый ввод с тем же именем, что и флажок, который может не проверяться. Я думаю, что это работает так, что если флажок не установлен, скрытый ввод все еще успешен и отправлен на сервер, но если флажок установлен, он будет переопределять скрытый ввод перед ним. Таким образом, вам не нужно отслеживать, какие значения в опубликованных данных ожидаются из флажков.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>
189 голосов
/ 05 июля 2013

Добавить скрытый ввод для флажка с другим идентификатором:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

Перед отправкой формы отключите скрытый ввод на основе отмеченного условия:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}
60 голосов
/ 10 сентября 2014

Я решил это с помощью ванильного JavaScript:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

Будьте осторожны, чтобы между этими двумя элементами ввода не было пробелов или разрывов строк!

Вы можете использовать this.previousSibling.previousSibling, чтобы получить "верхние" элементы.

В PHP вы можете проверить указанное скрытое поле на 0 (не установлено) или 1 (установлено).

21 голосов
/ 23 января 2012

Мой личный фаворит - добавить скрытое поле с тем же именем, которое будет использоваться, если флажок снят. Но решение не так просто, как может показаться.

Если вы добавите этот код:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

Браузер не особо заботится о том, что вы здесь делаете. Браузер отправит оба параметра на сервер, и сервер должен решить, что с ними делать.

Например, PHP принимает последнее значение в качестве используемого (см .: Официальная позиция дублированных ключей запроса HTTP GET )

Но другие системы, с которыми я работал (основанные на Java), делают это наоборот - они предлагают вам только первое значение. Вместо этого .NET даст вам массив с обоими элементами вместо

Я попробую проверить это когда-нибудь с помощью node.js, Python и Perl.

20 голосов
/ 27 ноября 2009

Обычная техника для этого - носить скрытую переменную вместе с каждым флажком.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

На стороне сервера мы сначала обнаруживаем список скрытых переменных, и для каждой из скрытых переменных мы пытаемся увидеть, представлена ​​ли соответствующая запись флажка в данных формы или нет.

Алгоритм на стороне сервера, вероятно, будет выглядеть так:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

Вышесказанное не совсем отвечает на вопрос, но предоставляет альтернативные средства для достижения аналогичной функциональности.

18 голосов
/ 13 декабря 2013

вам не нужно создавать скрытое поле для всех флажков, просто скопируйте мой код. он изменит значение флажка, если не установлен, value назначит 0, а если флажок установлен, присвойте value в 1

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})
11 голосов
/ 14 января 2013
$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

Если вы не укажете имя флажка, оно не будет пропущено. Только массив test_checkbox.

11 голосов
/ 27 ноября 2009

Вы можете добавить Javascript в событие отправки формы. Это все, что вы можете сделать, однако, нет способа заставить браузеры делать это самостоятельно. Это также означает, что ваша форма сломается для пользователей без Javascript. Лучше знать на сервере, какие флажки имеются, чтобы вы могли сделать вывод, что те, которые отсутствуют в опубликованных значениях формы ($_POST в PHP), не проверены.

10 голосов
/ 22 апреля 2013

Я бы на самом деле сделал следующее.

У моего скрытого поля ввода с тем же именем и флажком ввода

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

, а затем, когда я пишу, я в первую очередь удаляю дублирующиеся значения, собранные в массиве $ _POST, и отображаем каждое из уникальных значений.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

Я получил это из сообщения удалить дублирующиеся значения из массива

8 голосов
/ 27 февраля 2013

«Я пошел с серверным подходом. Кажется, работает нормально - спасибо. - reach4thelasers 1 декабря '09 в 15:19« Я хотел бы рекомендовать его от владельца. Как указано: решение javascript зависит от того, как обработчик сервера (я его не проверял)

например

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...