Ajax Ваниль JS - ajax asyn c продолжается без ожидания readyState 4, статус 200 - PullRequest
0 голосов
/ 07 января 2020

TLDR: Я хотел бы дождаться выполнения первого запроса, прежде чем перейти к 2cnd et c.


Здравствуйте,

В настоящее время я работаю над страницей HotSpot. Пользователь должен ввести свой адрес электронной почты, и вуаля! он получает inte rnet доступ.

То, что SUPPOSED происходит в фоновом режиме, это когда пользователь вставляет свою электронную почту и нажимает send;

  1. и AJAX asyn c POST выполняется на маршрутизаторе с именем пользователя и паролем,

, затем страница js / html ожидает готовности ReadyState === 4 (DONE) ответ от роутера,

an AJAX asyn c POST выполняется на сервере в другой сети (для этого требуется, чтобы у пользователя было соединение inte rnet), который отправляет пользователям электронное письмо,

затем страница js / html ожидает ответа DONE

пользователь перенаправлен.

Вот в основном то, что должно произойти. На самом деле JS не ожидает готовности ReadyState === 4 и Status === 200. Когда пользователь нажимает кнопку Отправить, он сразу же перенаправляется.

Я не могу используйте JQuery, так как маршрутизатор (Mikrotik) использует $ для своих собственных целей.

После проверки сети с помощью инструмента F12 я вижу, что состояние POST to router имеет значение 200 и является с правильными параметрами (username = HSuser & password = SimpleUserPassword), и я вижу, что POST для сервера имеет статус 200, а также имеет правильные параметры (адрес электронной почты ie: Email = Ba% 40loo.ns).

Полагаю, мой JS код как-то не так, так как он не ждет.

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

Ниже приведен текущий код. Я также выложу предыдущую версию (которая также не работала) на случай, если кто-то сможет обнаружить проблему там.

Если кому-то понадобится какая-либо дополнительная информация, сообщите мне.

Спасибо Вы.


Редактировать 3. :

Я продолжал читать Переполнение стека и наткнулся на этот фрагмент информации . ..

Сервер отвечает за предоставление status, а пользовательский агент предоставляет readyState.

Это выполняется на стороне сервера автоматически или выполняется Мне нужно как-то это реализовать?


Редактировать 1. :

Я пробовал консольный журнал здесь

                if (xhr.readyState === DONE){

                    console.log("XHR1" + xhr.readyState);
                    console.log("XHR1" + xhr.status);

                    if (xhr.status === OK){

и здесь

                            if (xhr2.readyState === DONE){

                                console.log("XHR2" + xhr2.readyState);
                                console.log("XHR2" + xhr2.status);

                                if (xhr2.status === OK){    

и я получил только XHR1 (XHR14 и XHR1200), я ничего не получил от XHR2 .


Редактировать 2. :

Попытка замены onreadystatechange на onload все равно делает то же самое.


Текущий HTML код:

<!DOCTYPE html>
<html>
<head>
<meta content="text/html" />
<meta charset="utf-8" />

<title>HotSpot</title>

</head>
<body>

    <!-- Email form which is saved into the DB -->
    <form accept-charset="utf-8" name="mail" onsubmit="return false;" method="post" id="mail">
        <h1>Hotspot</h1>
        <h2>To gain internet access, enter your email.</h2>
        <br />
        <input type="text" id="email" name="email" autofocus="autofocus" />
        <br />
        <input type="submit" value="Submit" id="submit_ok" name="submit_ok" /> <br />
    </form>

<script type="text/javascript">

document.getElementById("submit_ok").addEventListener("click", SendAjax);
    function SendAjax() {
        var email = document.getElementById("email").value;
        console.log(email);
        // Check if fields are empty 
        if (email=="") {
            alert("Please enter your email.");
        }
        // AJAX code to submit form
        else{
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'http://router/login', true);
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded", "Access-Control-Allow-Origin: *");

            xhr.onreadystatechange = function () {
                var DONE = 4;
                var OK = 200;
                if (xhr.readyState === DONE){
                    if (xhr.status === OK){
                        var xhr2 = new XMLHttpRequest();
                        xhr2.open('POST', 'http://server/insertDB.php', true);
                        xhr2.setRequestHeader("Content-type", "application/x-www-form-urlencoded", "Access-Control-Allow-Origin: *");
                        var useremail = document.getElementById("email").value;

                        xhr2.onreadystatechange = function () {
                            if (xhr2.readyState === DONE){
                                if (xhr2.status === OK){        
                                    location.href = "http://server/redirected.html";
                                }
                            }
                        }
                    }
                    xhr2.send("Email="+encodeURIComponent(useremail));
                }
            }
            xhr.send("username=HSuser&password=SimpleUserPassword");
        }
    };

</script>   
</body>
</html>

Текущий * 1 114 * код:

<?php

    require ('connect.php');

    $clean_email = "";
    $cleaner_email = "";


    if(isset($_POST['email']) && !empty($_POST['email'])){

        //sanitize with filter
        $clean_email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
        //sanitize with test_input
        $cleaner_email = test_input($clean_email);
        //validate with filter
        if (filter_var($cleaner_email,FILTER_VALIDATE_EMAIL)){
            // email is valid and ready for use
            echo "Email is valid";  
            //Email is a column in the DB
            $stmt = $DB->prepare("INSERT INTO addresses (Email) VALUES (?)");
            $stmt->bind_param("s", $cleaner_email);
            $stmt->execute();
            $stmt->close();
        } else {
            // email is invalid and should be rejected
            echo "Invalid email, try again";
        } 
    } else {
    echo "Please enter an email";
    }


    function test_input($data) {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
    }

    $DB->close();   
?>

Предыдущий HTML / JS код:

function SendAjax() {
    var email = document.getElementById("email").value;
    console.log(email);
    // Check if fields are empty 
    if (email=="") {
        alert("Please enter your email.");
    }
    // AJAX code to submit form
    else{
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://router/login', true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded", "Access-Control-Allow-Origin: *");

        xhr.onreadystatechange = function () {
            var DONE = this.DONE || 4;
            if (xhr.readyState === XMLHttpRequest.DONE){
                var xhr2 = new XMLHttpRequest();
                xhr2.open('POST', 'http://server/insertDB.php', true);
                xhr2.setRequestHeader("Content-type", "application/x-www-form-urlencoded", "Access-Control-Allow-Origin: *");
                var useremail = document.getElementById("email").value;

                xhr2.onreadystatechange = function () {
                    var DONE = this.DONE || 4;
                    if (xhr2.readyState === XMLHttpRequest.DONE) {
                        location.href = "http://server/redirected.html";
                    }
                };
                xhr2.send("Email="+encodeURIComponent(useremail));
            }
        }

        xhr.send("popup=true&username=HSuser&password=SimpleUserPassword");
    }
}

1 Ответ

1 голос
/ 07 января 2020

Если это облегчит вашу жизнь (и БУДЕТ), вы можете перевести jQuery в режим без конфликтов.

<!-- Putting jQuery into no-conflict mode. -->
<script src="prototype.js"></script>
<script src="jquery.js"></script>
<script>

var $j = jQuery.noConflict();
// $j is now an alias to the jQuery function; creating the new alias is optional.

$j(document).ready(function() {
    $j( "div" ).hide();
});

// The $ variable now has the prototype meaning, which is a shortcut for
// document.getElementById(). mainDiv below is a DOM element, not a jQuery object.
window.onload = function() {
    var mainDiv = $( "main" );
}

</script>

https://learn.jquery.com/using-jquery-core/avoid-conflicts-other-libraries/

Затем вы можете сделать AJAX вызов, и все, что должно ждать, может go в функции успеха:

            $j.ajax({
                url: '/your-form-processing-page-url-here',
                type: 'POST',
                data: yourVariables,
                mimeType: 'multipart/form-data',
                success: function(data, status, jqXHR){
                    alert('Hooray! All is well.');
                    console.log(data);
                    console.log(status);
                    console.log(jqXHR);

                },
                error: function(jqXHR,status,error){
                    // Hopefully we should never reach here
                    console.log(jqXHR);
                    console.log(status);
                    console.log(error);
                }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...