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


Автор: Рейкин 1.6.2005, 00:14
Как сделать, чтобы Submit можно было нажать только однажды на странице. Как на этом форуме, например: нажал и неактивны больше кнопки.

Спасиб

Автор: Sardar 1.6.2005, 01:02
Ставим кнопку в disabled=true, снимаем сие дело по таймеру, если твой сервак/коннект проглючил и ничего не загрузил.
Код
<script type="text/javascript">
<!--
function disable_me(bt) {
  bt.disabled=true;
  window.setTimeout(function() {bt.disabled=false;}, 10000); //десять секунд
}
//-->
</script>
<button onclick="disable_me(this);">Test</button>

Автор: Рейкин 1.6.2005, 02:33
благодарю. простестю - отпишу.

Автор: Рейкин 1.6.2005, 03:35
Я посылаю форму методом post,

но после нажания ничего не происходит. Только кнопка становится "ненажимаемой", но форма не отсылается...
(должна перегрузиться страница с обработкой данных формы)

В чём проблема, подскажите.

Автор: Sardar 1.6.2005, 03:47
Покажи код, иначе не известно. Естественно что в своём коде я твою форму не отсылаю smile
Если это нужно, то не только выкладывай свой код, но и говори конкретней что ты сам не можешь сделать smile

Передай ссылку на форму, вызови метод submit().

Автор: Рейкин 1.6.2005, 05:22
go.php
Код

<form action="go.php" method=post>
<input name=aaa value="$aaa" type=hidden>
<input name=ddd value="$ddd" type=hidden>
<input name=ccc value="$ccc" type=hidden>
<input type="submit" value="go">
</form>


после изменений получилось так

go.php
Код

<script type="text/javascript">
<!--
function disable_me(bt) {
  bt.disabled=true;
  window.setTimeout(function() {bt.disabled=false;}, 10000); //десять секунд
}
//-->
</script>
<form action="go.php" method=post>
<input name=aaa value="$aaa" type=hidden>
<input name=ddd value="$ddd" type=hidden>
<input name=ccc value="$ccc" type=hidden>
<input type="submit" value="go" onclick="disable_me(this);">
</form>


вот есть процедура, которая обрабатывает данные формы до определённого момента. Эт всё работает.

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

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

И спасибо за скорые ответы.

Автор: o.s.a. 1.6.2005, 11:05
Рейкин, так тебе сначала нужно отправить данные с формы, а потом уже отключать кнопку:
Код

<script type="text/javascript">

function disable_me(bt) {
  document.form1.submit()
  bt.disabled=true;
  window.setTimeout(function() {bt.disabled=false;}, 10000); //десять секунд
}

</script>
<form name="form1" action="go.php" method=post>
<input name=aaa value="$aaa" type=hidden>
<input name=ddd value="$ddd" type=hidden>
<input name=ccc value="$ccc" type=hidden>
<input type="submit" value="go" onclick="disable_me(this);">
</form>

Автор: Рейкин 1.6.2005, 16:30
2-мя руками "за" smile

Как смогу проверить на сайте - отпишу.

Благодарю!

Автор: Sardar 1.6.2005, 18:59
Рейкин а не лучше ли было в сессиях тайм-флаг поставить?

Автор: Рейкин 1.6.2005, 19:19
Цитата(Sardar @ 1.6.2005, 18:59)
Рейкин а не лучше ли было в сессиях тайм-флаг поставить?

оппа, а это цельно решает мою проблему (описал выше)? алгоритм можно?

+инфо:
это онлайн игра. симуляция боя. удары, если конкретней.

Автор: Sardar 1.6.2005, 19:36
Ставим переменную в сессиях, проверяем её при запросе.
Код

$block_time_out=30;// переменная конфига, как долго держать блок кнопки в секундах
//.....


if(!isset($_SESSION['send_time_block'])||(time()-$_SESSION['send_time_block'])>$block_time_out) {
  //юзер жмёт в первый раз или прошло время больше чем $block_time_out
  //делаем что нибдуь полезное
  $_SESSION['send_time_block']=time();
} else {
  //юзер жмёт повторно кнопку, а минимальное время блока не прошло
  // его бы красиво отослать, а не просто die... ;-)

  //редирект(рефрешь) на страницу с результатами через 5 секунд
  die("Вы уже отослали инфо");
}

Автор: Рейкин 1.6.2005, 19:47
ясно.
я попробую, система интересная.

Автор: Рейкин 2.6.2005, 20:20
кнопка немеет, страница перегружается... и данные не передаются smile

М
 

Выписка из правил:
Цитата
13) Если Вы используете цитаты - не сочтите за труд сократить цитируемое место, не следует цитировать несколько страниц текста.


Автор: o.s.a. 2.6.2005, 20:43
Рейкин, очень интересно, я еще раз проверил и данные у меня прекрасно передаются,
но теперь я сам не понимаю смысл отключения кнопки: она отключается до отправки формы, но т.к. открывается эта же страница, то теперь кнопка опять работает. Так смысл ее было отключать?

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

Автор: Рейкин 3.6.2005, 01:53
Цитата
она отключается до отправки формы

это и есть цель. Замечен баг, когда нажимают "бесконечно" на кнопку, не давая странице перегрузиться. А PHP процедуры запускает постоянно. Поэтому шаг вроде один (однажды страница перезагрузилась, а действий десяток.
Блокируя нажатие кнопки повторно я частично решаю проблему.

Цитата
открывается эта же страница, то теперь кнопка опять работает. Так смысл ее было отключать?

чтобы дать возможность сделать новое действие (снова одноразовое).

Без скрипта - страница, ессно работает (перегружается с данными), а со скриптом - пустая страница.
Яссно - буду тестить, но всё же в чём загвоздка?
Я пытался играть с именем для <form> но не помогло.

smile


Автор: o.s.a. 3.6.2005, 04:50
теперь понятно зачем отключали кнопку smile

Цитата
Без скрипта - страница, ессно работает (перегружается с данными), а со скриптом - пустая страница.


Где же твой скрипт? У тебя он наверняка не такой как в примере?
Или возможно ты неправильно выводишь данные?
У тебя значение value поля ($aaa) - это переменная или просто строка "$aaa" ?

У меня вывод осуществляентся так (имена hidden-полей у меня изменены, и вывод с помошью PHP):
Код

<script type="text/javascript">
function disable_me(bt) {
  document.form1.submit()
  bt.disabled=true;
  window.setTimeout(function() {bt.disabled=false;}, 10000); //десять секунд
}
</script>
<form name="form1" action="test_1.php" method=post>
<input name=a value="$aaa" type=hidden>
<input name=d value="$ddd" type=hidden>
<input name=c value="$ccc" type=hidden>
<input type="submit" value="go" onclick="disable_me(this);">
</form>

<? echo  @$_POST['a']."<br>".@$_POST['d']."<br>".@$_POST['c']."<br>"; ?>

Автор: Рейкин 4.6.2005, 03:15
$aaa - переменная

код сам потестю, и отпишу.
o.s.a., Sardar - вам спасибо. Хочу дальше попробовать сам разобраться.

Автор: o.s.a. 4.6.2005, 05:07
Рейкин, ну так если переменная, то так не проканает
Код

<input name=a value="$aaa" type=hidden>

нужно
Код

<input name=a value="<?=$aaa?>" type=hidden>

Автор: Рейкин 4.6.2005, 16:24
Код

<script type=javascript>
function disable_me(bt) {
  document.sumbit2.submit()
  bt.disabled=true;
  window.setTimeout(function() {bt.disabled=false;}, 10000); //десять секунд
}
</script>
<?
if(para-para)
{
print "
                <table align=center border=0 cellpadding=4 cellspacing=4 width=600>
                    <tr>

                        <form name='submit2' action='go.php' method=post>
                        <input type=hidden name='step' value='$step'>
                        <input type=hidden name='idid' value='$idid'>
                        <input type=submit name='submit2' value='go' onclick=\"disable_me(this);\">
                        </form>
                        </td>
                        <td align=center>
                        <form action='out.php' method=post name='submit2'>
                        <input type=hidden name='step' value='$step'>
                        <input type=hidden name='idid' value='$idid'>
                        <input type=submit  name='submit2' value='out' onclick=\"disable_me(this);\">
                        </form>
                        </td>
                    </tr>
                                    
                </table>
                ";
}
?>


переменные вносятся посредством PHP
вот, собственно форма, которая работать должна. и без JS она работает(!). Почему не срабатывает она сейчас - непонятно, по крайнем мере мне.

Автор: o.s.a. 4.6.2005, 16:53
Рейкин, точно не уверен, но возможно из-за этого
Код

<script type=javascript>

нужно
Код

<script type="text/javascript">

или
Код

<script language="JavaScript">

Автор: Рейкин 4.6.2005, 22:00
попробовал оба варианта. Тот же эффект.

В связи с этим вопрос - изменяет ли что-то JS при передачи данных формой?
Ведь без него всё ОК (не считая уязвимости скрипта, что и хочу решить), а просто добавив JS у меня просто выводится пустая страница. И это я протестю, но жаль, ведь явно чувствуется влияние JS, а остальное менять... смысл?

Автор: Sardar 4.6.2005, 22:17
Что то я не пойму, у тебя 2 формы submit2 smile
Скинь ссылку на страницу, где увидеть все можно.

Автор: Рейкин 4.6.2005, 22:24
я пробовал и только одну форму переименовывать - то же самое.
И разве это существенно? ;) что выберится - то и сработает. Хотя это JS, могу ошибаться

www.basabas.com/game/ - в дуэлях.

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




Автор: Sardar 4.6.2005, 22:51
Цитата
И разве это существенно? ;) что выберится - то и сработает. Хотя это JS, могу ошибаться

Преставь себе, это существенно особенно если ты юзаешь древний способ обращения document.что_то. Ты наверное не задумывался что так ты кнопки и другие элементы по именам выбираешь smile

Выход, отсылаем форму как: bt.form.submit()

Автор: Рейкин 4.6.2005, 23:47
... теперь всё передаётся, а кнопка не "замирает"

Автор: Рейкин 5.6.2005, 03:47
сделал,
задал каждой форме своё имя и JS

Ещё раз спасибо!

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