#javascript #jquery
#javascript #jquery
Вопрос:
Желаемое поведение:
1.Выберите «сладости» для поля1
- это будет предварительно проверять значения, которые имеют то же значение, что и предварительно выбранное поле1
- если флажок установлен, он должен вызвать поле ввода для распечатки строк, которые были отмечены, например. если значение «a» установлено, то во входных данных должно отображаться «a»
- если в поле 1 установлено значение «сладости», то поле 3 будет заполнено значением
У меня все работает, кроме пункта 3. если я сам не проверю элементы, они будут отображаться во входных данных. Я не могу жестко закодировать какое-либо из значений, потому что значения будут вводиться динамически.
Ниже у меня есть рабочий пример:
document.getElementById('field1').onchange = function() {
var boxes = document.querySelectorAll('input[type="checkbox"]');
for (var i = 0; i < boxes.length; i ) {
boxes[i].checked = boxes[i].value == this.value;
$checks = $(":checkbox");
$checks.on('change', function() {
var string = $checks.filter(":checked").map(function(i, v) {
return this.value;
}).get().join(" ,");
$('#field_results').val(string);
});
document.getElementById("field3").value = this.value;
}
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name='field1' id="field1">
<option value="1">Fruits</option>
<option value="2">Vegetables</option>
<option value="3">Sweets</option>
<option value="4">Meat</option>
</select>
<div id='changer'>
<input type='checkbox' id='a' value="3" /><label>A</label><br />
<input type='checkbox' id='b' value="3" /><label>B</label><br />
<input type='checkbox' id='c' value="3" /><label>C</label><br />
<input type='checkbox' id='d' value="3" /><label>D</label>
</div>
<input type="text" id="field_results" /><br>
<select name='field3' id="field3">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
Ответ №1:
Вам нужно перейти к событию out of change $checks.on('change', function() {})
при этой функции проверенное значение все еще не работает и измените на this.id
вместо this.value
, если вы хотите отобразить a, b, c, d.
document.getElementById('field1').onchange = function() {
var boxes = document.querySelectorAll('input[type="checkbox"]');
for (var i = 0; i < boxes.length; i ) {
boxes[i].checked = boxes[i].value == this.value;
$checks = $(":checkbox");
$checks.on('change', function() {
});
var string = $checks.filter(":checked").map(function(i, v) {
return $(this).next("label").html();
//return this.id;
}).get().join(" ,");
$('#field_results').val(string);
document.getElementById("field3").value = this.value;
}
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name='field1' id="field1">
<option value="1">Fruits</option>
<option value="2">Vegetables</option>
<option value="3">Sweets</option>
<option value="4">Meat</option>
</select>
<div id='changer'>
<input type='checkbox' id='a' value="3" /><label>A</label><br />
<input type='checkbox' id='b' value="3" /><label>B</label><br />
<input type='checkbox' id='c' value="3" /><label>C</label><br />
<input type='checkbox' id='d' value="3" /><label>D</label>
</div>
<input type="text" id="field_results" /><br>
<select name='field3' id="field3">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
Комментарии:
1. Привет, это работает действительно здорово. что, если я захочу использовать текст?
2. вы можете использовать $(this).next(«label»).html(), я обновил ответ
3. эй, хейн отлично поработал над моим примером скрипки, но он не работает в моем коде, я получаю эту ошибку: Uncaught TypeError: this.html это не функция
4. я вижу свою проблему, поскольку у меня есть флажок aspx, он сформирован немного по-другому: <div class=»checkbox»><label for=»field2″><input id=»field2″ type=»checkbox» name=»field2″ value=»1″> a</label> </ div> мне нужно: $(this).next(«ввод»).next(«метка»).html()
5. вы не должны переносить входной тег внутри тега label
Ответ №2:
Вам необходимо отделить обработчик событий для флажков от обработчика событий для выпадающих списков. Кроме того, вы должны стараться либо использовать jquery, либо не использовать jquery.
var $checks = $(":checkbox");
document.getElementById('field1').onchange = function() {
var boxes = document.querySelectorAll('input[type="checkbox"]');
for (var i = 0; i < boxes.length; i ) {
boxes[i].checked = boxes[i].value == this.value;
$checks.change();
document.getElementById("field3").value = this.value;
}
};
$checks.on('change', function() {
var string = $checks.filter(":checked").map(function(i, v) {
return this.value;
}).get().join(" ,");
$('#field_results').val(string);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name='field1' id="field1">
<option value="1">Fruits</option>
<option value="2">Vegetables</option>
<option value="3">Sweets</option>
<option value="4">Meat</option>
</select>
<div id='changer'>
<input type='checkbox' id='a' value="3" /><label>A</label><br />
<input type='checkbox' id='b' value="3" /><label>B</label><br />
<input type='checkbox' id='c' value="3" /><label>C</label><br />
<input type='checkbox' id='d' value="3" /><label>D</label>
</div>
<input type="text" id="field_results" /><br>
<select name='field3' id="field3">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
Ответ №3:
Что вам нужно, так это
return $(this).next('label').text();
У вас две проблемы
1) ваше oncheck
событие должно быть вне события on-change
2) ваша метка находится вне флажка, поэтому, если вы хотите получить ее текст, вам нужно получить с помощью next
или closest
.
document.getElementById('field1').onchange = function() {
var boxes = document.querySelectorAll('input[type="checkbox"]');
for (var i = 0; i < boxes.length; i ) {
boxes[i].checked = boxes[i].value == this.value;
document.getElementById("field3").value = this.value;
}
};
$(":checkbox").on('change', function() {
var string = $(":checkbox").filter(":checked").map(function(i, v) {
return $(this).next('label').text();
}).get().join(" ,");
$('#field_results').val(string);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name='field1' id="field1">
<option value="1">Fruits</option>
<option value="2">Vegetables</option>
<option value="3">Sweets</option>
<option value="4">Meat</option>
</select>
<div id='changer'>
<input type='checkbox' id='a' value="3" /><label>A</label><br />
<input type='checkbox' id='b' value="3" /><label>B</label><br />
<input type='checkbox' id='c' value="3" /><label>C</label><br />
<input type='checkbox' id='d' value="3" /><label>D</label>
</div>
<input type="text" id="field_results" /><br>
<select name='field3' id="field3">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>