Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Добавление и удаление полей в форму
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Добавление и удаление полей в форму

Страниц (1): [1]
 

1. anoth3r - 10 Сентября, 2009 - 13:47:35 - перейти к сообщению
Есть форма типа:
CODE (text):
скопировать код в буфер обмена
  1. <form method="GET" action="#">
  2. Name:
  3. <br>
  4. <div id="colName">
  5. <div>
  6. 1.<input id="col_name[1]" name="col_name[1]" type="text" />
  7. <a onclick="return deleteField()" href="#">[X]</a>
  8. </div>
  9. </div>
  10. Data:
  11. <br>
  12. <div id="colVal">
  13. <div>
  14. 1.<input id="col_val[1]" name="col_val[1]" type="text" />
  15. </div>
  16. </div>
  17. <input class="s" type="submit" value="GO!" />
  18. </form>
  19. <a onclick="return addField()" href="#">Добавить поля</a>


Нужно чтобы при нажатии на ссылку "Добавить поля" добавлялось по одному полю в Name и Data, а при нажатии на ссылку "[X]" эти оба поля удалялись.
С JavaScript имею дело впервые, пока только получилось написать функцию на добавление полей:
CODE (text):
скопировать код в буфер обмена
  1. <script>
  2. var countOfFields = 1; // Текущее число полей
  3. var maxFieldLimit = 30; // Максимальное число возможных полей
  4. function deleteField() {
  5. }
  6.  
  7. function addField() {
  8. if (countOfFields >= maxFieldLimit) {
  9. alert("Число полей достигло своего максимума = " + maxFieldLimit);
  10. return false;
  11. }
  12. countOfFields++;
  13.  
  14. var name = document.createElement("div");
  15. var val = document.createElement("div");
  16. name.innerHTML = countOfFields + ".<input name=\"col_name[" + countOfFields + "]\" type=\"text\" /> <a onclick=\"return deleteField()\" href=\"#\">[X]</a>";
  17. val.innerHTML = countOfFields + ".<input name=\"col_val[" + countOfFields + "]\" type=\"text\" />";
  18. document.getElementById("colName").appendChild(name);
  19. document.getElementById("colVal").appendChild(val) ;
  20. return false;
  21. }
  22. </script>

Написать функцию на удаление что-то не получаеться.
Зарание спасибо.
2. valenok - 10 Сентября, 2009 - 20:31:37 - перейти к сообщению
document.getElementById("colName").removeChild(name);
3. anoth3r - 10 Сентября, 2009 - 20:54:07 - перейти к сообщению
Что-то у меня функция на удаление не работает. Не могли бы Вы написать уже работающую функцию.
4. valenok - 10 Сентября, 2009 - 21:00:29 - перейти к сообщению
Нет, но могу помочь если вы покажете как вы пробовали, а потом скопируете сюда то, что пишет консоль ошибок.
5. anoth3r - 11 Сентября, 2009 - 16:42:38 - перейти к сообщению
Вот как я пробовал:
CODE (text):
скопировать код в буфер обмена
  1. <form method="post" action="">
  2. Name:
  3. <br>
  4. <div id="colName">
  5. <div>
  6. 1.<input name="col_name[1]" type="text" />
  7. <a onclick="return deleteField()" href="#">[X]</a>
  8. </div>
  9. </div>
  10. Data:
  11. <br>
  12. <div id="colVal">
  13. <div>
  14. 1.<input name="col_val[1]" type="text" />
  15. </div>
  16. </div>
  17. <input class="s" type="submit" value="GO!" />
  18. </form>
  19. <a onclick="return addField()" href="#">Добавить поля</a>
  20. <script type="text/javascript">
  21. var countOfFields = 1; // Текущее число полей
  22. var maxFieldLimit = 30; // Максимальное число возможных полей
  23. function deleteField() {
  24. document.getElementById("colName").removeChild(name);
  25. document.getElementById("colVal").removeChild(val);
  26. return false;
  27. }
  28.  
  29. function addField() {
  30.     if (countOfFields >= maxFieldLimit) {
  31.         alert("Число полей достигло своего максимума = " + maxFieldLimit);
  32.         return false;
  33.     }
  34. countOfFields++;
  35.  
  36. var name = document.createElement("div");
  37. var val = document.createElement("div");
  38. name.innerHTML = countOfFields + ".<input name=\"col_name[" + countOfFields + "]\" type=\"text\" /> <a onclick=\"return deleteField()\" href=\"#\">[X]</a>";
  39. val.innerHTML = countOfFields + ".<input name=\"col_val[" + countOfFields + "]\" type=\"text\" />";
  40. document.getElementById("colName").appendChild(name);
  41. document.getElementById("colVal").appendChild(val);
  42. return false;
  43. }
  44. </script>

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

А вот что пишет консоль ошибок:
Цитата:
uncaught exception: [Exception... "Could not convert JavaScript argument arg 0" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: file:///C:/Documents%20and%20Settings/x3m.pr0/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/test.htm# :: deleteField :: line 32" data: no]
6. valenok - 11 Сентября, 2009 - 19:15:46 - перейти к сообщению
Хорошо. Так как поля у вас добавляются не раз, присваивайте каждому полю свой собственный идентификатор и при нажатии на крестик вызывайте передавайте в функцию удаления тот самый идентификатор и по нему находите элемент для удаления.
7. anoth3r - 11 Сентября, 2009 - 19:39:33 - перейти к сообщению
Я понимаю что нужно каждому полю присвоить идентификатор. Это мой первый скрипт на JS и я просто не знаю как это описать.
8. Champion - 12 Сентября, 2009 - 10:12:44 - перейти к сообщению
val.setAttribute('id', 'qwe'+unq);
document.getElementById("colVal").appendChild(val);

А unq каким-нибудь образом делать уникальным: счетчик, текущее время...
9. anoth3r - 12 Сентября, 2009 - 11:54:26 - перейти к сообщению
Вот что получилось:
CODE (text):
скопировать код в буфер обмена
  1. <script type="text/javascript">
  2. var countOfFields = 1; // Текущее число полей
  3. var maxFieldLimit = 30; // Максимальное число возможных полей
  4. function deleteField(id) {
  5. var delName = document.getElementById("name" + id);
  6. var delVal = document.getElementById("val" + id);
  7. delName.removeChild(delName);
  8. delVal.removeChild(delVal);
  9. countOfFields--;
  10. return false;
  11. }
  12.  
  13. function addField() {
  14.     if (countOfFields >= maxFieldLimit) {
  15.         alert("Число полей достигло своего максимума = " + maxFieldLimit);
  16.         return false;
  17.     }
  18. countOfFields++;
  19.  
  20. var name = document.createElement("div");
  21. var val = document.createElement("div");
  22. name.setAttribute("id" , "name" + countOfFields);
  23. val.setAttribute("id" , "val" + countOfFields);
  24. name.innerHTML = countOfFields + ".<input name=\"col_name[" + countOfFields + "]\" type=\"text\" /> <a onclick=\"return deleteField(" + countOfFields + ")\" href=\"#\">[X]</a>";
  25. val.innerHTML = countOfFields + ".<input name=\"col_val[" + countOfFields + "]\" type=\"text\" />";
  26. document.getElementById("colName").appendChild(name);
  27. document.getElementById("colVal").appendChild(val);
  28. return false;
  29. }
  30. </script>

Функция addField работает, функция deleteField не работает.
Ошибка функции deleteField:
Цитата:
Node was not found" code: "8
delName.removeChild(delName);

(Добавление)
Заработало Хай!
Нужно было между елементом и removeChild прописать parentNode.
function deleteField:
CODE (text):
скопировать код в буфер обмена
  1. function deleteField(id) {
  2. var delName = document.getElementById("name" + id);
  3. var delVal = document.getElementById("val" + id);
  4. delName.parentNode.removeChild(delName);
  5. delVal.parentNode.removeChild(delVal);
  6. countOfFields--;
  7. return false;
  8. }

Всем огромное спасибо! Очень помогли.

 

Powered by ExBB FM 1.0 RC1