Большой Воронежский Форум
» Веб-дизайн>Не работает параметр form тэга input
Eвгений 18:14 16.10.2014
Господа, есть задача, для реализации которой, на первый взгляд, необходимо создать вложенную форму

Сообщение от :
<FORM id=form1>
<FORM id=form2>
...........

</FORM>
</FORM>

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

Я попытался реализовать это на практике - не работает.

Вот, посмотрите - так работает:

Сообщение от :

print "<form enctype=\"multipart/form-data\" action=\"upload_recipe_images.php\" method=\"POST\" id=\"mainForm\">

<input id=\"uploadImage\" type=\"file\" accept=\"image/*\" name=\"image\" form=\"mainForm\" />
<input id=\"button\" type=\"submit\" value=\"Upload\" form=\"mainForm\" >


<div id=\"results\"></div>
<img style=\"display:none\" id=\"loader\" src=\"loader.gif\" alt=\"Loading....\" title=\"Loading....\" />
</form>
<script>
$(\"#mainForm\").submit(function (event) {
event.preventDefault();
var data = new FormData($('#mainForm')[0]);
$.ajax({
type: \"POST\",
url: \"upload_recipe_images.php\",
data: data,
contentType: false,
processData: false,
beforeSend: function() {
$('#loader').show();
}
}).done(function (html) {
$(\"#results\").append(html);
$('#loader').hide();
$('#mainForm')[0].reset();
});
});
</script>";

А вот так не работает

Сообщение от :

print "<form enctype=\"multipart/form-data\" action=\"upload_recipe_images.php\" method=\"POST\" id=\"mainForm\">
</form>
<input id=\"uploadImage\" type=\"file\" accept=\"image/*\" name=\"image\" form=\"mainForm\" />
<input id=\"button\" type=\"submit\" value=\"Upload\" form=\"mainForm\" >


<div id=\"results\"></div>
<img style=\"display:none\" id=\"loader\" src=\"loader.gif\" alt=\"Loading....\" title=\"Loading....\" />

<script>
$(\"#mainForm\").submit(function (event) {
event.preventDefault();
var data = new FormData($('#mainForm')[0]);
$.ajax({
type: \"POST\",
url: \"upload_recipe_images.php\",
data: data,
contentType: false,
processData: false,
beforeSend: function() {
$('#loader').show();
}
}).done(function (html) {
$(\"#results\").append(html);
$('#loader').hide();
$('#mainForm')[0].reset();
});
});
</script>";

В чем причина?
anadonam 19:26 16.10.2014
Eвгений, думал думал , не смог придумать задачи где необходима форма в форме
Eвгений 19:30 16.10.2014
anadonam,
А думать не надо, надо читать топикстартера

Сообщение от :
Для чего? Ну есть основная форма, внутри которой форма для загрузки фотографий.

К примеру на сайте есть статьи с пошаговыми фотографиями. И есть страничка, которая позволяет пользователю добавить статью и фотографии. Вписываешь информацию в текстовые поля, а дальше грузишь одну или несколько фотографий.
anadonam 19:34 16.10.2014
вот и подумал , зачем загрузку фотографий делать отдельной формой ?
ведь тут всего лишь заполняется данными элемент формы



а вариант не работать может так как у тебя браузер не попадает в перечень работающих с этим вариантом - ну к примеру
Internet Explorer 10 Chrome 9 Opera 10 Safari 5 Firefox 4 Android iOS
Eвгений 19:50 16.10.2014
вообще да... как выяснилось в IE это не работает в принципе. У меня 11 версия.

Сообщение от :
ведь тут всего лишь заполняется данными элемент формы

Я хочу сделать по модному - заполняешь текстовые поля. Дальше пиктограмка примерно 100x100 px, изображающая рамку для будущей картинки. Кликаешь на эту пиктограмку, открывается окно выбора файла с диска, выбираешь файл, картинка грузится, на сервере создается ее мелкая копия (100x100) и возвращается в то поле, на которое кликали.
Это гибрид ЭТОГО и ЭТОГО, то есть как реализовать это я не спрашиваю.

Проблема в том, что когда комбинируешь загрузку картинок с текстовыми полями, отправка которых на сервер осуществляется другой, "окончательной" кнопкой, тэги FORM нельзя сделать невложенными. Если кто знает как - подскажите.

Или может я чего подзабыл - я 7 лет уже не занимаюсь вэбом.
silly 20:59 16.10.2014

Сообщение от Eвгений:
В чем причина?

$('#mainForm')[0] ничего не возвращает во втором случае.

P.S. Очень, очень развесистый print.
Eвгений 21:37 16.10.2014
silly,
неправда ваша.
Не вызывается $(\"#mainForm\").submit(function (event)
Я добавил в начало функции аlert, во втором случае он просто не срабатывает.
silly 21:53 16.10.2014

Сообщение от Eвгений:
неправда ваша.

Я не утверждал, что это единственная ошибка…

Сообщение от Eвгений:
Не вызывается $(\"#mainForm\").submit(function (event)
Я добавил в начало функции аlert, во втором случае он просто не срабатывает.

В $(function({ … })) попробуй обернуть.
Eвгений 18:11 18.10.2014
Практически решил проблему, нашел как создать динамическую форму.

Только вот не могу запрос AJAX под новое решение адаптировать.
Данные (картинка для загрузки) в AJAX передаются так:

Сообщение от :
var data = new FormData($('#mainForm')[0]);
$.ajax({
type: \"POST\",
url: \"upload_recipe_images.php\",
data: data,
......

А к элементу INPUT динамической формы можно добраться так: e.childNodes[1]
По крайней мере alert(e.childNodes[1].id) выдает правильное имя.

Простая замена $('#mainForm')[0] на e.childNodes[1] результата не дает. Как правильно сделать?
Eвгений 20:14 18.10.2014
Проблема решена ( почти))) ).
Serezhka 20:35 18.10.2014
Автор, а что если тебе в качестве события использовать не отправку формы, а клик по кнопке

Сообщение от :
$(\"#button\").click(function (event) {
вместо
$(\"#mainForm\").submit(function (event) {

и в обращении к серверу использовать не данные формы, а данные конкретного инпута:

Сообщение от :
var data = new FormData($('#uploadImage'));
вместо
var data = new FormData($('#mainForm')[0]);

Что получится?
Eвгений 00:25 19.10.2014
Serezhka,
не работает так как ты указал.
Вот это

Сообщение от :
var data = new FormData($('#uploadImage'));

не работает
То есть скрипт вызывается и выполняется, но скрипту обработчику AJAX запроса попадает лажа.

Пока что у меня работает следующее - сделал основную форму динамической, а ту, где AJAX загрузка картинки, обычную, тэгом <form>.
Eвгений 01:09 19.10.2014
В общем вышло то что я и хотел - никаких полей никаких кнопок загрузить - есть картинка с изображением папки, жмешь на нее, открывается диалог выбора файла, как только файл выбирается, автоматом грузится на сервер, а с сервера приходит его уменьшенная копия, которая вставляется вместо иконки с папкой. То есть, куда нажал, там и получил картинку:

Сообщение от :
<td id=\"wrapper2\">

<form enctype=\"multipart/form-data\" action=\"upload_recipe_images.php\" method=\"POST\" id=\"mainForm\">
<input id=\"button\" style=\"display:none\" type=\"submit\" value=\"Upload\">
<input style=\"display:none\" type=\"file\" accept=\"image/*\" name=\"image\" id=\"uploadImage\" onchange=\"button.click()\" />
<div id=\"results\"><img src=images/folder.jpg border=4 width=150 height=200 onclick=\"uploadImage.click()\"/></div>
</form>


<script>
$(\"#mainForm\").submit(function (event) {
event.preventDefault();
var data = new FormData($('#mainForm')[0]);
$.ajax({
type: \"POST\",
url: \"upload_recipe_images.php\",
data: data,
contentType: false,
processData: false,
beforeSend: function() {
$('#loader').show();
}
}).done(function (html) {
$(\"#results\").empty();
$(\"#results\").append(html);
$('#loader').hide();
$('#mainForm')[0].reset();
});
});
</script>
</td>

Вопрос - а нельзя ли как-нить вообще выкинуть тэг FORM ?
Ну или как вариант, сделать так чтобы по выбору файла не жалась невидимая кнопка, а сразу отправлялась форма? onclick="mainForm.submit()" - работает неправильно, скрипт не ловит событие submit и upload_recipe_images.php вызывается самостоятельно
Eвгений 18:23 21.10.2014
Продолжаю мучить вопросами (предыдущий решен)

Сообщение от :
<input onclick="alert('click')" style="display:none" type="file" accept="image/*" name="image" id="uploadImage" onchange="this.parentNode.parentNode.childNodes[1].childNodes[1].click()" />
<div class="results" onclick="this.parentNode.parentNode.childNodes[1].childNodes[3].click()"><img class="grow pic" src=images/folder.jpg border=4 width=150 height=200 /></div>

Когда я нажимаю на картинку, помещенную в тэг DIV, должен открываться диалог выбора файла (id инпута - uploadImage). Открывается она программным кликом -

Сообщение от :
onclick="this.parentNode.parentNode.childNodes[1].childNodes[3].click()"

в IE все работает. В Google Chrome ничего не открывается, но клик клик инпутом отслеживается (я для диагностики вставил onclick="alert('click')" )
Немаловажная деталь - этот инпут скрыт : style="display:none"
Если я убираю style="display:none", то диалог выбора файла при нажатии на картинку открывается.
Что делать?
Serezhka 23:06 21.10.2014
Eвгений, ты очень мощно намутил.
Тебе проще через CSS сделать скрытый инпут поверх этой картинки, размером с эту картинку.
Чтобы чел тыкая в картинку попадал просто по инпуту. Тогда тебе этой жесточайшей конструкции из parentNode и прочего не понадобится.
Eвгений 06:12 22.10.2014
Serezhka,

Сообщение от :
Чтобы чел тыкая в картинку попадал просто по инпуту. Тогда тебе этой жесточайшей конструкции из parentNode и прочего не понадобится.

Жесточайшая конструкция оправдана и от нее никуда не денешься.
У меня динамическое создание элементов для ввода картинок. То есть нажал кнопку - появились еще инпуты, нажал другую кнопку, инпуты удалились.
Вначале у меня вновь добавленные инпуты и формы получали id с номерами. Пришлось вносить в AJAX запрос изменения, чтобы он понимал, какая форма его вызвала и результат отправлял в соответствующую форму. Но когда я стал делать кнопки для удаления элементов ввода картинки, пришлось предусматривать пересчет номеров идентификаторов для соранения непрерывной нумерации. Поняв, какая каша получится, я решил уйти от id (если их в приведенном коде удалить, элементы останутся работоспособными) и оперировать исключительно с элементами дерева, возложив задачу по получению ссылок на элементы на javascript. Код стал проще в разы.

Спасибо за внимание к проблеме и альтернативное предложение, но оно не подойдет.

В настоящее время суть проблемы сводится к вопросу - почему style="display:none" в google chrome делает неработоспособной input ? Я кстати упрощал код донельзя в отдельном файле для чистоты эксперимента - результат тот же.
sape 15:35 22.10.2014

Сообщение от Eвгений:
В настоящее время суть проблемы сводится к вопросу - почему style="display:none" в google chrome делает неработоспособной input ? Я кстати упрощал код донельзя в отдельном файле для чистоты эксперимента - результат тот же.

Можно посмотреть исходники хрома, а вообще вместо display: none можно вот так
position: absolute;
top: -100500px
А чё б не воспользоваться чем-то подобным https://github.com/blueimp/jQuery-File-Upload
1000w 16:41 22.10.2014

Сообщение от Eвгений:
В настоящее время суть проблемы сводится к вопросу - почему style="display:none" в google chrome делает неработоспособной input ? Я кстати упрощал код донельзя в отдельном файле для чистоты эксперимента - результат тот же.

что значит "неработоспособный"? http://jsfiddle.net/jkgmbq4c/1/ работает
Eвгений 16:44 22.10.2014

Сообщение от :
А чё б не воспользоваться чем-то подобным

Слишком уникально (не в хвастливом смысле, а в обычном) то, что я хочу получить. Просто что-то взять и переделать не получится.

Сообщение от :
top: -100500px

А нет риска, что поисковики воспримут это как попытку мухлежа и забанят? Ходили в сети байки, что если в display none очень много текста, то это настораживает google.
Eвгений 16:51 22.10.2014

Сообщение от 1000w:
что значит "неработоспособный"? http://jsfiddle.net/jkgmbq4c/1/ работает

Глаза открой, посты перечитай мои и мозг включи.
Ты проверил "отзывчивость" инпута на клик.
Я об этом уже писал:

Сообщение от :
но клик клик инпутом отслеживается (я для диагностики вставил onclick="alert('click')" )

Но ты постишь такой же пример, где проверяешь работоспособность алертом.
А я под работоспособностью понимаю еще и открытие диалога для выбора файла при нажатии на инпут. И в IE и в Chrome это работает, но если добавить display:none, Google Chrome не открывает диалог.

Так что переделай свой пример и мы посмотрим.
1000w 17:08 22.10.2014

Сообщение от Eвгений:
Глаза открой, посты перечитай мои и мозг включи.

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

Подрочи себе сам.
sape 17:15 22.10.2014
Дерзкий однако, ну пусть своим временем расплачивается, возможно потом получится сделать и нечереззад.
Eвгений 17:25 22.10.2014
1000w,

Сообщение от :
я честно сделал попытку разобраться в твоей писанине,

Ты называешь это честной попыткой? Не удосужившись даже почитать, ЧТО Я УЖЕ СДЕЛАЛ на пути к решению проблемы, ты мне пихаешь код явно не по теме, со словами из серии "а кули тут разбираться?"
Я не дерзкий, я всегда так общаюсь с теми, кто НЕ ЧИТАЕТ. Что ты не прочитал, я уже тебе показал.


Сообщение от :
поэтому ты мне в хyй не вперся читать твои ебaнутые посты.

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

Сообщение от :
ты мне в хyй не вперся

У тебя ***ми пёздами и херами не только голова пропитана, но и код, который ты сочиняешь, в чем я убедился, пройдя по твоей ссылке.

Сообщение от :
нечереззад.

Ведь спроси тебя, что тут через зад - ты ведь за свои слова не ответишь? Или ляпнешь что не по делу.

Сообщение от :
возможно потом получится сделать

А я ведь сделаю, и выложу здесь результат. И почему-то кажется, что решение очень простое, просто я подзабыл или вообще не знал. Но я любитель. А тебе не стыдно будет потом?
Вверх