Проблема с getElementsByTagName и циклом
Такая задача. Есть страница с неизвестным количеством форм (2+). Необходимо просто в каждую форму добавить input type="hidden".
Сознаю элемент: var inp2 = document.createElement( 'input' ); inp2.type = 'hidden'; inp2.name = 'url'; inp2.id = 'urlpage'; inp2.value = location.href; Пытаюсь добавить его к формам:
var forms = document.getElementsByTagName('form');
for (var i = 0; i <= forms.length; i++) {
forms[i].insertBefore(inp2, forms[i].firstChild);
}
Выдает ошибку Cannot read property 'insertBefore' of undefined А если вместо счетчика i вставлю цифру, к примеру 2, то для третьей формы это сработает.
var forms = document.getElementsByTagName('form');
for (var i = 0; i <= forms.length; i++) {
forms[2].insertBefore(inp2, forms[2].firstChild);
}
В чем проблема счетчика i? Почему JS не принимает в качестве порядкового номера переменную? |
Цитата:
Сколько форм - столько элементов и должно быть. А это либо клонирование... Либо создание... |
Цитата:
А как задать ему.."динамическое" имя? Чтобы на каждом шагу цикла имя было новое? Или же лучше клонированием как-то? |
Попытался скопировать. Та же ошибка Cannot read property 'insertBefore' of undefined, которая ссылается на forms[i] в цикле.
var inp = document.createElement( 'input' );
inp.type = 'hidden';
inp.name = 'url';
inp.className = 'urlpage';
inp.value = location.href;
var forms = document.getElementsByTagName('form');
document.getElementsByTagName('form')[0].insertBefore(inp, forms[0].firstChild); // создаю элемент и вставляю в первую форму
for (var i = 1; i <= forms.length; i++) {
var newSelect = document.getElementsByClassName('urlpage')[0].cloneNode(true); // копирую элемент с первой формы по классу
forms[i].insertBefore(newSelect, forms[i].firstChild); // пытаюсь вставить его во все следующие формы
}
|
Цитата:
Или делать там клонирование... Цитата:
Рандомно чего-то гоношить... В самой форме иметь для этого "заготовку"... Да мало ли еще как. :) Цитата:
Как тебе удобнее будет... |
Аа, проблема была в условии i <= forms.length; цикла. Нужно было просто i < forms.length;
Простите за оверпостинг. Решил не удалять "свои размышления", чтобы загуглившие это могли найти решение для себя. Спасибо, ksa |
CraftLawrence, вот как иллюстрация...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
form {
border: 1px solid;
}
</style>
<script type='text/javascript'>
window.onload=function(){
var of=document.getElementsByTagName('form');
for (var i=0; i<of.length; i++) {
var o=document.createElement('input');
o.type='text';
o.value=i;
of[i].appendChild(o);
};
}
</script>
</head>
<body>
<form></form>
<form></form>
<form></form>
<form></form>
<form></form>
</body>
</html>
|
| Часовой пояс GMT +3, время: 23:08. |