Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как отправить форму несколько раз


Автор: Paradox 1.3.2004, 14:48
Код
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

Автор: Paradox 1.3.2004, 14:51
вот пример хтмл для которого не работает
Код
<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>

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

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

Автор: Alx 1.3.2004, 15:20
Код
<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;
}

Автор: Paradox 1.3.2004, 15:26
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;
}

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

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

Автор: Sardar 1.3.2004, 15:38
Цитата
можно поподробнее что тут делается и зачем ?

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

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

Автор: Alx 1.3.2004, 16:16
<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

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


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

Автор: Sardar 1.3.2004, 16:29
Цитата
1. а если action разный?

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

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

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

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

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

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

Автор: IZ@TOP 2.3.2004, 08:27
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.
За точность не ручаюсь, но суть я думаю ясна.

Автор: Sardar 2.3.2004, 17:00
Как я долго не извращался, вот сейчас фантазия разыгралась 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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)