Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 22.10.2019, 09:04
Интересующийся
Отправить личное сообщение для joyandjoy Посмотреть профиль Найти все сообщения от joyandjoy
 
Регистрация: 21.10.2019
Сообщений: 19

Ошибку понял. Но как сделать проверку посредством jqery? как обратиться к файлу с ответом от капчи и при верном условии, форму отправить?
Ответить с цитированием
  #12 (permalink)  
Старый 22.10.2019, 09:13
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,174

Делать отдельный запрос для проверки каптчи, при этом не обязательно код каптчи должен быть отдельным файлом, ибо имя у поля каптчи, а это ключ на сервере, свое, значит даже расположив в одном файле прием запроса каптчи и запрос формы, по имени ключа в запросе можно определить что интересует клиента.
Нужно только выполнить два обязательных условия:
1) Обработка асинхронных запросов клиента должна быть в самом начале файле, а при работе с сессией после ее продолжения.
2) Код обработки запроса должен заканчиваться завершением работы скрипта функцией exit. Ответ клиенту при этом может быть аргументом данной функции, если ответ это строка, которая будет выведена в браузер. Если этой функции передать число, то это будет принято как код завершения и вывода в браузер не будет.
Ответить с цитированием
  #13 (permalink)  
Старый 22.10.2019, 12:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,174

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

1) Согласно условиям ранее оговоренным:

<?
session_start();
//обработка запросов
if($_POST) {
    switch($k = key($_POST)) {
        case 'check': $out = $_SESSION['check']==(int)$_POST[$k] ? '' : 'Завтра в школу с родителями!';
        break;
        case 'text': $out = 'Ok';
    }
    exit($out);    
}
//каптча
$a = ['+','-','*'];
shuffle($a);
$check = rand(1, 10) . $a[0] . rand(1, 10);
eval('$_SESSION[check]='.$check.';');
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
    $('button').click(function() {
        $.post(location, {check: $(this).prev().val()}, function(d) {
            if(!d) $('form').submit();
            else alert(d);
        })
    });
    
    $('form').submit(function(e) {
        e.preventDefault();
        $.post(location, $(this).serialize(), function(d) {
            alert(d)
        })    
    });
});
</script>
</head>
<body>
<form>
<input name="text" value="Text" />
</form>
<span>Сколько: <?=$check?>=?</span>
<input name="check" />
<button>Проверка</button>
</body>
</html>


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

2) Генерация каптчи функцией и обмен с сервером в формате JSON.

<?
session_start();
//каптча
function check() {
    $a = ['+','-','*'];
    shuffle($a);
    $check = rand(1, 10) . $a[0] . rand(1, 10);
    eval('$_SESSION[check]='.$check.';');
    return $check;
}
//обработка запросов
if($_POST) {
    switch($k = key($_POST)) {
        case 'check': $out = $_SESSION['check']==(int)$_POST[$k] ? '' : ['err'=>1, 'exp'=>check(), 'msg'=>'Двойка! Завтра в школу с родителями!'];
        break;
        case 'text': $out = ['exp'=>check(), 'msg'=>'Ok!'];
    }
    exit(json_encode($out));    
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
    $('button').click(function() {
        var f = $(this).prev();
        $.post(location, {check: f.val()}, function(d) {
            if(!d.err) $('form').submit();
            else {
                $('span').text(d.exp);
                f.val('');
                alert(d.msg);
            }
        }, 'json')
    });
    
    $('form').submit(function(e) {
        e.preventDefault();
        $.post(location, $(this).serialize(), function(d) {
            $('span').text(d.exp);
            $('[name="check"]').val('');
            alert(d.msg);
        }, 'json')    
    });    
});
</script>
</head>
<body>
<form>
<input name="text" value="Text" />
</form>
<label>Сколько: <span><?=check()?></span>=?</label>
<input name="check" />
<button>Проверка</button>
</body>
</html>
Ответить с цитированием
  #14 (permalink)  
Старый 22.10.2019, 13:13
Интересующийся
Отправить личное сообщение для joyandjoy Посмотреть профиль Найти все сообщения от joyandjoy
 
Регистрация: 21.10.2019
Сообщений: 19

Однако казалось легче изначально
Обманчивая и страшная штука этот JS.
Пойду экспериментировать.
Цитата:
Но при таком решении затруднительно обновлять каптчу при ошибках и после приема формы. Но достаточно генерацию каптчи сделать функцией
В желаемом мной варианте как раз таки она и в виде функции как я понимаю.
Ответить с цитированием
  #15 (permalink)  
Старый 22.10.2019, 13:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 11,174

Сообщение от joyandjoy
В желаемом мной варианте как раз таки она и в виде функции как я понимаю
Не видно такого, да и вообще функция это не самоцель. Если каптчу будет использовать только эта страница, можно ее там и прописать, но если множество разных страниц, то это должно быть либо отдельным файлом, либо функцией в подключаемом файле.

И у вас проблемы прежде всего в этом, в структуре кода вашего, а не в JS.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка данных формы. Как выглядит структура метода с AJAX (по JQuery)? Coriolan161 AJAX и COMET 5 24.11.2015 20:17
проверка формы не работает в ie begelme Javascript под браузер 6 13.08.2013 01:00
js + php отправка формы не работает kuzroman AJAX и COMET 2 28.12.2010 13:02
Проверка полей отправляемой формы. denisOgr jQuery 6 18.10.2010 19:40
Проверка и отправка данных из формы Катерина Общие вопросы Javascript 2 25.03.2010 16:56