Вы должны быть очень осторожны с названиями радио и усилителями. ценности. Я обновил ваши имена и значения опционально вместе с функциональностью для получения выбранных значений , см. Демонстрацию ниже - [116 ]
function handleClick(event) {
event.preventDefault();
// Get all the inputs.
var inputs = form1.elements;
var radios = [];
//Loop and find only the Radios
for (var i = 0; i < inputs.length; ++i) {
if (inputs[i].type == 'radio') {
radios.push(inputs[i]);
}
}
//var found = 1;
for (var i = 0; i < radios.length; i++) {
if (radios[i].checked) {
console.log(radios[i].value);
//found = 0;
//break;
}
}
return false; // prevent further bubbling of event
}
<form name="form1" onsubmit='handleClick(event)'>
<div class="dt">
<div class="dtb">
<div class="dtr">
<div class="one">1</div>
<div class="two">a</div>
<div class="three"><input name="a" type="radio" value="1m" required /></div>
<div class="four"><input name="a" type="radio" value="1s" required /></div>
<div class="five">Aardig, vriendelijk</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">b</div>
<div class="three"><input name="b" type="radio" value="1m" required /></div>
<div class="four"><input name="b" type="radio" value="1s" required /></div>
<div class="five">Overtuigend, overredend</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">c</div>
<div class="three"><input name="c" type="radio" value="1m" required /></div>
<div class="four"><input name="c" type="radio" value="1s" required /></div>
<div class="five">Terughoudend, bescheiden, gereserveerd</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">d</div>
<div class="three"><input name="d" type="radio" value="1m" required /></div>
<div class="four"><input name="d" type="radio" value="1s" required /></div>
<div class="five">Origineel, inventief, individualistisch</div>
</div>
</div>
</div>
<div class="dt">
<div class="dtb">
<div class="dtr">
<div class="one">2</div>
<div class="two">a</div>
<div class="three"><input name="a2" type="radio" value="2m" required /></div>
<div class="four"><input name="a2" type="radio" value="2s" required /></div>
<div class="five">Charmant, attractief, trekt anderen aan</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">b</div>
<div class="three"><input name="b2" type="radio" value="2m" required /></div>
<div class="four"><input name="b2" type="radio" value="2s" required /></div>
<div class="five">Coöperatief, aangenaam</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">c</div>
<div class="three"><input name="c2" type="radio" value="2m" required /></div>
<div class="four"><input name="c2" type="radio" value="2s" required /></div>
<div class="five">Koppig, onbuigzaam</div>
</div>
<div class="dtr">
<div class="one"> </div>
<div class="two">d</div>
<div class="three"><input name="d2" type="radio" value="2m" required /></div>
<div class="four"><input name="d2" type="radio" value="2s" required /></div>
<div class="five">Lief, innemend</div>
</div>
</div>
</div>
<input type="submit" value="Submit" />
<input type="reset" value="reset" />
</form>
Основы:
Какой источник настроек должен перекрывать друг друга, зависит от приложения, но, на мой взгляд, обычно аргумент командной строки> переменная среды> файл конфигурации имеет больше смысла.
Вот пример получения конфигурации из среды и командной строки с перезаписывающей средой командной строки:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char* const* argv) {
int i;
const char* myConfigVar;
// get default setting from environment
myConfigVar = getenv("MY_CONFIG_VAR");
// if the variable wasn't defined, initialize to hardcoded default
if (!myConfigVar)
myConfigVar = "default value";
// parse commandline arguments
// start at 1, because argv[0] contains the name of the program
for (i = 1; i < argc; ++i) {
if (strcmp("--my-config-var", argv[i]) == 0) {
if (i + 1 < argc)
myConfigVar = argv[i + 1];
else
printf("missing value for my-config-var argument\n");
}
}
printf("myConfigVar = '%s'\n", myConfigVar);
return 0;
}
Вы уже видите, что она очень скоро становится утомительной и утомительной, поэтому лучше использовать существующую библиотеку, если она существует для вашей целевой целевой платформы ( s) или, по крайней мере, разделить этот вид кода на ряд функций.
Другой интересный вариант - привязать язык сценариев к вашему приложению, тогда вы можете заставить свое приложение только читать и «выполнять» файл настроек, и пользователь может сконфигурировать файл настроек для считывания некоторых настроек из среды, а некоторых из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.
с перезаписывающей средой командной строки:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char* const* argv) {
int i;
const char* myConfigVar;
// get default setting from environment
myConfigVar = getenv("MY_CONFIG_VAR");
// if the variable wasn't defined, initialize to hardcoded default
if (!myConfigVar)
myConfigVar = "default value";
// parse commandline arguments
// start at 1, because argv[0] contains the name of the program
for (i = 1; i < argc; ++i) {
if (strcmp("--my-config-var", argv[i]) == 0) {
if (i + 1 < argc)
myConfigVar = argv[i + 1];
else
printf("missing value for my-config-var argument\n");
}
}
printf("myConfigVar = '%s'\n", myConfigVar);
return 0;
}
Вы уже видите, что она становится очень длинной и утомительной очень скоро, поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функции.
Другой интересный вариант - привязать язык сценариев к вашему приложению, тогда вы можете заставить свое приложение только читать и «выполнять» файл настроек, а пользователь может настроить файл настроек для чтения некоторых настроек из среды и некоторые из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.
с перезаписывающей средой командной строки:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char* const* argv) {
int i;
const char* myConfigVar;
// get default setting from environment
myConfigVar = getenv("MY_CONFIG_VAR");
// if the variable wasn't defined, initialize to hardcoded default
if (!myConfigVar)
myConfigVar = "default value";
// parse commandline arguments
// start at 1, because argv[0] contains the name of the program
for (i = 1; i < argc; ++i) {
if (strcmp("--my-config-var", argv[i]) == 0) {
if (i + 1 < argc)
myConfigVar = argv[i + 1];
else
printf("missing value for my-config-var argument\n");
}
}
printf("myConfigVar = '%s'\n", myConfigVar);
return 0;
}
Вы уже видите, что она становится очень длинной и утомительной очень скоро, поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функции.
Другой интересный вариант - привязать язык сценариев к вашему приложению, тогда вы можете заставить свое приложение только читать и «выполнять» файл настроек, а пользователь может настроить файл настроек для чтения некоторых настроек из среды и некоторые из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.
поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функций.Другой интересный вариант - привязать язык сценариев к вашему приложению, а затем может заставить ваше приложение только читать и «исполнять» файл настроек, а пользователь может настроить файл настроек так, чтобы он считывал некоторые параметры из окружения, а некоторые из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.
поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функций.Другой интересный вариант - привязать язык сценариев к вашему приложению, а затем может заставить ваше приложение только читать и «исполнять» файл настроек, а пользователь может настроить файл настроек так, чтобы он считывал некоторые параметры из окружения, а некоторые из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.
и пользователь может сконфигурировать файл настроек для чтения некоторых настроек из среды, а некоторых из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать. и пользователь может сконфигурировать файл настроек для чтения некоторых настроек из среды, а некоторых из командной строки, например. Это действительно зависит от типа и размера приложения и вашей целевой аудитории, стоит ли это делать.Эрик Рэймонд освещает многое из этого в разделе 10 из Искусство программирования Unix Очевидно, что это ориентировано на Unix, но большинство принципов может быть применено в любой ОС.
Существуют тонны библиотек для разбора файла конфигурации для различных форматов. Ищите форматы XML и INI для двух популярных вариантов. Написание нестандартного парсера, вероятно, плохая идея, так как может потребоваться много работы за небольшую выгоду или без нее. Здесь - это случайная библиотека C для анализа файлов INI, XML оставлен в качестве упражнения.
Приоритет между настройками обычно таков, что параметры командной строки переопределяют любое «окружение» Настройки. Я бы предложил такие приоритеты в порядке убывания важности:
Но 2 и 3 вполне могут быть перевернуты.
Для Unix-подобных шаблонов проектирования в этой области см. Раймонд "Искусство из Unix Programming ". В нем обсуждается расстановка приоритетов аргументов командной строки над переменными среды и файлами конфигурации и т. Д.
Вопрос не совсем ясен. Является ли вопрос «какие механизмы существуют?», «Каковы соглашения для аргументов и форматов?» Или «как я должен смешивать и сопоставлять?»?
Есть несколько довольно стандартных способов (по крайней мере, в мире Unix ):
Чтобы выбрать, какие методы использовать для своей собственной программы, изучите Многие программы из канона общепринятой практики, прежде чем вы замораживаете свой собственный выбор, читаете некоторые блоги, читаете некоторые книги ...
Файлы конфигурации, вероятно, являются наиболее переносимыми среди операционных систем.
Обработка может быть довольно сложной. Если аргументы командной строки могут повлиять на интерпретацию конфигурационных файлов или переменных среды, но вы все же хотите, чтобы командная строка отменяла другие механизмы (хорошая идея), вам может потребоваться три прохода:
В традиции Unix посмотрите на getopt
и getopt_long
. Также рассмотрим такие инструменты, как gengetopt
Вы можете упростить проблему с файлом конфигурации, сделав их сценариями оболочки, которые устанавливают переменные среды (но это блокирует вас в модели Unix). Разбор простого текста прост и кроссплатформенен, но позволяет писать больше кода. Использование стандартного формата и библиотеки предъявляет требования к среде сборки вашего пользователя, но должно экономить на ошибках и путанице.
Если ваша среда конфигурации сложна, очень полезно инкапсулировать состояние конфигурации в структуру, которую можно передавать по мере необходимости. Это подход, принятый gengetopt
, и я нашел его полезным.
Если ваша среда конфигурации сложна, очень полезно инкапсулировать состояние конфигурации в структуру, которую можно передавать по мере необходимости. Это подход, принятый gengetopt
, и я нашел его полезным.
Если ваша среда конфигурации сложна, очень полезно инкапсулировать состояние конфигурации в структуру, которую можно передавать по мере необходимости. Это подход, принятый gengetopt
, и я нашел его полезным.
Язык Lua отчасти возник из-за необходимости иметь четко определенный язык конфигурации для набора инструментов. Остается довольно легко интегрировать Lua в качестве языка конфигурации. Достаточно полный пример можно найти в книге «Программирование на Lua», более старая версия которой доступна в Интернете. Глава 25 описывает использование Lua C API для встраивания Lua в качестве языка конфигурации и причины, по которым вы могли бы захотеть это сделать.