Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка Uncaught TypeError: Cannot read property 'elements' of undefined (https://javascript.ru/forum/misc/30241-oshibka-uncaught-typeerror-cannot-read-property-%27elements%27-undefined.html)

Allality 28.07.2012 19:48

Ошибка Uncaught TypeError: Cannot read property 'elements' of undefined
 
Пытаюсь собрать данные большой формы, с помощью кода, которым поделился программер, но все время получаю странную ошибку. Chrome выдает такой текст:

Uncaught TypeError: Cannot read property 'elements' of undefined

Сам код:

var str = '';
for(i=0; i < document.parametry.elements.length; i++)
{
   str += document.parametry.elements[i].name + '=' + encodeURIComponent(document.parametry.elements[i].value) + '&';
}
str = str.substring(0, str.length-1);
alert(str);


При этом, когда ввожу в консоли Chrome это:
document.parametry.elements.length

Получаю ответ - число 7.

Подскажите, в чем может быть проблема? Почему страница не работает, а консоль того же браузера прекрасно определяет значение переменной?

lord2kim 28.07.2012 19:50

Allality, скорее всего какого-либо атрибута (name, value) не существует у какого-то элемента формы...
проверяйте на существование атрибутов...

vadim5june 28.07.2012 19:56

Цитата:

Сообщение от Allality (Сообщение 192439)
При этом, когда ввожу в консоли Chrome это:
document.parametry.elements.length

Получаю ответ - число 7.

Подскажите, в чем может быть проблема? Почему страница не работает, а консоль того же браузера прекрасно определяет значение переменной?

у меня document.parametry=undefined и на странице и в консоли хрома

Allality 28.07.2012 19:58

Цитата:

Сообщение от lord2kim (Сообщение 192441)
Allality, скорее всего какого-либо атрибута (name, value) не существует у какого-то элемента формы...
проверяйте на существование атрибутов...

Попробовал простую форму:

<form name="parametry">
<input name="aaa" value="10" />
</form>


Та же ошибка...

lord2kim 28.07.2012 19:58

vadim5june, это имя формы, по всей видимости...

lord2kim 28.07.2012 20:00

Allality,
<form name="parametry">
<input name="aaa" value="10" />
</form>
<script>
var str = '';
for(i=0; i < document.parametry.elements.length; i++)
{
   str += document.parametry.elements[i].name + '=' + encodeURIComponent(document.parametry.elements[i].value) + (i == document.parametry.elements.length -1 ? '' : '&');
}
alert(str);
</script>

Allality 28.07.2012 20:06

Скопировал ваш текст, работает. Выношу <script> часть в <head> документа - опять получаю ошибку... :blink:

lord2kim 28.07.2012 20:07

Allality, либо заворачивайте в функцию, либо размещайте после определения самой формы, т.к. на момент вызова (document.parametry.elements.length) не существует вашей формы parametry

Allality 28.07.2012 20:08

Цитата:

Сообщение от lord2kim (Сообщение 192452)
Allality, либо заворачивайте в функцию, либо размещайте после определения самой формы, т.к. на момент вызова (document.parametry.elements.length) не существует вашей формы parametry

Попробую в функцию завернуть. Спасибо огромное за помощь. :)

vadim5june 28.07.2012 20:09

window.onload=function(){}

Allality 28.07.2012 21:34

Цитата:

Сообщение от vadim5june (Сообщение 192454)
window.onload=function(){}

У меня другая ситуация, мне нужно подгружать форму через Ajax...

В общем запихнул в функцию - работает, но только со статической формой. Подскажите, как изменить (и вообще, возможно ли) код, чтобы он работал с формой, подгружаемой через Ajax?

Я не знаком с тем как именно JS обрабатывает данные, но теоретически ведь должен быть способен обрабатывать данные из загруженной через Ajax формы.

vadim5june 28.07.2012 21:54

Цитата:

Сообщение от Allality (Сообщение 192486)
Я не знаком с тем как именно JS обрабатывает данные, но теоретически ведь должен быть способен обрабатывать данные из загруженной через Ajax формы.

нужно заменить
document.parametry
на или
document.forms[0]
или
function dd(p){
document.getElementsByName(p)[0]};
и вызывать dd("parametry");

Allality 29.07.2012 07:44

Цитата:

Сообщение от vadim5june (Сообщение 192492)
нужно заменить
document.parametry
на или
document.forms[0]
или
function dd(p){
document.getElementsByName(p)[0]};
и вызывать dd("parametry");

Не знаю как, но заставил работать document.parametry. :) Почти все работает как надо.

Осталась одна проблемка, над которой завис. Дело в том, что в форме есть несколько SELECT MULTIPLE (где можно выбрать несколько значений сразу) и когда вызываю скрипт, передается только первое значение.

Например, если выбраны 3, 4 и 7, показывает только 3.

Посмотрел document.parametry.elements[1].value - пишет 3, причем:
document.parametry.elements[1].value[1] document.parametry.elements[1].value[2]
document.parametry.elements[1].value[3]
все они undefined

Я так понимаю тут два пути - либо сразу передать массив, если это возможно через GET, либо ввести проверку с помощью if создать список значений массива в строку (например "3i4i7"), чтобы передать дальше через GET.

Но вопрос в том, где взять этот массив с данными, если в value висит только одно значение 3?

lord2kim 29.07.2012 11:25

Allality,
var mas = [];
for (i = 0; i < mySelect.options.length; i++) {
   if (mySelect.options[i].selected)
      mas[mas.length] = mySelect.options[i].value;
}

Allality 29.07.2012 18:35

Цитата:

Сообщение от lord2kim (Сообщение 192627)
Allality,
var mas = [];
for (i = 0; i < mySelect.options.length; i++) {
   if (mySelect.options[i].selected)
      mas[mas.length] = mySelect.options[i].value;
}

Спасибо. :) Работает на ура.


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