Не разрешать отправку формы, а вместо этого отправлять xmlHttpRequest

У меня есть этот код ниже, просто простое событие в отправке формы, которое отправляет xmlhttprequest

<form action = "http://localhost/cn/account_test/index.php" method = "post" onsubmit = "login(this);">
    <label>Username</label><br>
    <input type = "text" id = "username" name = "username"><br>
    <label>Password</label><br>
    <input type = "password" id = "password" name = "password">
    <br>
    <button>Submit</button>
</form>

ниже приведена функция входа в систему, которую я привязываю к форме при отправке.

    function login(e){
        e.preventDefault();

        var $data = [];

        $data.push({ username : this.querySelector('#username').val()});
        $data.push({ password : this.querySelector('#password').val()});

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {

               document.getElementById("demo").innerHTML = xhttp.responseText;
            }
        };
        xhttp.open("POST", this.getAttribute('action'), true);
        xhttp.params($data);
        xhttp.send();

        return false;

    }

но ни return false, ни e.preventDefault () не работают. Любая помощь, идеи, пожалуйста?

попробуйте onsubmit = "return login(this);"

joyBlanks 20.11.2018 10:11

попробуйте <button type = 'button'> Отправить </button>

shaghayegh sheykholeslami 20.11.2018 10:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
164
4

Ответы 4

this - это ссылка на объект формы, в котором нет метода preventDefault. Вместо этого передайте event в функции login:

<form action = "http://localhost/cn/account_test/index.php" method = "post" onsubmit = "login(event);">
  ...
</form>

В вашем коде 2 вещи:

  1. У кнопки <button>Submit</button> отсутствует свойство типа:

<button type = "submit">Submit</button>

  1. this в функции login(this) не имеет свойства preventDefault. Относится к элементу form.

Вы можете попробовать установить идентификатор для формы и написать прослушиватель событий следующим образом:

document.getElementById("myForm").addEventListener("submit", login);

function login(e) {
    e.preventDefault();
    console.info('caught!');

    // more code goes here...
}
<form action = "http://localhost/cn/account_test/index.php" method = "post" id = "myForm">
    <label>Username</label><br>
    <input type = "text" id = "username" name = "username"><br>
    <label>Password</label><br>
    <input type = "password" id = "password" name = "password">
    <br>
    <button type = "submit">Submit</button>
</form>

закончил использование

document.querySelector('#form').addEventListener('click',function(e){

e.preventDefault();

});

спасибо за помощь, все работает.

Вместо использования встроенного JavaScript вам следует настроить прослушиватель событий с помощью JavaScript.

Шаг 1. Удалите встроенный JS и добавьте идентификатор в форму:

<form action = "http://localhost/cn/account_test/index.php" method = "post" id = "form">

Шаг 2. Добавьте прослушиватель событий, исправьте некорректное использование XMLHttpRequest

Например, xhttp.params($data); не является допустимой функцией, вместо этого используйте:

document.getElementById("form").addEventListener("submit", function(e) {
    e.preventDefault();

    var $data = [];

    $data.push({ username : document.getElementById('username').value });
    $data.push({ password : document.getElementById('password').value });

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState === 4 && this.status === 200) {
            document.getElementById("demo").innerHTML = xhttp.responseText;
        }
    };

    xhttp.open("POST", this.getAttribute('action'), true);
    xhttp.send($data);
});

Другие вопросы по теме