Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как переназначить id всех элементов <input> в форме при добавление нового <input> (https://javascript.ru/forum/dom-window/56957-kak-perenaznachit-id-vsekh-ehlementov-input-v-forme-pri-dobavlenie-novogo-input.html)

Эдди 12.07.2015 10:26

Как переназначить id всех элементов <input> в форме при добавление нового <input>
 
Есть форма с таблицей, где в каждой строке имеется input:
<input id="chek1"
<input id="chek2"
<input id="chek3"

В каждой строке есть кнопка "+", которая копирует строку с текущим id при помощи функции JS.
Получается следующее:
<input id="chek1"
<input id="chek2"
<input id="chek2"
<input id="chek3"

Теперь значения id не уникальны, и невозможно обратиться к ним по id.

Как же дополнить уже имеющуюся функцию JS циклом, чтобы получить:
<input id="chek1"
<input id="chek2"
<input id="chek3"
<input id="chek4"

Буду очень благодарен.

ksa 13.07.2015 08:17

Цитата:

Сообщение от Эдди
Как же дополнить уже имеющуюся функцию JS циклом, чтобы получить:
<input id="chek1"
<input id="chek2"
<input id="chek3"
<input id="chek4"

Вывод один - не клонировать инпут, а делать новый.

laimas 13.07.2015 11:46

Цитата:

Сообщение от Эдди
Теперь значения id не уникальны, и невозможно обратиться к ним по id.

Вообще-то и не обязательно обращаться к элементу по его id. Тут вопрос нужно ставить скорее не "как назвать" элемент, а "можно ли добавлять" элемент в форму. То есть, если добавление элемента в конечном итоге порождает новую запись в sql-таблице и у таблицы определен первичный уникальный ключ имеющий конечное значение, то более этого значения добавлять нельзя.

Если вставка не лимитируется со стороны SQL, значит при загрузке страницы получить в форме элементы, которые клонируются, среди них найти максимальный номер, например:

var max = element.id.match(/\d+$/); - где element это полученный каким либо способом элемент.

при каждом клонировании увеличивая его на 1, и добавляя к значению атрибута элемента.

Leon-on12 13.07.2015 13:54

Прежде всего можно попробовать переписать функцию клонирования. Что бы она добавляла цифру в id при клонировании.
А тот цикт который ты просишь довольно прост:

<body>
  <div id="ma1"></div>
  <div id="ma1"></div>
  <div id="ma2"></div>
  <div id="ma3"></div>
  <div id="ma4"></div>
  <div id="ma4"></div>
  <div id="ma5"></div>
  <div id="ma7"></div>

</body>


var elem=document.getElementsByTagName("div")
var i = 0;
for (i = 0;i<elem.length;i++){
  elem[i].id="chek"+i;
}

Эдди 13.07.2015 17:07

Цитата:

Сообщение от Leon-on12 (Сообщение 379057)
Прежде всего можно попробовать переписать функцию клонирования. Что бы она добавляла цифру в id при клонировании.
А тот цикт который ты просишь довольно прост:

<body>
  <div id="ma1"></div>
  <div id="ma1"></div>
  <div id="ma2"></div>
  <div id="ma3"></div>
  <div id="ma4"></div>
  <div id="ma4"></div>
  <div id="ma5"></div>
  <div id="ma7"></div>

</body>


var elem=document.getElementsByTagName("div")
var i = 0;
for (i = 0;i<elem.length;i++){
  elem[i].id="chek"+i;
}

Леон. Весь день в голове крутилась та же мысль!
Прокрутить по name и назначить id в цикле!!!
СПАСИБО!

Просто потом надо будет при пометке чекбокса скрывать или показывать этот элемент. И у него должно быть уникальное значение.

Нет, все же JS -это класс, хотя я больше в php работаю.
:)

Эдди 13.07.2015 17:08

Функция клонирования - не моя.
Она отлично работает. Ее не хотелось бы трогать.

Если что, вот эти функции клонирования и удаления строк:Н
<script type="text/javascript">
//Удаление строки
function droptr(btn){
  if(document.getElementById) {
          tr = btn;
          while (tr.tagName != 'TR') tr = tr.parentNode;
          tr.parentNode.removeChild(tr);
          checkForLast();
  }
}
//Добавление строки
function addtr(btn){
  if(document.getElementById) {
          tr = btn;
          while (tr.tagName != 'TR') tr = tr.parentNode;
          var idSuffix = Math.round(Math.random()*1000);
          var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);
          thisChilds = newTr.getElementsByTagName('td');
          checkForLast();
    }
  }
}
//Активация/дезактивация кнопки минус ( - )
//Неактивна, когда строка строка одна или нет ни одной добавленной строки
function checkForLast(){
  btns = document.getElementsByName('drop');
  for (i = 0; i < btns.length; i++){
          btns[i].disabled = (btns.length == 1) ? true : false;
  }
}
</script>

Надо ли изменять эти функции или просто в них добавить вышеуказанный цикл?

kostyanet 13.07.2015 19:41

Цитата:

Сообщение от Эдди
Теперь значения id не уникальны, и невозможно обратиться к ним по id.


Вам id вообще не нужны.

Пользователь выбирает и показывает _что_ скопировать (равно удалить, редактировать).

Выбрал - скопировали - осталось выбранное - можно редактировать. Все просто.

Ну то есть после копирования надо лишь перенести фокус на копию чтоб она осталась активной.

Эдди 14.07.2015 08:20

Цитата:

Сообщение от kostyanet (Сообщение 379211)
Вам id вообще не нужны.

Пользователь выбирает и показывает _что_ скопировать (равно удалить, редактировать).

Выбрал - скопировали - осталось выбранное - можно редактировать. Все просто.

Ну то есть после копирования надо лишь перенести фокус на копию чтоб она осталась активной.

У меня случай посложнее.
Пользователь копирует строку. А в строке помимо прочего есть еще и чекбоксы. Это форма.
Так вот необходимо, чтобы в скрипт передавались не только помеченные чекбоксы, а еще и непомеченные, для чего до чекбокса стоит Hidden с таким же названием и value=0. И при пометке чекбокса надо сделать этот hidden style="display=none".
В общем там все сложно. :)
Перебор id по getElementsByTagName мне подходит.

laimas 14.07.2015 08:23

А если начать с этого - Пользователь копирует строку. - цель?

kostyanet 14.07.2015 08:38

Цитата:

Сообщение от Эдди
В общем там все сложно.

Это не сложно, а дофига. Куча песка - не сложна, а просто там дофига песчинок, а вот здание состоящее в сущности из песка разной природы и фракций - сложное.

Если вам для веры нужен id, то значит нужен. А вообще он там в упор не нужен, ибо есть пользователь и значит интерфейс попросту интерактивный.

Элемент копируется (клонируется) со всем своим барахлом - с хиденами и протча - как два пальца об асфальт.


Часовой пояс GMT +3, время: 10:49.