Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отправить форму несколько раз, готове решение изврата 
:(
    Опции темы
Paradox
Дата 1.3.2004, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Код
function RecalcOrder() {
 var f_cnt=document.forms.length-1;
 for (var i=0;i<=f_cnt;i++) {
   if (document.forms[i].elements[0].value=='orderbasket')
    document.forms[i].submit();
 }
}

хочу перебрать все формы на странице, удовлетворяющие условию
Цитата
document.forms[i].elements[0].value=='orderbasket'
и выполнить для них,submit()
submit() отрабатывает только для последней формы, хотя форм, удовлетворяющих условию явно больше, это видно просто если смотреть хтмл тект
в чем проблема confused.gifconfused.gif


--------------------
---
PM MAIL WWW   Вверх
Paradox
Дата 1.3.2004, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



вот пример хтмл для которого не работает
Код
<FORM  METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="388">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="5" class="inp_basketcnt" TABINDEX="2">
</FORM>
<FORM  METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</FORM>



--------------------
---
PM MAIL WWW   Вверх
Sardar
Дата 1.3.2004, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Отправить несколько форм с одной страницы невозможно, есть варианты:
1) отправлять все одной формой - ИМXО лучший
2) отправлять формы по очереди через нульфрейм

Опиши подробней задачу - решим.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 1.3.2004, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



Код
<html>
<head>
<script>
function RecalcOrder()
{var f_cnt=document.forms.length-1;
for (var i=0;i<=f_cnt;i++)
{if (document.forms[i].elements[0].value=='orderbasket')
alert (document.forms[i].name)
}
}
</script>
</head>
<body onload="RecalcOrder()">
<FORM  METHOD="POST" name="1">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="388">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="5" class="inp_basketcnt" TABINDEX="2">
</FORM>
<FORM  METHOD="POST" name="2">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" name="3">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket1">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" name="4">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</FORM>


нормально выводит alert'ы - 1,2,4

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

<script>
function RecalcOrder()
{var f_cnt=document.forms.length-1;
for (var i=0;i<=f_cnt;i++)
{if (document.forms[i].elements[0].value=='orderbasket')
sendform(document.forms[i])
}
}
function sendform(forma)
{var formnameval = forma.elements[0].value;
var basketcodeval = forma.elements[1].value;
var basketcntval = forma.elements[2].value;
var urla=forma.action + "?formname=" + formnameval + "&basketcode=" + basketcodeval + "&basketcnt=" + basketcntval;
window.open (urla,"","");
window.close;
}


--------------------
PM MAIL WWW ICQ   Вверх
Paradox
Дата 1.3.2004, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



ALEXANDRO
Код
function sendform(forma)
{var formnameval = forma.elements[0].value;
var basketcodeval = forma.elements[1].value;
var basketcntval = forma.elements[2].value;
var urla=forma.action + "?formname=" + formnameval + "&basketcode=" + basketcodeval + "&basketcnt=" + basketcntval;
window.open (urla,"","");
window.close;
}

можно поподробнее что тут делается и зачем ?


--------------------
---
PM MAIL WWW   Вверх
Paradox
Дата 1.3.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Sardar
Цитата
2) отправлять формы по очереди через нульфрейм
можно поподробнее, что это такое и с чем его едят ?


--------------------
---
PM MAIL WWW   Вверх
Sardar
Дата 1.3.2004, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
можно поподробнее что тут делается и зачем ?

Отправляется форма методом GET вручную.
Цитата
можно поподробнее, что это такое и с чем его едят ?

Страничка поделена на два фрейма:
1) фрейм с контентом
2) фрейм в 0 пикселей - нульфрейм
В аттрибуте target формы указываем нульфрейм, тогда при отправке будет перезагружатся нульфрейм и давать сигнал главному фрейму. Главный фрейм получив сигнал отсылает следующую форму.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 1.3.2004, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



<script>
function RecalcOrder()
{var f_cnt=document.forms.length-1;
for (var i=0;i<=f_cnt;i++)
{if (document.forms[i].elements[0].value=='orderbasket')
sendform(document.forms[i])
}
}
function sendform(forma)
{var formnameval = forma.elements[0].value; // задаём в переменную значение полей в форме
var basketcodeval = forma.elements[1].value;
var basketcntval = forma.elements[2].value;
var urla=forma.action + "?formname=" + formnameval + "&basketcode=" + basketcodeval + "&basketcnt=" + basketcntval; // создаём переменную интернет адресом в котором в ручную записываем параметры
sendforma = window.open (urla,"",""); // открываем окно с этим адресом, данные отсылаются
sendforma.close(); // тут же закрываем окно
}
</script>

пардоньте, очень спешил, несколько ошибок наляпал. Воть так-то буит лучше! smile.gif


--------------------
PM MAIL WWW ICQ   Вверх
Alx
Дата 1.3.2004, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



Цитата
1) отправлять все одной формой - ИМXО лучший
2) отправлять формы по очереди через нульфрейм


1. а если action разный?
2. не стоит фреймы делать, отних одна морока! если только iframe, и то не знаю, стоит ли...


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 1.3.2004, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
1. а если action разный?

Тогда фреймы.
Цитата
2. не стоит фреймы делать, отних одна морока! если только iframe, и то не знаю, стоит ли...

Ну я не знаю чем тебе фреймы не нравятся. Вдруг надо отправить форму именно методом POST - файл например.
Цитата
sendforma = window.open (urla,"",""); // открываем окно с этим адресом, данные отсылаются

И практически все оболочки под ИЕ и другие браузеры будут прибивать этот popup.
Цитата
sendforma.close(); // тут же закрываем окно

А ты уверен что данные дойдут? Если запрос все таки дойдет, то сервак тут же прибьет скрипт, не дав ему отработать. Если страница PHP то можно использовать ignore_user_abort(true).


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Paradox
Дата 2.3.2004, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



ALEXANDRO все конечно хорошо, но никаких лишних окон открывать не хочется, да и не пропустит у меня начальство такое решение, к тому же Sardar прав, скрипт действительно убивается, поэтому хочется как-то подругому


--------------------
---
PM MAIL WWW   Вверх
Paradox
Дата 2.3.2004, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



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


--------------------
---
PM MAIL WWW   Вверх
IZ@TOP
Дата 2.3.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Paradox, все очень просто: пишем два скрипта. Один скрипт грузится в главную страницу, другой в фрейм (страница которая получает данные), все это происходит через iframe.

Цитата
---------- forms.html ------------
<body>
<script>
<!--
var FormsObject = Array();
var FormsCounter = 0;
function onCountForms() {
var f_cnt=document.forms.length-1;
for (var i=0;i<=f_cnt;i++) {
  if (document.forms[i].elements[0].value=='orderbasket')
  FormsObject[] = document.forms[i];
}
}

function NextSubmit() {
var sizeForms = FormsObject.length;
FormsObject[FormsCounter+1].submit();
}
// -->
</script>

<FORM  METHOD="POST" name="1" target="farme">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="388">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="5" class="inp_basketcnt" TABINDEX="2">
</FORM>
<FORM  METHOD="POST" name="2" target="frame">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" name="3" target="frame">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket1">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" name="4" target="frame">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</FORM>
<iframe hspace=0 vspace=0 frameborder=0 border=0 width=0 height=0 name="frame" src="job.php"></iframe>
</body>
А в job.php когда он прогружается выполняется повторение операции NextSubmit.
За точность не ручаюсь, но суть я думаю ясна.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Sardar
Дата 2.3.2004, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Как я долго не извращался, вот сейчас фантазия разыгралась biggrin.gif
Файл с формами: form.htm(php)
Код
<script language="Javascript" type="text/javascript">
<!--
var sending=false; //флаг - отсылаем данные
var sendforms=new Array(); //список всех форм удовлетворяющих условию
var currform=0; //индекс текущей формы
var getted=true; //флаг - данные приняты сервером
var lagd; //таймер - детектирование умершего сервера

function sendAllForms() {
if(sending) {alert("Form is now sending, wait a little time..."); return; }
var frm=document.getElementById('sendthread');
if(!frm) {alert("Internal error! No send frame..."); return; }
var ct=0;
for(var i=0;i<document.forms.length;i++) { //соберем все формы
 for(var j=0;j<document.forms[i].elements.length;j++) {
  if(document.forms[i].elements[j].type=='hidden'&&document.forms[i].elements[j].value=='orderbasket') {
    sendforms[ct++]=document.forms[i];
    document.forms[i].target=frm.name;
  }
 }
}
if(sendforms.length>0) {
 sending=true;
 currform=0;
 getted=true;
 window.setTimeout("sendNext();",20);
} else alert("No forms found!");
}

function sendNext() {
if(!sending||currform>=sendforms.length||!getted) return;
lagd=window.setTimeout("lagdetect()",10000); //установим watch dog 10 секунд
sendforms[currform].submit();
}

function gettingComplete() { //а это должен вызывать сервер
var msg; //скажем юзеру что мы делаем
if(document.getElementById&&(msg=document.getElementById('loadMsgs')))
  msg.innerHTML="Form: <b>"+(currform+1)+"</b> succesfully sended.";

getted=true;
if(currform+1<sendforms.length){
 currform++;
 window.setTimeout("sendNext();",20);
 window.clearTimeout(lagd); //убьем watch dog'
 } else {
  sending=false;
  alert("All forms are sended :)");
 }
}

function lagdetect() { //если сервак не отвечает
if(!document.getElementById('sendthread')) return;
//то спросим а не отослать ли форму сного
answ=window.confirm("Server: "+sendforms[currform].action+" don't response, form: "+currform+"\nTry again?");
if(sendforms[currform].action.indexOf('again')<0) {
 if(sendforms[currform].action.indexOf('?')<0) sendforms[currform].action+="?";
 else sendforms[currform].action+="&";
 sendforms[currform].action+="again=true";
}
//положительно - отсылаем сного
if(answ) window.setTimeout("sendNext();",20);
//отрицательно - забиваем на все
}
//-->
</script>
</head>
<body>
<FORM  METHOD="POST" target="frame" action="forms.php">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="388">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="5" class="inp_basketcnt" TABINDEX="2">
</FORM>
<FORM  METHOD="POST" target="frame" action="forms.php">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" target="frame" action="forms.php">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</form>
<FORM  METHOD="POST" target="frame" action="forms.php">
<INPUT TYPE="HIDDEN" NAME="formname" VALUE="orderbasket">
<INPUT TYPE="HIDDEN" NAME="basketcode" VALUE="391">
<INPUT TYPE="TEXT" NAME="basketcnt" VALUE="3" class="inp_basketcnt" TABINDEX="2">
</FORM>
<!-- через нульфрей отсылаем данные -->
<iframe id="sendthread" hspace=0 vspace=0 frameborder=0 border=0 width=0 height=0 name="frame" src="about:blank"></iframe>
<button onClick="sendAllForms()">Send it >>></button>
<div id="loadMsgs">&nbsp;</div>
</body>
</body>
</html>

Код скрипта forms.php может быть таким:
Код
<?php
//делаем что нибудь полезное
$fp=fopen("test.txt","r+");
flock($fp, LOCK_EX);
$ct=fread($fp,4000);
$ct++;
fseek($fp,0,SEEK_SET);
fwrite($fp,$ct);
fclose($fp);
sleep(3); //подождем что бы заметить эффект
?>
<html>
<head>
<!-- Вызов gettingComplete() обязателен -->
<script language="javascript" type="text/javascript">
if(typeof(parent.gettingComplete)=='function') {
 var tt="<?php echo isset($_GET['again'])? 'yes': 'no'?>";
 if(tt=='yes') alert("I'm sorry about that pause :).");
 parent.gettingComplete();
}
</script>
</head>
</html>

А теперь мое мнение: все эти извращенения не нужны, за исключением случаев когда надо отсылать несколько форм на разные серверы. В твоем случае мы отсылаем все на один сервер, почему бы не сделать это все в одной форме?

В английском я слаб, так что глаз может резать... smile.gif


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Paradox
Дата 4.3.2004, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



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


--------------------
---
PM MAIL WWW   Вверх
Sardar
Дата 5.3.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Если даные берутся из БД, то предполагаю что их много, а значит туева хуча форм, а значит все это отсылатся будет в десятки раз медленней(минуты) чем одной формой.
Цитата
разработку этого сайта начинал не я, и если я щас сделаю все в одной форме полетит много чего левого в логике работы сайта, поэтому мне проще отправить несколько форм, чем извращаться над одной и потом еще черт знает сколько править

А жаль, меня коробит если нужно соглашатся с чьей-нибудь тупостью. Но это вопрос третий smile.gif.



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.