|
|
|
|
|
для: Slo_Nik
(23.11.2009 в 00:52)
| | Посетил рекомендованые сайты, посмотрел, почитал, попытался разобраться и ... зашёл в тупик, прошу помощи.
попытался использовать технологию аякс, асинхронные запросы, вроде в чём то разобрался, но до конца додумать не смог.
решил начатьс малого, проверка кода каптчи на стороне сервера, вот код, как это я себе представляю
<html>
<head>
<script type="text/javascript">
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
</script>
</head>
<body>
<?php
error_reporting(E_ALL);
if(!empty($_POST)){
print_r($_POST);
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){
echo "Верный код каптчи.";
}
else{
echo "Не верный код каптчи. ".$_POST['keystring'];
}
}
?>
<script type="text/javascript">
// проверка каптчи
function test(form){
if(form.elements[3].name == "keystring" && form.elements[3].value != ""){
var ans = getXmlHttp();
var statElem = document.getElementById('err');
var param = form.elements[3].value;
ans.onreadystatechange=function(){
if(ans.readyState == 4){
/*statElem.innerHTML = ans.statusText;*/
if(ans.status == 200){
/*alert('Ответ :'+ans.responseText);*/
statElem.innerHTML = "Не верный код каптчи.";
document.getElementById('img').src="kcaptcha/index.php?<?php echo session_name()?>=<?php echo session_id()?>"+Math.random();
}
}
}
ans.open('POST','upfile.php',true);
ans.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
ans.send(param);
statElem.innerHTML = "...Идёт загрузка...";
}
else{
document.getElementById('err').innerHTML = "Не заполнено поле антиспамкода.";
return false;
}
return true;
form.submit();
}
</script>
<!-- Вывод сообщений о незаполненый полях и не верном коде каптчи -->
<div id="err" class="div" style="color:#f00; font-style:italic;"></div>
<form name="mailForm" method="post">
Имя : <input type="text" name="name"><br>
E-mail : <input type="text" name="email"><br>
Текст : <textarea name="text" cols="15" rows="5"></textarea><br>
Спамкод : <input type="text" name="keystring"><br>
<input type="button" onClick="return test(this.form)" value="Отправить">
</form>
</body>
</html>
|
обработчик формы и сама форма распологаются в одном файле.
вроде бы и работает, но не так как хотелось бы.
если использовать в input type=submit onSubmit, то асинхронного запроса не получается, при проверке кода перегружается вся форма, а если делать так как я представил выше, то при правильном коде каптчи не идёт отправка на сервер, а всё равно пишет, что код каптчи не верный.
подскажите, пожалуйста, как сделать правильно работоспособный код?
заранее благодарю. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2009 в 05:30)
| | зашёл, буду изучать, спасибо. | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.11.2009 в 05:27)
| | Ну только двух submit мало, нужен механизм :) Зайдите на javascript.ru, очень полезные статьи там, с примерами. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2009 в 05:03)
| | конечно же я исходный код страницы посмотрел, увидел там два submit, из этого и исходил. | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.11.2009 в 04:43)
| | Ах вот что вы делаете. Ну тогда был бы резон посмотреть код майла, там AJAX используется, но коли вы всего три дня....
Можно и фреймом это сделать. На www.javascript.ru есть хорошие статьи подобного обмена клиента с сервером, зайдите, почитайте. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2009 в 04:28)
| | >Почему два фрейма?
если честно, то передрал пример и пытался переделать его под свои нужды, получилось пока не очень хорошо, т.к. js учу только третий день, до многого пока в учебнике не дочитал, а начал я его читать сначала :):):) , да и издание старенькое.
так что уж звиняйте если вопросы покажутся Вам глупыми...
>Это ведь можно проверить в одном обработчике? Зачем куча кнопок submit?
пытаюсь сделать подобие как на mail.ru при отправке почты с вложением, там сначала загружается изображение, как я понял.
вот мне и надо, что бы можно было загрузить сначала изображение, а потом уже отправлять информацию с формы, прикрепив изображение.
может я не так понимаю процесс, подскажите как правильно это делается, пожалуйста. | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.11.2009 в 04:17)
| | Зачем по нескольку раз отправлять каждый пункт формы?
Вы выдаете пользователю форму, в которой есть условие на заполнение обязательных полей. Пользователь заполняет (или не заполняет) и отправляет ее. У формы есть событие onsubmit, в котором и начинаем проверку:
1. Все ли обязательные поля заполнены? Если нет, возврат. Если пользователь подправит скрипт, и все таки отправит ее пустой, то эту же проверку необходимо делать на сервере.
2. Если все поля заполнены, проверяем корректность ввода. Если адрес введен не корректно, возврат. Аналогично, если подправили и отослали, то проверяем адрес и на сервере.
3. Все поля заполнены и корректно. Идет отправка, выдаем сообщение. Сервер проверяет данные, включая загрузку изображения (если оно было).
4. Если есть ошибки возвращаем форму назад, с заполненными данными (исключая поле ввода изображения, если оно удачно загружено, ну, или, либо заставляем опять выбирать его, игнорируя удачную загрузку), для работы над ошибками.
Это ведь можно проверить в одном обработчике? Зачем куча кнопок submit?
getElementById() будет корректно работать во всех браузерах, это и используйте. | |
|
|
|
|
|
|
|
для: sim5
(24.11.2009 в 04:02)
| | Проверку каптчи я уже удалил.
по поводу единого обработчика не понял, можно чуть подробней объяснить?
>document.all коллекция только для IE.
Вы имели ввиду вот это
document.all.err.innerHTML = "......"; ?
тогда как будет правильно для остальных браузеров прописать? | |
|
|
|
|
|
|
|
для: Slo_Nik
(23.11.2009 в 23:00)
| |
<form name="mailForm" action="upfile.php" method="post" TARGET="hiddenframe"
enctype="multipart/form-data" ONSUBMIT="здесь можно единым обработчиком все обрабатывать">
|
Это не для проверки, это для ввода:
<input type="text" name="keystring">
|
и это к нему, удалить:
// проверка кода каптчи
if(name == "keystring" && value != ""){
if(ses != "" && ses != value){
document.all.err.innerHTML = "Введён не верный код.";
return false;
}
}
|
Почему два фрейма?
<iframe id="hiddenframe" name="hiddenframe" style="width:0; height:0; border:0"></iframe>
document.all коллекция только для IE. | |
|
|
|
|
|
|
|
для: Slo_Nik
(23.11.2009 в 00:52)
| | так и ни кто не может помочь? | |
|
|
|
|