[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передача параметров на новую страницу
sergeiss
Помогите понять некоторые основы, плз smile.gif

Вот была у меня форма, данные с которой отправлялись после нажатия кнопки типа submit, принимались далее через POST. Но решил я сделать проверку отправляемых данных с помощью события OnCheck (заодно и начал JS изучать:)). Изменил типа кнопки с submit на button, сделал функцию для проверки, которую повесил на OnClick.
Всё работает как часы, данные проверяются. Если есть ошибки (например, во введенных данных конечная дата меньше начальной даты), то пользователь получает уведомление об этом и может внести коррективы.
Но вот дальше-то как отправить подготовленные данные, когда они корректны? Тип кнопки уже не submit, "на автомате" ничего не отправляется!

Как тут быть, подскажите!



Спустя 39 минут, 55 секунд (8.07.2008 - 09:44) AndryG написал(а):
верните submit. На onClick вешаете функцию ... если она вернет FALSE - отправка не произойдет :-) TRUE - пойдет.

Как второй вариант ... (сам не пробовал) window.document.location = кнопка.form.action; return true; ну или типа такого должно быть

точно так же на любую ссылку можно вешать обработчики и "отменять" переход.

Спустя 16 минут, 29 секунд (8.07.2008 - 10:01) sergeiss написал(а):
Цитата(AndryG @ 8.7.2008, 10:44) [snapback]42589[/snapback]
верните submit. На onClick вешаете функцию ... если она вернет FALSE - отправка не произойдет :-) TRUE - пойдет.

Попробовал... Не помогло sad.gif Проверял и в ИЭ, и в Опере.

Вот полный текст, который я пытаюсь заставить работать:
Код
<body>
<?php

echo "POSTs:<br>";

foreach( $_POST as $k => $val )
{
echo "POST['$k']=$val<br>";
}

echo "POSTs ended.<br>";
?>

<form id="form1" name="form1" method="post" action="">
<input name="date1" type="text" value="2008-07-01" size="16" />
<input name="date2" type="text" value="2008-07-04" size="16" />
<br />

<input name="tst" type="submit" value="Проверить" OnClick="check_date( date1.value, date2.value )" ); />
</form>


<script>
<!--
function check_date( a, b )
{
var d1=new Date( a );
var d2=new Date( b );

if( d1 > d2 )
{
alert( "Начальная дата '"+d1+"' не может быть больше конечной даты '"+d2+"'!" );
return false;
}
else
{
alert( "Введены правильные даты." );
}
return true;
}

-->
</script>

</body>

Если я ввожу начальную дату больше, чем конечную, то получаю окно с сообщением о том, что надо скорректировать данные... И страница все равно перезагружается! Это видно по контрольной распечатке $_POST.
То есть, submit не отменяется.


Цитата(AndryG @ 8.7.2008, 10:44) [snapback]42589[/snapback]
Как второй вариант ... (сам не пробовал) window.document.location = кнопка.form.action; return true; ну или типа такого должно быть

точно так же на любую ссылку можно вешать обработчики и "отменять" переход.

Не совсем понял...

Спустя 16 минут, 35 секунд (8.07.2008 - 10:18) linedmk написал(а):
Сделайте как написал AndryG - верните кнопку отправить, но ставить функцию проверки лучше так

Код
<form ... onSubmit="return Функция()">

Дело в том что если есть текстовое поле input то при нажатии в нем Энтера форма отправиться, а такой вариант полюбому будет проверять. Соответственно Функция() должна возращать false (форма не отправитсо) или true (форма отправитсо).
Отправить форму можно также
Код
объект_формы.submit();

Спустя 1 час, 49 минут, 3 секунды (8.07.2008 - 12:07) sergeiss написал(а):
Цитата(linedmk @ 8.7.2008, 11:18) [snapback]42594[/snapback]
Сделайте как написал AndryG - верните кнопку отправить, но ставить функцию проверки лучше так

Код
<form ... onSubmit="return Функция()">

Дело в том что если есть текстовое поле input то при нажатии в нем Энтера форма отправиться, а такой вариант полюбому будет проверять. Соответственно Функция() должна возращать false (форма не отправитсо) или true (форма отправитсо).

Чегой-то не получается... Проверка проходит (вижу алерты, показываются корректно), но все равно идет отправка формы, даже если возвращается false из функции check_date sad.gif
Код
<form id="form1" name="form1" method="post" action="" onsubmit="check_date( date1.value, date2.value )">
<input name="date1" type="text" value="2008-07-01" size="16" />
<input name="date2" type="text" value="2008-07-04" size="16" />
<br />

<input name="tst" type="submit" value="Отправить" />
</form>


<script>
<!--
function check_date( a, b )
{
var d1=new Date( a );
var d2=new Date( b );

if( d1 > d2 )
{
alert( "Начальная дата '"+d1+"' не может быть больше конечной даты '"+d2+"'!" );
return false;
}
else
alert( "Введены правильные даты." );

return true;
}

-->
</script>


Похоже, чего-то я не так делаю smile.gif Вот только бы понять до конца, что именно. Вроде бы, только совковая лопата проще этого кода... А не работает почему-то.

Спустя 12 минут, 5 секунд (8.07.2008 - 12:19) linedmk написал(а):
В наличие
Код
onsubmit="check_date( date1.value, date2.value )"

нуно
Код
onsubmit="return check_date( date1.value, date2.value )"

Спустя 32 минуты, 43 секунды (8.07.2008 - 12:51) sergeiss написал(а):
Цитата(linedmk @ 8.7.2008, 13:19) [snapback]42625[/snapback]
В наличие
Код
onsubmit="check_date( date1.value, date2.value )"

нуно
Код
onsubmit="return check_date( date1.value, date2.value )"

Спасибо, заработало! clapping.gif Это круче, чем классическое "Hello, world!" acute.gif

Пошел я дальше читать умные книги.

Спустя 2 часа, 17 минут, 34 секунды (8.07.2008 - 15:09) sergeiss написал(а):
Сорри... Все равно проблема осталась.

Загружаю страницу - и при первой попытке ничего не получается sad.gif Не вхожу в функцию check_date. После того, как я ввел данные и нажал клавишу Энтер (или кнопку Отправить), то происходит перезагрузка, будто бы никаких проверок нету. И данные могут быть переданы некорректные sad.gif Зато потом я могу вводить всё, что угодно: работает "как часы". Все проверки проводятся. Только мне-то надо с первого захода чтобы работало "как часы".

Эта проблема проявляется в Опере. В ИЭ проверка проводится с первой попытки. Но в ИЭ проверка некорректна... А в Опере хоть и со второго захода, но всё верно сравнивается.

ИЭ говорит, что обе величины (d1 и d2) имеют величину NaN. Хотя Опера этого не говорит...

И чего делать? Проверка такая на самом деле нужна, а не теоретически.

Спустя 4 часа, 4 минуты, 17 секунд (8.07.2008 - 19:13) linedmk написал(а):
Ну во-первых не совсем корректно писать
Код
<form id="form1" name="form1" method="post" action="" onsubmit="return check_date( date1.value, date2.value )">

правильнее будет
Код
<form id="form1" name="form1" method="post" action="" onsubmit="return check_date( this.date1.value, this.date2.value )">

Во-вторых дата. Я не делал подобных проверок, но помоему не правильно делать
var d1=new Date( a ); то есть var d1=new Date( 2008-07-01);
К тому же не делаеш проверки на корректность , а если пользователь напишет что-то "абракадабра",
Да и вообще помоему так не правильно делать.
Покрайне мере переведи их в формат timestamp, так
t1=d1.getTime()

Спустя 14 часов, 30 минут, 31 секунда (9.07.2008 - 09:44) sergeiss написал(а):
Переделал функцию для целых чисел, работает нормально. Теперь разбираюсь, как сделать это же для даты...

А может кто подскажет, где бы в сети найти нечто типа хорошего хэлпа по JS? Чтобы на своем компе смотреть, без подключения к сети??? Книжки - это хорошо, но хороший электронный справочник - это еще лучше.

2 lintdmk: проверок никаких нету, потому что это пока только мой "учебный" код. И никто, кроме меня, тут ничего ввести не может.

Спустя 40 минут, 18 секунд (9.07.2008 - 10:24) sergeiss написал(а):
22 притопа, 33 прихлопа + танцы с бубном вокруг компа... В итоге сделал так, что и Опера, и ИЭ однозначно понимают, что же я хочу smile.gif

Далее код, который у меня работает. Вопрос: можно ли его упростить (алерты не рассматриваю) или уже проще некуда?

Даты вводятся в формате YYYY-MM-DD

Код
<script>

function check_date( a, b )
{
alert( "Проверка связи : "+a.substring( 0, 4)+"-"+a.substring( 5, 7)+"-"+a.substring( 8, 10)+", "+
b.substring( 0, 4)+"-"+b.substring( 5, 7)+"-"+b.substring( 8, 10) );

var d1=new Date( );
d1.setYear( parseInt( a.substring( 0, 4) ) );
d1.setMonth( parseInt( a.substring( 5, 7) )-1 );
d1.setDate( parseInt( a.substring( 8, 10) ) );

var d2=new Date( );
d2.setYear( parseInt( b.substring( 0, 4) ) );
d2.setMonth( parseInt( b.substring( 5, 7) )-1 );
d2.setDate( parseInt( b.substring( 8, 10) ) );

if( d1 > d2 )
{
alert( "Первое число '"+d1+"' не может быть больше второго числа '"+d2+"'! Повторите ввод" );
return false;
}

alert( "Первое число '"+d1+"', второе число '"+d2 +"'");
return true;
}


</script>


PS. (крик души) И какой извращенец считает месяцы от нуля, а дни месяца от единицы??? И у substring параметры извратные до безобразия smile.gif

Спустя 1 день, 22 часа, 58 минут, 46 секунд (11.07.2008 - 09:23) sergeiss написал(а):
Если эту тему будет читать кто-то из начинающих кодить на ДжаваСкриптах, обратите внимание на то, что в функции parseInt в данной ситуации надо добавить второй аргумент, равный 10. Иначе - строки '08' И '09' воспринимаются как некорректно введенные восьмеричные числа... В итоге ошибку не получаю, а некорректно работает сам алгоритм.

Спустя 27 дней, 15 часов, 11 минут, 37 секунд (9.08.2008 - 00:34) zona7o написал(а):
по сабжу собственно - самое начало:
Цитата
if( d1 > d2 )
{
alert( "Начальная дата '"+d1+"' не может быть больше конечной даты '"+d2+"'!" );
return false;
}
else
{
alert( "Введены правильные даты." );
}
return true;

видишь return true - находится вне блока else.
то есть должно было быть:
Код
else
{
alert("все ништяк");
return true;
}

Спустя 2 дня, 8 часов, 56 минут, 6 секунд (11.08.2008 - 09:31) sergeiss написал(а):
zona7o - можно и так, но вовсе не обязательно. Тут можно было вообще убрать else smile.gif
А у меня вообще давняя привычка - в функции с возвратом параметров хотя бы один return должен быть вне всяких блоков. Иначе, при модификации функции можно получить "грабли". Так что это не ошибка, а сознательные действия.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.