LINUX.ORG.RU

[html][form] Динамическая форма отправляет не все элементы


0

1

Доброго, всем.

Короче, html-форма с динамическим содержимым, элементы добавляются по ходу действий пользователя. Добавление - простым .innerHTML внутри блоков формы из другого места.

Сначала все работало. Потом смотрю динамические элементы не попадают в POST-запрос (обычный, не ajax).

Смотрел расширением ФФ [Web developer] - нормально показывает всю информацию о форме.

Проверил банальным:

for (var i in this.form.elements) {alert(this.form.elements[i].name);}
Тоже все нормально.

Что может быть? Спасибо.

innerHTML не косбраузерен, или я путаю? В любом случае правильнее будет через createElement и appendChild.

Покажи как именно добавляешь или хтмл который генерируется.

Алсо не отправляться элементы могут если у них стоит аттрибут disabled.

Kalashnikov ★★★ ()
Ответ на: комментарий от trashymichael

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

chegeware ()
Ответ на: комментарий от Kalashnikov

Через appendChild тоже пробовал - не хочет. Вот пример, этот раздел вставляется внутрь формы, в нем чекбокс (извиняюсь за кашу, без табов, как есть) [code] <div style=«color: red;»><div><h4>Внимание! Проверьте указанные записи и подтвердите, что нет повторов</h4> <table rules=«cols» style=«»><tbody><tr><th></th> <th>Наименование</th> <th>Тип</th> <th>ИНН</th> <th>Описание</th></tr> <tr style=«border-bottom: 1px dotted;»><td><div><input type=«checkbox» value=«1019» name=«487357757690742.крыжик дубля»> </div></td> <td><div>123</div></td> <td><div>юрлицо</div></td> <td><div>3214243</div></td> <td></td></tr></tbody></table> <div></div> at (eval 330) line 61. </div> <div><div class=«hidden3»></div></div></div>

[/code]

Вот, и этот чекбокс не уходит в POST-запрос, естественно его крыжу

Ей богу, работало

chegeware ()
Ответ на: комментарий от Kalashnikov

Действительно, что-то тег не закрыт, проверил в скрипте на сервере нормально.

Где-то, чего-то каверкается, вроде теплее.

chegeware ()
Ответ на: комментарий от RR

спасибо, но

задача не просто приделать в форму новый крыжик, а вставлять мегатонны разметки Не-не-не, генерировать эти тонны в jquery - пусть меня уволят и пойду работать грузчиком.

Не серьезно, второй день бьюсь, умираю за правду. Как такое может быть, ведь работало, поднял даже старые коммиты, которые работали и сейчас тоже не работают.

chegeware ()
Ответ на: спасибо, но от chegeware

у меня в текущем прожекте весь гуй на extjs4 вот там тонны, а тут просто смешно =) ЗЫ уточню - если чекбокс не отмечен его в посте нет.

RR ()
Ответ на: комментарий от chegeware

<input type=«checkbox» value=«1019» name=«487357757690742.крыжик дубля»>

name=«487357757690742.крыжик дубля»

WTF? O_o

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores («_»), colons (":"), and periods (".").

Прозреваю, что проблема в этом.

Алсо, не знаю, какой у тебя доктайп, но тэги лучше закрывать.

Apple-ch ★★ ()
Ответ на: комментарий от chegeware

не innerHTML, а что-то вроде $(foo).append($('<input />').attr('name', 'bar'));

xpahos ★★★★★ ()
Ответ на: комментарий от JFreeM

Вот простой случай, зачем джеквери сразу

1. Могу ли я себе позволить перемешать блоки-разделы в хтмл-документе?

Отвечаю себе: могу - appendChild() или innerHTML()

2. Могу ли я позволить себе перемещать блоки-разделы внутрь тега формы?

Отвечаю себе: могу и я это вижу воочию и с помощью инструментов веб-разработчика в браузере.

3. Как должен вести себя браузер, когда в форму переместился блок-раздел с input-элементами?

Отвечаю себе: эти элементы должны стать подвластными этой формы. Действительно вижу, что onclick=«alert(this.form.name)» выдает нужную мне форму.

4. Когда происходит отправка формы, что происходит с элементами формы?

Отвечаю себе: они превращаются в параметры HTTP-запроса и передаются серверу.

5. На серверной стороне смотрю весь список параметров и в упор не вижу динамично добавленных. Тогда запускаю инструмент перехватки запросов браузера и тоже вижу отсутствие только динамически перемещенных элементов формы.

chegeware ()
Ответ на: комментарий от xpahos

Насколько помню я, в ИЕ тупит setAttribute, а обращение через точку вроде нормально должно работать. Хотя мне нечем потестить.

Алсо я там опечатался, appendChild с двумя p.

Kalashnikov ★★★ ()
Ответ на: комментарий от Apple-ch

исправил имя уже всяко десятки раз, не помогло. Я скопировал вышеупомянутый пример разметки из web-developer а, он теги не закрывает, на самом деле я щепетильно все закрываю.

chegeware ()
Ответ на: комментарий от RR

у меня в текущем прожекте весь гуй на extjs4 вот там тонны, а тут просто смешно =) ЗЫ уточню - если чекбокс не отмечен его в посте нет.

не. ну как так жить, чекбокс и крыжил и заменял на текстовое поле, ну не посылает, башка моя каменная дырявая :(

chegeware ()
Ответ на: комментарий от chegeware

Ок, выше уже написали, что если добавляемые инпуты — чекбоксы — и они не чекнуты, то сабмититься они и не должны. Проверь, сабмитятся ли чекнутые. А для отправки нечекнутых добавляй перед чекбоксом хидден с тем же именем и нужным значением.

Apple-ch ★★ ()
Ответ на: комментарий от Apple-ch

Ок, выше уже написали, что если добавляемые инпуты — чекбоксы — и они не чекнуты, то сабмититься они и не должны. Проверь, сабмитятся ли чекнутые. А для отправки нечекнутых добавляй перед чекбоксом хидден с тем же именем и нужным значением.

Cовершенно спокойно отвечаю: какие-бы не были инпуты (чекнутый крыжик, текстовое поле) - они по загадочной причине не сабмитятся.

Сейчас делаю передергивание этих злосчастных инпутов (повторно, после перемещения всего блока разметки внутрь формы). Небольшой просвет есть когда выдергиваю из этой разметки (которая уже ВНУТРИ этой формы) просто в саму форму: $('#перемещенный раздел').find('input').append(document.forms['злосчастная форма'])

Но это не годится, разметка тоже важна.

Пробую передергивать на тоже место, бесполезно, форма никак их не ловит, не передает.

chegeware ()
Ответ на: комментарий от chegeware

$('form').serialize() тоже говорит, что нема таких инпутов

Эх, жись

chegeware ()
Ответ на: комментарий от VirRaa

Люди, если не знаете JavaScript, то используйте jQuery.

Как-будто есть разница, здесь джеквери вообще не причем, я его так, для тестов подключил, без толку

chegeware ()
Ответ на: комментарий от chegeware

Как-будто есть разница, здесь джеквери вообще не причем, я его так, для тестов подключил, без толку

Хочешь сказать appendTo() не помогает?

VirRaa ★★★ ()
Ответ на: комментарий от chegeware

короче, тебе придется показать минимальный не работающий пример. там даже с таблицами может быть косяк, хз. приходи со ссылкой на jsfiddle.

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

http://jsfiddle.net/cGYqE/ у меня вот все работает

алсо, с jquery тебе ненужно вручную поэлементно генерировать html, там есть и .html() и $(«<any><html></code>»)

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

Пока выясняется, что если инпуты выдернуть из разметки перемещенного раздела куда-то в другое место формы, то все начинает работать.

Уже попробовал в этом злосчастном перемещаемом разделе оставлять только сам инпут, без множества разметки, все равно, форма его не воспринимает.

Дальше рою.

«И плачу, и плачу, и плачу я И смеются, и смеются надо мною вся братва»

chegeware ()
Ответ на: комментарий от VirRaa

Хочешь сказать appendTo() не помогает?

Визуально все помогает, любым способом перемещается, а форма не подхватывает инпуты оказавшиеся у нее внутри.

Ну-ка, где те певцы идеологии MVC? морду набить

chegeware ()
Ответ на: комментарий от chegeware

Визуально все помогает, любым способом перемещается, а форма не подхватывает инпуты оказавшиеся у нее внутри.

А если использовать $('#form').submit()? Или как там...

VirRaa ★★★ ()
Ответ на: комментарий от chegeware

УМВР

Пример:

<?php
if (isset ($_POST) && !empty($_POST))
{
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
    exit();
}
?>
<html>
<head>
    <script type="text/javascript">
        function test() {
            var form = document.getElementById('test_form'),
                submitButton = form.elements['submit'],
                el,
                rnd;

            for (var i = 0; i < 10; i++) {
                el = document.createElement('input');
                el.setAttribute('name', 'dyn_input_' + i);
                rnd = Math.random() * 100;

                if (rnd <= 50) {
                    el.setAttribute('type', 'checkbox');
                } else {
                    el.setAttribute('type', 'text');
                    el.setAttribute('value', 'Value ' + i);
                }

                form.insertBefore(el, submitButton);
                form.insertBefore(document.createElement('br'), submitButton);
            }
        };
    </script>
</head>
    <body>
    <form id="test_form" action="<?= $_SERVER['PHP_SELF'] ?>" method="POST">
        <input type="text" name="test" value="test value">
        <input type="submit" name="submit">
    </form>
    <div onclick="test();">Click for test</div>
    </body>
</html>
Выхлоп:
Array
(
    [test] => test value
    [dyn_input_1] => Value 1
    [dyn_input_2] => Value 2
    [dyn_input_3] => Value 3
    [dyn_input_4] => Value 4
    [dyn_input_5] => on
    [dyn_input_7] => Value 7
    [dyn_input_9] => on
    [submit] => Submit Query
)

RR ()
Ответ на: комментарий от VirRaa

Так и не получилось, что-ли?

Нет, сейчас упрощаю задачу, чего-то пытаюсь сделать по другому, до обиды интересно. Все что прилетает через ajax - нормально внедряется в форму, а простой случай, когда блок уже есть на странице, но вне формы и помещается в форму - тупит. Говорила мне бабушка «не связывайся с браузерами».

chegeware ()
Ответ на: комментарий от chegeware

Скорее всего сам js валится с ошибкой где-то выше по тексту так что до заполнения формы дело уже не доходит.

anonymous ()
Ответ на: комментарий от chegeware

ты просто лох и где-то тупишь, но так как ты ничего не показываешь а только кричишь ко-ко-ко не работает то все закономерно. рака браузера /thread

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

ты просто лох и где-то тупишь, но так как ты ничего не показываешь а только кричишь ко-ко-ко не работает то все закономерно. рака браузера /thread

да так оно, хочу показать, предварительно убрать тонны разметки, оставить пустую форму, внедрять в нее один элемент

chegeware ()
Ответ на: комментарий от chegeware

ты просто лох и где-то тупишь

Все нашел свою ошибку, каюсь, короче, на кнопке отправки формы обработчик делал this.form.submit() после того, как этот раздел инпутами удергивался из формы обратно.

Как так произошло, не знаю, ну бейте, ну лоханулся, с кем не бывает.

Эх, жись, только держись.

Спасибо, не поминайте лохом.

chegeware ()
Ответ на: УМВР от RR

action=«<?= $_SERVER['PHP_SELF'] ?>»

Что за костыль? Если аттрибут экшн не указан, итак сабмитится само на себя. Или я чего-то не понял?

Kalashnikov ★★★ ()
Ответ на: комментарий от chegeware

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

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

все должно работать

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

chegeware ()
Ответ на: комментарий от chegeware

Эксперименты натолкнули на массу полезных вещей, которые по доброй воле не часто приходят.

Да нет, дядь, человек должен понимать принципы работы того, чем он занимается. Я, например, очень редко трачу больше чем даже пару часов на решение проблемы в своём коде.

jessey ()
Ответ на: комментарий от chegeware

Не догадался отдебажить скрипт отправки формы, в нем на каждом шаге проверять состояние формы. Собственно ради этого был пост: «куда еще заглянуть, что проверить». Да ладно, что уж, не судьба.

chegeware ()
Ответ на: комментарий от jessey

должен понимать принципы работы

Есть принципы, а есть красивые решения. Одну задачу можно решить разными способами придерживаясь одинаковых принципов. Эксперименты в данном случае натолкнули на решения. Все же есть нехватка решений при наличии принципов.

chegeware ()
Ответ на: комментарий от jessey

Oh wow!

да, получил дополнительные варианты решений, принципы оставляю вам

chegeware ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.