Как сделать, что бы в переменную не записывались пустые значения?
Есть несколько блоков, которые перебираются циклом. В них содержатся инпуты и label, при нажатии на input, в консоль попадает input поле и label для него, в label нету атрибута value, а в input есть и в переменную я записываю значение атрибута value для input, но так как его нету в label, то в переменную попадает пустое значение.
И я решил сделать условие, что бы не попадало пустое значение, можно ли как то этот код улучшить? <div class="options"> <input type="hidden" value="18" class="questionId" name="questionId"> <input type="radio" name="r-1" id="radio-1" value="1" title=""/> <label for="radio-1" class="false-answer">Да</label> <input type="radio" name="r-1" id="radio-2" value="2" title=""/> <label for="radio-2" class="true-answer">Нет</label> </div> <div class="options"> <input type="hidden" value="17" class="questionId" name="questionId"> <input type="radio" name="r-2" id="radio-3" value="1" title=""/> <label for="radio-3" class="false-answer">Да</label> <input type="radio" name="r-2" id="radio-4" value="2" title=""/> <label for="radio-4" class="true-answer">Нет</label> <input type="radio" name="r-2" id="radio-5" value="3" title=""/> <label for="radio-5" class="false-answer">Движение разрешено только по обочине.</label> </div> <div class="options"> <input type="hidden" value="16" class="questionId" name="questionId"> <input type="radio" name="r-3" id="radio-6" value="1" title=""/> <label for="radio-6" class="false-answer">Да</label> <input type="radio" name="r-3" id="radio-7" value="2" title=""/> <label for="radio-7" class="true-answer">Нет</label> </div> var ans = document.querySelectorAll('.options'); ans.forEach(function (element, i) { ans[i].addEventListener('click', function (e) { var inputs = e.target.closest('.options'); var idQuestion = inputs.getElementsByClassName("questionId")[0].value; var answer = ''; if(e.target.hasAttribute('value')) { answer = e.target.value; } else { return; // что бы не попадало пустое значение } console.log(answer); }) }) |
И зачем такие сложности.
var ans = document.querySelectorAll('.options'); ans.forEach(function (element) { element.addEventListener('change', function (e) { console.log(e.target) //это та радио кнопка, которую выбрали и значение которой является значением группы }) }) |
DivMan,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> <div class="options"> <input type="hidden" value="18" class="questionId" name="questionId"> <input type="radio" name="r-1" id="radio-1" value="1" title=""/> <label for="radio-1" class="false-answer">Да</label> <input type="radio" name="r-1" id="radio-2" value="2" title=""/> <label for="radio-2" class="true-answer">Нет</label> </div> <div class="options"> <input type="hidden" value="17" class="questionId" name="questionId"> <input type="radio" name="r-2" id="radio-3" value="1" title=""/> <label for="radio-3" class="false-answer">Да</label> <input type="radio" name="r-2" id="radio-4" value="2" title=""/> <label for="radio-4" class="true-answer">Нет</label> <input type="radio" name="r-2" id="radio-5" value="3" title=""/> <label for="radio-5" class="false-answer">Движение разрешено только по обочине.</label> </div> <div class="options"> <input type="hidden" value="16" class="questionId" name="questionId"> <input type="radio" name="r-3" id="radio-6" value="1" title=""/> <label for="radio-6" class="false-answer">Да</label> <input type="radio" name="r-3" id="radio-7" value="2" title=""/> <label for="radio-7" class="true-answer">Нет</label> </div> <script> var ans = document.querySelectorAll('.options'); ans.forEach(function (element, i) { var idQuestion = element.querySelector(".questionId").value; element.addEventListener('change', function (e) { var answer = e.target.value; console.log(idQuestion, answer) }) }) </script> </body> </html> |
Цитата:
|
рони,
а зачем так element.querySelector(".questionId").value;, если достаточно e.target.value;? |
Спасибо
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
<div class="box-question"> <div class="box-title-question"> <p>Вопрос <strong><span>16</span>/<span>18</span></strong></p> <input type="checkbox" title="" id="check-info-3"/> <label for="check-info-3" class="icon-info"> <img src="img/icons/icon-17.png" alt="icon" title=""/> </label> <div class="box-info"> <span class="address">Красная пл., Москва, Росія </span> <span class="data">10.07.19</span> <span class="name">Дмитрий</span> <span class="view">266</span> </div> </div> <div class="question-img"> <img src="img/photo/img-3.jpg" alt="" title=""/> </div> <div class="question"> <div class="text-question"> <p>Должны ли вы уступить дорогу, попутным автомобилям, двигаясь слева от вас уступить дорогу, попутным автомобилям, двигаясь слева от вас??</p> <span class="true"></span> </div> <div class="options"> <input type="hidden" value="16" class="questionId" name="questionId"> <input type="radio" name="r-3" id="radio-6" value="1" title=""/> <label for="radio-6" class="false-answer">Да</label> <input type="radio" name="r-3" id="radio-7" value="2" title=""/> <label for="radio-7" class="true-answer">Нет</label> </div> <div class="additionally"> <a href="#">Показать ответ</a> <div> <button type="button">Добавить в закладки</button> <a href="#">1 комментарий</a> </div> </div> </div> </div> |
Если бы в вашем сценарии событие изменения в группе кнопок порождало запрос к серверу тогда еще можно было бы понять к чему это. Но этого не видно и если запрос, это не связанное событие с изменениями в группах, то почему не отослать форму, которой у вас почему-то нет?
Если весь этот сыр бор ради того чтобы связать каждую группу кнопок с ID, то лучше поступать не так, и связывать группы с ID нужно по ключу. То есть, именовать поля например так (лишнее убрано и для упрощения связь меток с полями через вложение): <div class="options"> <label class="false-answer"><input type="radio" name="question[18]" value="1"/> Да</label> <label class="false-answer"><input type="radio" name="question[18]" value="2"/> Нет</label> </div> <div class="options"> <label class="false-answer"><input type="radio" name="question[17]" value="1"/> Да</label> <label class="false-answer"><input type="radio" name="question[17]" value="2"/> Нет</label> <label class="false-answer"><input type="radio" name="question[17]" value="3"/> Движение разрешено только по обочине.</label> </div> <div class="options"> <label class="false-answer"><input type="radio" name="question[16]" value="1"/> Да</label> <label class="false-answer"><input type="radio" name="question[16]" value="2"/> Нет</label> </div> Никаких обработчиков выбора в группах конечно же при этом не нужно, а отправив форму сервер получит массив, в случае РНР это будет $_POST/$_GET, к примеру при таком выборе в группах: Array ( [question] => Array ( [18] => 1 [17] => 3 [16] => 2 ) ) То есть ключ question содержит ключи выбранных групп (ID) и выбранное значение в группе. |
var ans = document.querySelectorAll('.options'); var otvet = document.querySelectorAll(".otvet"); ans.forEach(function (element, i) { ans[i].addEventListener('click', function (e) { var inputs = e.target.closest('.options'); var idQuestion = inputs.getElementsByClassName("questionId")[0].value; var answer = ''; if(e.target.hasAttribute('value')) { answer = e.target.value; } else { return; // что бы не попадало пустое значение } //console.log(answer); $.ajax({ headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, type: 'get', url: '/check-answer/' + idQuestion, dataType: 'json', data: {answer: answer}, success: function (result) { if (result == 1) { if(otvet[i].classList.contains('false')) { otvet[i].classList.remove('false'); } otvet[i].classList.add('true'); } else if (result == 2) { if(otvet[i].classList.contains('true')) { otvet[i].classList.remove('true'); } otvet[i].classList.add('false'); } console.log(result); }, error: function () { otvet[i].innerHTML = 'Ошибка сайта'; } }); }) }) |
Понятно, по изменению.
А e.target.hasAttribute('value') для чего, огрехи html? |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 00:44. |