У меня есть форма, которая может быть динамически дублирована (с помощью JS), чтобы пользователь мог ввести столько данных, сколько захочет. Это отлично работает для ввода текста, потому что я просто оставляю атрибут name
одинаковым (заканчивается []
), а затем, когда значения отправляются, он просто возвращает мне массив. Теперь я просто понял, что это не так хорошо работает для переключателей, потому что имена на самом деле должны быть уникальными для каждого набора. Но с точки зрения данных каждый набор возвращает только одно значение, поэтому получение данных из данных POST не будет проблемой, оно просто закручивает функциональность моей формы. Нет, не так ли? Я просто ввернута, и я не могу использовать массивы?Радио кнопки + элементы массива
ответ
Я только решил эту же проблему.
Если у вас есть более чем одна группа переключателей, вы можете использовать их в массивы:
<input type="radio" name="radiobutton[0]" value="a"><br>
<input type="radio" name="radiobutton[0]" value="b"><br>
<input type="radio" name="radiobutton[0]" value="c"><br>
<br>
<input type="radio" name="radiobutton[1]" value="x"><br>
<input type="radio" name="radiobutton[1]" value="y"><br>
<input type="radio" name="radiobutton[1]" value="z">
, например.
Когда вы отправляете эту форму, и если вы выбираете «а» и «х», вы будете иметь массив «радиокнопку», который выглядит как
radiobutton[0] = "a";
radiobutton[1] = "x";
Это работает, потому что каждая группа имеет уникальное имя, но по-прежнему использует синтаксис массива.
Да. С точки зрения HTTP, как переключатели, так и флажки устанавливаются практически одинаково (кроме того, что выбор радиокнопки отменяет выбор всех остальных в группе).
Возможно, у вас есть обработчик отправки, который берет входы от наборов радиокнопки и преобразует их в кучу стандартных входов, которые превращаются в массив, но это довольно взломанно. Просто добавьте еще один код на сервере, чтобы создать собственный массив, если это то, что вам нужно.
* вздох * Да ... думаю, мне придется это сделать. Я потратил несколько часов на то, чтобы все остальное работало по-другому, а затем попыталось добавить одну маленькую кнопку «да/нет» в мою форму, и все это катастрофически взрывается. – mpen
Если это просто да-нет: почему это переключатель? Просто установите флажок – Yuliy
@Yulify: Я думал об этом, но он все еще не решает проблему. Браузеры не отправляют значение вообще, если оно не проверено. Поэтому нет способа сопоставления, из которых соответствуют отмеченные поля. – mpen
Существует один нюанс с использованием массивов в CSS3 и HTML5
<input type="radio" name="radiobutton[0]" value="a"><br>
<input type="radio" name="radiobutton[0]" value="b"><br>
<input type="radio" name="radiobutton[0]" value="c"><br>
<br>
<input type="radio" name="radiobutton[1]" value="x"><br>
<input type="radio" name="radiobutton[1]" value="y"><br>
<input type="radio" name="radiobutton[1]" value="z">
Но использовать маркирующие и = «» правильно, чтобы получить интерактивные этикетки и для классов псевдопользователь работать ключи массива должны быть уникальный и ассоциативный, а не численный. Так что это
<label for="a">text</label>
<input type="radio" name="radiobutton[a]" id="a" value="a"><br>
<label for="b">text</label>
<input type="radio" name="radiobutton[b]" id="b" value="b"><br>
<label for="c">text</label>
<input type="radio" name="radiobutton[c]" id="c" value="c"><br>
<br>
<input type="radio" name="radiobutton[x]" id="x" value="x"><br>
<input type="radio" name="radiobutton[y]" id="y" value="y"><br>
<input type="radio" name="radiobutton[z]" id="z" value="z">
В противном случае упаковка элемент с этикеткой все еще работает, но выше становится чище и легче сделать. Пример CSS с использованием меток для маркировки элементов без упаковки.
/* SQUARED Four */
.squaredFour {
height: 30px;
margin: 10px auto;
position: relative;
}
.squaredFour input
{
top: -28px;
left: 0px;
position: relative;
border: 1px solid #999;
}
.squaredFour .element-description
{
display: block;
margin: 0;
position: absolute;
}
.squaredFour label {
cursor: pointer;
position: absolute;
width: 33px;
height: 30px;
top: -40px;
background-color: rgb(200, 242, 163);/*background-color: #c8f2a3;*/
display: block;
color:#111;
}
.squaredFour label span.a{
position: absolute;
height: 4px;
top: 18px;
left: 7px;
background-color: #111;
display: block;
color:#111;
-moz-transform: rotate(40deg);
-ms-transform: rotate(40deg);
-o-transform: rotate(40deg);
transform: rotate(40deg);
width: 10px;
}
.squaredFour label span.b{
position: absolute;
width: 18px;
height: 4px;
top: 14px;
left: 10px;
background-color: #111;
display: block;
color:#111;
-webkit-transform: rotate(128deg);
-moz-transform: rotate(128deg);
-ms-transform: rotate(128deg);
-o-transform: rotate(128deg);
transform: rotate(128deg);
}
.squaredFour label span.c{
position: absolute;
right: 12px;
top:3px;
display: block;
color:#111;
text-wrap: none;
}
.squaredFour input:checked ~ label {
display:block;
background-color: #f16870;
}
.squaredFour input:checked ~ label span.a{
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
width: 21px;
top: 13px;
left: 6px;
}
.squaredFour input:checked ~ label span.b{
-moz-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
top: 13px;
left: 6px;
width: 21px;
}
Это не имеет смысла. HTML не заботится о квадратных скобках, только PHP интерпретирует их как «массивы». http://jsfiddle.net/mnpenner/vcysubch/ Прекрасно работает с числовыми, повторяющимися именами. Ярлыки «для» атрибут соответствует идентификатору ввода, а не имени. – mpen
Это специфично для использования псевдо классов и захвата события щелчка с помощью CSS3 –
Можете ли вы обновить свой пример, чтобы включить соответствующий CSS? – mpen
имя = "выбор [1] []" имя = "выбор [2] []"
Кажется работать, так что если вы добавляете динамически, и это вещи, связанные с идентификатором (или вы можете просто увеличивать что-то каждый раз, может быть), то вы можете сделать:
var el = '<input type="radio" name="choice[' + myID + '][] />';
Просто попробовал это на некоторых динамически генерируемых радиокнопок и PHP $ _POST содержит это для «обязательных» радиокнопок для ThingIDs 6, 10 , 8:
[mandatory] => Array
(
[6] => Array
(
[0] => 1
)
[10] => Array
(
[0] => 1
)
[8] => Array
(
[0] => 0
)
)
Arghh ... это так просто>. <Ну .. это все еще боль, потому что вам нужно изменить индекс массива в имени через JS, но ... ну ладно. – mpen
, почему он не работает, когда вы просто положили [] вместо [0], [1]. Просто положить [] отлично работает с текстовыми вводами, но не работает с переключателями. arrgggg – Ataman
@Ataman: потому что если у вас просто есть 'name =" radiobutton [] "', тогда браузер не может различать две разные группы, и вместо этого они считают, что все они являются частью одной группы, буквально названной "radiobutton []" , Вам нужны индексы массивов, чтобы однозначно идентифицировать разные группы переключателей –