URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 3984
[ Назад ]

Исходное сообщение
"как передать именнованный массив"

Отправлено kvk , 20-Мрт-06 17:21 
<script language="JavaScript">
var t = {4: "test1",
     "key2": "350",
     10: "test3"};
</script>
<form name=frm...>
<input type=hidden name="t[]">
...
</form>
---------------------------
надо передать "t[]" = значение массива t. Как?!
document.frm.t.value = t; // не проходит
document.frm.t[].value = t; // ошибка
как это делается в JS?

Содержание

Сообщения в этом обсуждении
"как передать именнованный массив"
Отправлено lx , 20-Мрт-06 20:07 
><script language="JavaScript">
>var t = {4: "test1",
>  "key2": "350",
>  10: "test3"};
></script>
><form name=frm...>
><input type=hidden name="t[]">
>...
></form>
>---------------------------
>надо передать "t[]" = значение массива t. Как?!
>document.frm.t.value = t; // не проходит
>document.frm.t[].value = t; // ошибка
>как это делается в JS?

Читать про массивы. Такой конструкции для массивов в яваскрипт нет.
Как-то так:
document.forms["frm"].t.value = t[0];



"как передать именнованный массив"
Отправлено konst , 20-Мрт-06 20:14 
>><script language="JavaScript">
>>var t = {4: "test1",
>>  "key2": "350",
>>  10: "test3"};
>></script>
>><form name=frm...>
>><input type=hidden name="t[]">
>>...
>></form>
>>---------------------------
>>надо передать "t[]" = значение массива t. Как?!
>>document.frm.t.value = t; // не проходит
>>document.frm.t[].value = t; // ошибка
>>как это делается в JS?
>
>Читать про массивы. Такой конструкции для массивов в яваскрипт нет.
какой конструкции нет?
>Как-то так:
>document.forms["frm"].t.value = t[0];
передать массив я могу http://...cgi?t=1&t=2&t=3
а как его собрать в name=t[] в js?

"как передать именнованный массив"
Отправлено lx , 20-Мрт-06 20:19 
>>><script language="JavaScript">
>>>var t = {4: "test1",
>>>  "key2": "350",
>>>  10: "test3"};
>>></script>
>>><form name=frm...>
>>><input type=hidden name="t[]">
>>>...
>>></form>
>>>---------------------------
>>>надо передать "t[]" = значение массива t. Как?!
>>>document.frm.t.value = t; // не проходит
>>>document.frm.t[].value = t; // ошибка
>>>как это делается в JS?
>>
>>Читать про массивы. Такой конструкции для массивов в яваскрипт нет.
>какой конструкции нет?
>>Как-то так:
>>document.forms["frm"].t.value = t[0];
>передать массив я могу http://...cgi?t=1&t=2&t=3
>а как его собрать в name=t[] в js?

м-да, как все запущенно.


"как передать именнованный массив"
Отправлено konst , 20-Мрт-06 20:24 
>м-да, как все запущенно.
здесь не принято так выражаться. По существу что-нибудь скажите?


"только как строку"
Отправлено XAnder , 21-Мрт-06 09:03 
>надо передать "t[]" = значение массива t. Как?!
>document.frm.t.value = t; // не проходит
>document.frm.t[].value = t; // ошибка
>как это делается в JS?

Ошибка возникает потому, что значением (value) элемента формы может быть только строка, но не массив. Следовательно, перед присваиванием нужно сделать из массива строку. Этого можно достичь разными способами в зависимости от сложности исходного массива. Общее решение - реализовать на JS аналог PHP'шных функций serialize/unserialize. Наверняка где-нибудь в инете есть готовые решения этой задачи.


"только как строку"
Отправлено konst , 21-Мрт-06 13:27 
>>надо передать "t[]" = значение массива t. Как?!
>>document.frm.t.value = t; // не проходит
>>document.frm.t[].value = t; // ошибка
>>как это делается в JS?
>
>Ошибка возникает потому, что значением (value) элемента формы может быть только строка,
>но не массив. Следовательно, перед присваиванием нужно сделать из массива строку.
>Этого можно достичь разными способами в зависимости от сложности исходного массива.
>Общее решение - реализовать на JS аналог PHP'шных функций serialize/unserialize. Наверняка
>где-нибудь в инете есть готовые решения этой задачи.

а почему так не проходит?:
document.frm.t[0].value = t[0];


"дык, не должно так проходить"
Отправлено XAnder , 21-Мрт-06 16:32 
>а почему так не проходит?:
>document.frm.t[0].value = t[0];

Потому что у элемента "t" нет свойства "0". Да и вообще элемента с именем "t" нет.

Если же вернуться к исходному примеру, то это вот совсем неправильно:

   document.frm.t.value = t;

а вместо такого:

   document.frm.t[].value = t;

корректно писать так:

   document.frm["t[]"].value = t;

Это сработает без ошибок, но результат будет немного не тот - свойству value будет присвоено значение "[object Object]" (это в FF). А всё потому, что t - это массив, а ожидается строка, вот JS и перегоняет его в строку, как умеет, а умеет плохо :)


"дык, не должно так проходить"
Отправлено konst , 21-Мрт-06 18:16 
>>а почему так не проходит?:
>>document.frm.t[0].value = t[0];
>
>Потому что у элемента "t" нет свойства "0". Да и вообще элемента
>Это сработает без ошибок, но результат будет немного не тот - свойству
>value будет присвоено значение "[object Object]" (это в FF). А всё
>потому, что t - это массив, а ожидается строка, вот JS
>и перегоняет его в строку, как умеет, а умеет плохо :)
>
а хоть как-то возможно присвоить хоть какое-то значение для t[] (на js)?
<input type=hydden name="t[]">
или просто нельзя использовать name=t[], если хочешь использовать js для ее заполнения?


"можно, но есть ньюансы"
Отправлено XAnder , 22-Мрт-06 08:47 
>а хоть как-то возможно присвоить хоть какое-то значение для t[] (на js)?
>
><input type=hydden name="t[]">
>или просто нельзя использовать name=t[], если хочешь использовать js для ее заполнения?

Можно, так, например:

document.frm["t[]"].value = "какая-нибудь строка";

Эта конструкция прокатит на ура. Если ты знаком с синтаксисом JS, то должен знать, что такие вот две записи:

   foo.bar
   foo["bar"]

в общем-то эквивалентны и обозначают одно и то же. Разница только в границах их применимости - если вторая может применяться для элементов с какими угодно именами, то первая - только для элементов, чьи имена являются правильными идентификаторами.

foo["qq"], foo["t[]"] и foo["-*-"] - правильно

foo.qq - правильно,
foo.t[] - синтаксически верно, но обозначает не то
foo.-*- - неправильно


"можно, но есть ньюансы"
Отправлено konst , 22-Мрт-06 14:14 
>>а хоть как-то возможно присвоить хоть какое-то значение для t[] (на js)?
>>
>><input type=hydden name="t[]">
>>или просто нельзя использовать name=t[], если хочешь использовать js для ее заполнения?
>
>Можно, так, например:
>
>document.frm["t[]"].value = "какая-нибудь строка";
>
>Эта конструкция прокатит на ура. Если ты знаком с синтаксисом JS, то
>должен знать, что такие вот две записи:
>
>   foo.bar
>   foo["bar"]
>
>в общем-то эквивалентны и обозначают одно и то же. Разница только в
>границах их применимости - если вторая может применяться для элементов с
>какими угодно именами, то первая - только для элементов, чьи имена
>являются правильными идентификаторами.
>
>foo["qq"], foo["t[]"] и foo["-*-"] - правильно
>
>foo.qq - правильно,
>foo.t[] - синтаксически верно, но обозначает не то
>foo.-*- - неправильно

Спасибо. Как я понял, работать с массивами норамьно в js не получится. Надо будет работать со строками...