Проблема: я хочу выполнить итерацию по определенному набору атрибутов имени и добавить эти значения к определенному идентификатору.
У меня есть демо, которое пытается прочитать пользовательский ввод, и текст справа будет зеркально отражен соответственно.
В настоящее время я повторяю свои конкретные атрибуты имени. Однако теперь я хочу добавить к одному соответствующему текстовому полю справа. Вместо этого он добавляется ко всем четырем элементам.
Как я могу сопоставить эти элементы?
$('input[name^ = "text"]').on("change", function(e){
var user_input = $(this).val();
console.info(user_input);
$('input[id^ = "id_text"').each(function() {
let mirrored_value = $(this).val(user_input);
});
});body {
padding:10px;
}
input {
margin: 20px 0 0 0;
}
.mirror{
float: left;
margin-left: 20px;
}
.input{
float: left;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1> The right text box will mirror the left</h1>
<div class = "input">
<input type = "text" name = "text1" value = ""><br>
<input type = "text" name = "text2" value = ""><br>
<input type = "text" name = "text3" value = ""><br>
<input type = "text" name = "text4" value = ""><br>
</div>
<div class = "mirror">
<input type = "text" id = "id_text1" value = ""><br>
<input type = "text" id = "id_text2" value = ""><br>
<input type = "text" id = "id_text3" value = ""><br>
<input type = "text" id = "id_text4" value = "">
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы использовал index, если ваша разметка стабильно надежна. Никаких идентификаторов или других атрибутов не требуется.
$('.input input').on("keyup", function(e){
const idx = $(this).index();
const val = $(this).val();
$('.mirror input').eq(idx).val(val);
});.input, .mirror {display: inline-block; width: 45%;}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1> The right text box will mirror the left</h1>
<div class = "input">
<input type = "text" name = "text1" value = "">
<input type = "text" name = "text2" value = "">
<input type = "text" name = "text3" value = "">
<input type = "text" name = "text4" value = "">
</div>
<div class = "mirror">
<input type = "text" value = "">
<input type = "text" value = "">
<input type = "text" value = "">
<input type = "text" value = "">
</div>Мой предпочтительный метод — использование атрибута данных, который ссылается на целевой элемент и ссылается на него. Таким образом, вам не нужно беспокоиться об изменении вашего javascript, если вы измените свою разметку. Также событие input является лучшим вариантом для ввода текста.
$('input[data-target]').on("input", function(e){
$($(this).data("target")).val($(this).val());
});body {
padding:10px;
}
input {
margin: 20px 0 0 0;
}
.mirror{
float: left;
margin-left: 20px;
}
.input{
float: left;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1> The right text box will mirror the left</h1>
<div class = "input">
<input data-target = "#id_text1" type = "text" name = "text1" value = ""><br>
<input data-target = "#id_text2" type = "text" name = "text2" value = ""><br>
<input data-target = "#id_text3" type = "text" name = "text3" value = ""><br>
<input data-target = "#id_text4" type = "text" name = "text4" value = ""><br>
</div>
<div class = "mirror">
<input type = "text" id = "id_text1" value = ""><br>
<input type = "text" id = "id_text2" value = ""><br>
<input type = "text" id = "id_text3" value = ""><br>
<input type = "text" id = "id_text4" value = "">
</div>Еще лучше было бы использовать input[data-target] в качестве селектора, чтобы избежать селектора частичного атрибута :).
Используя замыкания и предполагая, что группы элементов <input> находятся в одном порядке:
const $src = $('.input > input');
const $dst = $('.mirror > input');
$src.each((i,e) => {
const $mirror = $dst.eq(i);
$(e).on('change', e => {
let user_input = $(e.currentTarget).val();
console.info(user_input);
$mirror.val(user_input);
});
});
Здесь дело не столько в закрытии, сколько в том, что вы выбираете места назначения по индексу в массиве объектов jQuery, верно?
@isherwood Теперь, когда вы спрашиваете, я не уверен. Я думал, что это то место, где я тянул i (теперь $mirror).
10 очков кармы тому, кто первым найдет повторяющийся вопрос. У этого, вероятно, их 50, но у меня мало времени.