У меня есть множество флажков, которые установлены по умолчанию. Мои пользователи, вероятно, снимают флажки с нескольких (если они есть), а остальные оставляют отмеченными.
Есть ли способ сделать форму POST флажками, которые не отмечены , а не теми, которые отмечены ?
checkbox
элемента ужасен? Это двоичный элемент управления, они должны отправлять двоичные значения.Решение, которое мне понравилось больше всего, состоит в том, чтобы поместить скрытый ввод с тем же именем, что и флажок, который не может быть отмечен. Я думаю, что это работает так, что, если флажок не установлен, скрытый ввод все еще успешен и отправлен на сервер, но если флажок установлен, он будет переопределять скрытый ввод перед ним. Таким образом, вам не нужно отслеживать, какие значения в опубликованных данных ожидаются из флажков.
источник
Я решил это с помощью ванильного JavaScript:
Будьте осторожны, чтобы между этими двумя элементами ввода не было пробелов или разрывов строк!
Вы можете использовать,
this.previousSibling.previousSibling
чтобы получить «верхние» элементы.В PHP вы можете проверить указанное скрытое поле на 0 (не установлено) или 1 (установлено).
источник
<fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>
* Предположим, там были новые строки. Похоже, они не работают в кодовых блоках мини-разметкиpreviousElementSibling
вместоpreviousSibling
. Он поддерживается почти везде и игнорирует текстовые узлы.Мой личный фаворит - добавить скрытое поле с тем же именем, которое будет использоваться, если флажок снят. Но решение не так просто, как может показаться.
Если вы добавите этот код:
Браузер не особо заботится о том, что вы здесь делаете. Браузер отправит оба параметра на сервер, и сервер должен решить, что с ними делать.
Например, PHP принимает последнее значение в качестве используемого (см .: Официальная позиция дублированных ключей запроса HTTP GET )
Но другие системы, с которыми я работал (основанные на Java), делают это наоборот - они предлагают вам только первое значение. Вместо этого .NET даст вам массив с обоими элементами
Я попробую проверить это с помощью node.js, Python и Perl.
источник
request.getParameterValues
Общепринятая техника - переносить скрытую переменную вместе с каждым флажком.
На стороне сервера мы сначала обнаруживаем список скрытых переменных, и для каждой из скрытых переменных мы пытаемся увидеть, представлена ли соответствующая запись флажка в данных формы или нет.
Алгоритм на стороне сервера, вероятно, будет выглядеть так:
Вышесказанное не совсем отвечает на вопрос, но предоставляет альтернативные средства для достижения аналогичной функциональности.
источник
Вам не нужно создавать скрытое поле для всех флажков, просто скопируйте мой код. это изменит значение флажка, если не отмечен,
value
то назначит,0
и если флажок установлен, назначьтеvalue
в1
источник
Если вы не указали имя флажка, оно не будет пропущено. Только массив test_checkbox.
источник
Вы можете сделать Javascript в форме отправки события. Это все, что вы можете сделать, однако, нет способа заставить браузеры делать это самостоятельно. Это также означает, что ваша форма сломается для пользователей без Javascript. Лучше знать на сервере, какие флажки имеются, чтобы вы могли сделать вывод, что те, которые отсутствуют в опубликованных значениях формы (
$_POST
в PHP), не проверены.источник
$_REQUEST
Это хорошая практика, так как она допускает повторное использование кода, если ваш скрипт поддерживает оба метода.Я бы на самом деле сделал следующее.
У меня есть скрытое поле ввода с тем же именем с флажком ввода
и затем, когда я пишу, я сначала удаляю дублирующиеся значения, собранные в массиве $ _POST, и отображаем каждое из уникальных значений.
Я получил это из поста удалить повторяющиеся значения из массива
источник
checkbox_name[]
каждое значение будет введено в массив, который вы можете затем извлечь. Пример:$_POST['checkbox_name'][0]
и так далее с приращением количества полей с одинаковыми именами. Другой пример: если у вас было три названных поля,field_name[]
вы можете получить второе значениеfield_name
like$_POST['field_name'][1]
. Его назначение может быть удивительным, если у вас есть несколько полей с одинаковыми именами.«Я пошел с серверным подходом. Кажется, работает нормально - спасибо. - reach4thelasers 1 декабря 2009 в 15:19» Я хотел бы рекомендовать его от владельца. Как указано: решение javascript зависит от того, как обработчик сервера (я его не проверял)
Такие как
источник
Я знаю, что этому вопросу уже 3 года, но я нашел решение, которое, я думаю, работает довольно хорошо.
Вы можете проверить, назначена ли переменная $ _POST, и сохранить ее в переменной.
функция isset () проверяет, назначена ли переменная $ _POST. По логике, если он не назначен, флажок не установлен.
источник
Большинство ответов здесь требуют использования JavaScript или дублирующих элементов управления вводом. Иногда это должно быть полностью обработано на стороне сервера.
Я полагаю, что (предполагаемый) ключ к решению этой общей проблемы - контроль ввода формы.
Чтобы успешно интерпретировать и обрабатывать непроверенные значения для флажков, вам необходимо знать следующее:
Проверяя, была ли отправлена форма (значение назначено элементу ввода отправки), можно предположить любые непроверенные значения флажков .
Например:
При использовании PHP довольно просто определить, какие флажки были отмечены.
Исходные данные могут быть загружены при каждой загрузке страницы, но их следует изменять только в том случае, если форма была отправлена. Поскольку названия флажков известны заранее, их можно просматривать и проверять индивидуально, так что отсутствие их отдельных значений указывает на то, что они не проверены.
источник
Сначала я попробовал версию Сэма. Хорошая идея, но она приводит к тому, что в форме будет несколько элементов с одинаковым именем. Если вы используете любой javascript, который находит элементы на основе имени, он теперь вернет массив элементов.
Я разработал идею Шайлеша на PHP, она работает для меня. Вот мой код:
источник
Мне также нравится решение, которое заключается в том, что вы просто публикуете дополнительное поле ввода, и использование JavaScript кажется мне немного хакерским.
В зависимости от того, что вы используете для бэкэнда, будет зависеть, какой ввод идет первым.
Для серверного бэкэнда, где используется первое вхождение (JSP), вы должны сделать следующее.
Для серверного бэкэнда, где используется последнее вхождение (PHP, Rails), вы должны сделать следующее.
Для серверной части, где все вхождения хранятся в виде данных списка (
[]
,array
). (Python / Zope)Вы можете публиковать в любом порядке, вам нужно, просто попробуйте получить значение из ввода с
checkbox
атрибутом типа. Таким образом, первый индекс списка, если флажок был перед скрытым элементом, и последний индекс, если флажок был после скрытого элемента.Для серверного бэкэнда, где все вхождения объединяются запятой (ASP.NET / IIS) Вам необходимо (разделить / разложить) строку, используя запятую в качестве разделителя для создания типа данных списка. (
[]
)Теперь вы можете попытаться получить первый индекс в списке, если флажок был перед скрытым элементом, и захватить последний индекс, если флажок был после скрытого элемента.
источник изображения
источник
Я использую этот блок jQuery, который добавляет скрытый ввод во время отправки к каждому непроверенному флажку. Это гарантирует, что вы всегда будете получать значение для каждого флажка, каждый раз, не загромождая разметку и не рискуя забыть сделать это для флажка, который вы добавите позже. Он также не зависит от того, какой бэкэнд-стек (PHP, Ruby и т. Д.) Вы используете.
источник
Вы также можете перехватить событие form.submit и отменить проверку перед отправкой
источник
Я вижу, что этот вопрос старый и на него так много ответов, но я все равно отдам свою копейку. Мой голос за решение javascript для события 'submit' формы, как отмечали некоторые. Не нужно дублировать входные данные (особенно если у вас длинные имена и атрибуты с php-кодом, смешанным с html), не надоедать на стороне сервера (для этого нужно знать все имена полей и проверять их по одному), просто выбирайте все непроверенные элементы присвойте им значение 0 (или что вам нужно, чтобы указать статус «не проверено»), а затем измените их атрибут «отмечено» на true
таким образом у вас будет массив $ _POST, подобный этому:
источник
источник
То, что я сделал, было немного по-другому. Сначала я изменил значения всех непроверенных флажков. На «0», затем выберите их все, так что значение будет отправлено.
источник
Я бы предпочел сопоставить $ _POST
он имеет в виду, что если POST не имеет значения 'checkboxname', он не проверяется, поэтому присваивает значение.
Вы можете создать массив ваших значений в ckeckbox и создать функцию, которая проверяет, существуют ли значения, если нет, это не помнит, и вы можете присвоить значение
источник
Пример действий Ajax (': флажок') использует jQuery вместо .val ();
параметры получат значение ИСТИНА ИЛИ ЛОЖЬ.
источник
Флажки обычно представляют двоичные данные, которые хранятся в базе данных в виде значений Да / Нет, Y / N или 1/0. HTML-флажки имеют плохую природу для отправки значения на сервер, только если флажок установлен! Это означает, что серверный скрипт на другом сайте должен заранее знать, какие есть все возможные флажки на веб-странице, чтобы иметь возможность хранить положительные (отмеченные) или отрицательные (непроверенные) значения. На самом деле проблема заключается только в отрицательных значениях (когда пользователь снимает флажок с предварительно (предварительно) проверенного значения - как сервер может узнать это, когда ничего не отправлено, если он не знает заранее, что это имя должно быть отправлено). Если у вас есть серверный скрипт, который динамически создает скрипт UPDATE, то есть проблема, потому что вы не знаете, какие все флажки должны быть получены, чтобы установить значение Y для отмеченных и значение N для непроверенных (не полученных).
Поскольку я храню значения «Y» и «N» в своей базе данных и представляю их с помощью отмеченных и не отмеченных флажков на странице, я добавил скрытое поле для каждого значения (флажок) со значениями «Y» и «N», а затем использую флажки только для визуального отображения. представление и использовать простую функцию JavaScript check (), чтобы установить значение if в соответствии с выбором.
используйте один JavaScript-обработчик onclick и вызовите функцию check () для каждого флажка на моей веб-странице:
Таким образом, значения 'Y' или 'N' всегда отправляются в серверный скрипт, он знает, какие поля должны быть обновлены, и нет необходимости преобразовывать значение checbox "on" в "Y" или не получен флажок в "N" ».
ПРИМЕЧАНИЕ: пробел или новая строка также является родным братом, поэтому здесь мне нужно .previousSibling.previousSibling.value. Если между ними нет пробела, то только .previousSibling.value
Вам не нужно явно добавлять прослушиватель onclick, как раньше, вы можете использовать библиотеку jQuery для динамического добавления прослушивателя щелчков с функцией изменения значения для всех флажков на вашей странице:
источник
Все ответы хороши, но если у вас есть несколько флажков в форме с одинаковым именем, и вы хотите опубликовать статус каждого флажка. Затем я решил эту проблему, поместив скрытое поле с флажком (имя, связанное с тем, что я хочу).
затем управляйте изменением статуса чекбокса с помощью кода ниже:
Теперь при изменении любого флажка будет меняться значение соответствующего скрытого поля. А на сервере вы можете посмотреть только скрытые поля вместо флажков.
Надеюсь, что это поможет кому-то иметь такие проблемы. ура :)
источник
Проблема с флажками заключается в том, что если они не отмечены, они не публикуются в вашей форме. Если вы отметите флажок и опубликуете форму, вы получите значение флажка в переменной $ _POST, которую вы можете использовать для обработки формы, если она не отмечена, никакое значение не будет добавлено в переменную $ _POST.
В PHP вы обычно обходили бы эту проблему, выполняя проверку isset () над своим элементом checkbox. Если ожидаемый элемент не задан в переменной $ _POST, тогда мы знаем, что флажок не установлен и значение может быть ложным.
Но если вы создали динамическую форму, то вы не всегда будете знать атрибут name ваших флажков, если вы не знаете имя флажка, то вы не сможете использовать функцию isset, чтобы проверить, было ли это отправлено с переменная $ _POST.
источник
источник
Есть лучший обходной путь. Прежде всего предоставьте атрибут name только тем флажкам, которые отмечены. Затем по щелчку
submit
, через JavaScriptfunction
вы ставите все флажки, не отмеченные. Поэтому, когда выsubmit
только те, которые будут восстановлены вform collection
тех, кто имеетname
собственность.Преимущество: нет необходимости создавать дополнительные скрытые ящики и манипулировать ими.
источник
@cpburnz понял это правильно, но для большого количества кода вот та же идея, использующая меньше кода:
JS:
HTML (обратите внимание на имя поля, используя имя массива):
И для PHP:
источник
jQuery версия ответа @ Вишну.
Если вы используете jQuery 1.5 или ниже, используйте функцию .attr () вместо .prop ()
источник
Это решение вдохновлено @ desw's.
Если ваши входные имена имеют «стиль формы», вы потеряете ассоциацию индекса массива со значениями вашего chekbox, как только будет проверен один chekbox, увеличивая эту «диссоциацию» на одну единицу каждый раз, когда проверяется chekbox. Это может быть случай формы для вставки чего-то вроде сотрудников, составленных из некоторых полей, например:
Если вы добавите сразу трех сотрудников, а первый и второй будут одиночными, вы получите 5 элементов
isSingle
массив , поэтому вы не сможете выполнить итерацию сразу по всем трем массивам, например, для , вставьте сотрудников в базу данных.Вы можете преодолеть это с помощью некоторой простой постобработки массива. Я использую PHP на стороне сервера, и я сделал это:
источник
Таким образом, это решение является излишним для этого вопроса, но оно мне помогло, когда у меня был один и тот же флажок, который встречался много раз для разных строк в таблице. Мне нужно было знать строку, которую представлял флажок, а также знать состояние флажка (отмечено / не отмечено).
Что я сделал, так это убрал атрибут name из моих входов-флажков, присвоил им одинаковый класс и создал скрытый вход, который содержал бы JSON-эквивалент данных.
HTML
Javascript для запуска при отправке формы
Строка json будет передана с формой как $ _POST ["has-permissions-values"]. В PHP декодируйте строку в массив, и у вас будет ассоциативный массив, в котором есть каждая строка и значение true / false для каждого соответствующего флажка. Тогда очень легко пройтись и сравнить с текущими значениями базы данных.
источник