У меня следующая проблема: У меня есть элемент JQuery Tournament.player со следующими данными:

<div class="row mb-2">
  <div class="col">
    <input name="players[2][nickname]" type="text" class="form-control" id="p_nickname" placeholder="Nickname" value="Player3">
  </div>
  <div class="col p_region" style="">
    <select name="players[2][region]" class="form-control">
      <option value="" disabled="" selected="">Choose region</option>
    </select>
  </div>
  <div class="col-2">
    <button type="button" class="w-100 btn-sm btn-danger deleteRow">Delete</button>
  </div>
</div>

Я хочу увеличить счетчик в атрибуте name внутренних элементов select и input.

Вот что я пробовал до сих пор:

var newPlayer = Tournament.player.clone().find('input, select').attr("name", function(i, name) {
  return name.replace(/(\d+)/, function($0, $1) {
    return +$1 + 1;
  });
});
newPlayer.appendTo(".players");

Он делает то, что мне нужно, но возвращает только элементы select и input, например:

<input name="players[3][nickname]" type="text" class="form-control" id="p_nickname" placeholder="Nickname" value="">
<select name="players[3][region]" class="form-control" disabled="">
  <option value="" disabled="" selected="">Choose region</option>                                                                               
</select>

Что я делаю не так? Я хочу получить тот же элемент, что и раньше, но получить только его часть.

Заранее большое спасибо.

1
Kirill Adamuk 29 Окт 2019 в 17:57
Привет! Tournament.player - это переменная, внутри которой находится элемент JQuery (я указал его в своем вопросе). Надеюсь, теперь все ясно
 – 
Kirill Adamuk
29 Окт 2019 в 18:11
Я нахожу его на странице и копирую в переменную для будущего использования: this.player = $(".player:last").clone() .find("input") .attr({value: ''}) .end();
 – 
Kirill Adamuk
29 Окт 2019 в 18:15
Да, это так
 – 
Kirill Adamuk
29 Окт 2019 в 18:17

1 ответ

Лучший ответ

Вы имеете в виду это:

const Tournament = {
  player: $(".mb-2")
}

var newPlayer = Tournament.player.clone();
newPlayer.find('input, select').attr("name", function(i, name) {
  return name.replace(/(\d+)/, function($0, $1) {
    return +$1 + 1;
  });
});
newPlayer.find('input').attr("value", function(i, value) {
  return value.replace(/(\d+)/, function($0, $1) {
    return +$1 + 1;
  });
});
newPlayer.appendTo(".players");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="players">
  <div class="row mb-2">
    <div class="col">
      <input name="players[2][nickname]" type="text" class="form-control" id="p_nickname" placeholder="Nickname" value="Player2">
    </div>
    <div class="col p_region" style="">
      <select name="players[2][region]" class="form-control">
        <option value="" disabled="" selected="">Choose region</option>
      </select>
    </div>
    <div class="col-2">
      <button type="button" class="w-100 btn-sm btn-danger deleteRow">Delete</button>
    </div>
  </div>
</div>
1
mplungjan 29 Окт 2019 в 18:16
Большое спасибо, это сработало. Я предполагаю, что в моем коде была неправильная цепочка методов!
 – 
Kirill Adamuk
29 Окт 2019 в 18:29
Да, вы вставили только найденные элементы
 – 
mplungjan
29 Окт 2019 в 18:31