JQuery - Запрос на отправку Ajax загружает ту же страницу с данными формы, добавленными в URL
У меня есть форма регистрации в HTML, которую я привел ниже.
<form id="registerForm">
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="First Name" name="guestFName" title="Up to 20 alphabetical characters" required>
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="Last Name" name="guestLName" title="Up to 20 alphabetical characters" required>
<input type="email" placeholder="Email" name="guestEmail" title="Must be a valid email address" required>
<input type="text" pattern="08[36579]-\d{7}" placeholder="Phone Number" name="guestPhone" title="Must be an irish mobile number of format 08?-7 digits" required>
<input type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}" placeholder="Password" name="guestPassword" title="Must be 8 or more characters long and contain at least one number and one uppercase letter" required>
<br>
<button id="myButton">Register</button>
</form>
Я пытаюсь опубликовать информацию из формы, когда кто-то заполняет ее API-интерфейсом python, который затем вставляет информацию в базу данных MySQL.
Я хочу функциональность требуемых и шаблонов в HTML.
Я использую jQuery 3.1.1 и Ajax для отправки данных формы в API.
Мой JQuery/Ajax приведен ниже:
$("#registerForm").submit(function()
{
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
});
Я думаю, что это должно работать, однако, если я заполню форму и нажмите кнопку "Регистрация", она перезагрузит страницу и просто добавит информацию о форме в URL-адрес.
Примером этого является:
URL_GOES_HERE/register.html?guestFName=Joe&guestLName=Bloggs&guestEmail=bloggs%40gmail.com&guestPhone=087-1111111&guestPassword=TestPassword1
Почему так себя ведут?
Вся помощь очень ценится
EDIT: e.preventDefault(); не устраняет проблему.
Ответы
Ответ 1
Я думаю, вы должны использовать <input type='button'>
вместо <button>
и просто использовать .click()
событие этого <input type='button'>
, как показано ниже.
Изменить
<button id="myButton">Register</button>
Для
<input type='button' id='btnRegeister' value='Register'/>
И в JS
Изменить
$("#registerForm").submit(function()
Для
$("#btnRegeister").click(function()
Итак, теперь весь ваш код становится ниже.
<form id="registerForm">
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="First Name" name="guestFName" title="Up to 20 alphabetical characters" required>
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="Last Name" name="guestLName" title="Up to 20 alphabetical characters" required>
<input type="email" placeholder="Email" name="guestEmail" title="Must be a valid email address" required>
<input type="text" pattern="08[36579]-\d{7}" placeholder="Phone Number" name="guestPhone" title="Must be an irish mobile number of format 08?-7 digits" required>
<input type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}" placeholder="Password" name="guestPassword" title="Must be 8 or more characters long and contain at least one number and one uppercase letter" required>
<br>
<input type='button' id='btnRegeister' value='Register'/>
</form>
$(document).ready(function(){
$("#btnRegeister").click(function()
{
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
});
});
Попробуйте более код, он работает для меня
Ответ 2
EDIT. Вы должны включить атрибут типа 'в свой HTML:
<button type="submit" name="submit"></button>
Использование функции "preventDefault" предотвратит отправку/перенаправление формы по умолчанию - это остановит непреднамеренное поведение
$("#registerForm").submit(function(e)
{
e.preventDefault(); // Add this
$.ajax(
{
url: "URL_GOES_HERE",
data: $(this).serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
});
Ответ 3
вам нужно предотвратить preventDefault(), чтобы предотвратить поведение по умолчанию формы
$("#registerForm").submit(function(e)
{
e.preventDefault();
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
});
Ответ 4
Вы работаете в браузере Safari случайно? потому что это единственный браузер, который я знаю, кто не поддерживает требуемые атрибуты и шаблоны, и он отправит форму любым способом, если это так, я могу дать вам хорошее решение, если не единственный вариант, который у вас есть, - удалить форму тег и запустить запрос ajax при нажатии кнопки.
Ответ 5
Есть несколько подсказок, которые, как я полагаю, могут заставить его работать.
- Вставьте код jQuery в
$(function() { ... }
.
- Не используйте
async: false
для вызова jQuery AJAX.
- Используйте событие
stopPropagation()
и preventDefault()
, чтобы предотвратить событие формы отправки.
Кроме этого, я ничего не менял и получил форму для работы. Я использовал HTTPBin для публикации ваших данных и получил соответствующий ответ.
Вот fiddle того же самого.
$(function() {
$("#registerForm").submit(function(e) {
e.stopPropagation();
e.preventDefault();
$.ajax({
url: "https://httpbin.org/post",
data: $('#registerForm').serialize(),
type: 'POST'
})
.done(function(response) {
console.log(response);
//var result = JSON.parse(response);
});
});
});
Ответ 6
Убедитесь, что знак доллара $
принадлежит jQuery
, введя этот $.fn.jquery
в окно консоли. Если вы не получите версию jQuery, например, 3.1.1
, тогда jQuery не загружается или что-то еще получает, чтобы назначить знак доллара $
.
Измените свой код следующим образом:
jQuery(function($)
{
$("#registerForm").submit(function(e)
{
console.log('Form submitting');
e.preventDefault();
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
});
});
Кроме того, это не имеет особого значения, но попробуйте добавить метод POST
к вашему form
, чтобы проверить этот случай:
<form id="registerForm" method="POST">
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="First Name" name="guestFName" title="Up to 20 alphabetical characters" required>
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="Last Name" name="guestLName" title="Up to 20 alphabetical characters" required>
<input type="email" placeholder="Email" name="guestEmail" title="Must be a valid email address" required>
<input type="text" pattern="08[36579]-\d{7}" placeholder="Phone Number" name="guestPhone" title="Must be an irish mobile number of format 08?-7 digits" required>
<input type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}" placeholder="Password" name="guestPassword" title="Must be 8 or more characters long and contain at least one number and one uppercase letter" required>
<br>
<button id="myButton">Register</button>
</form>
И попробуйте отправить форму после проверки окна консоли на наличие ошибок.
Ответ 7
Похоже, что другое событие было инициировано, когда форма submit, попробуйте event.stopImmediateProgapation()
или ваше событие находится за другим событием, которое перезагрузит страницу в очереди событий.
Ответ 8
Вы можете остановить поведение по умолчанию для отправки, используя: e.preventDefault()
$("#registerForm").submit(function(e)
{
e.preventDefault();
console.log("it doesn't reload")
// your ajax call
});
Надеюсь, что это полезно!;)
Ответ 9
Вы делаете форму отправки ajax, поэтому form_id.submit()
не является хорошим! Если вы хотите сделать заявку на отправку по кнопке, нажатой как формат ajax, поймите click
событие с идентификатором кнопки и добавьте preventDefault()
или return false
из-за предотвращения загрузки страницы.
$("#myButton").click(function(e)
{
e.preventDefault();
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
});
//return false;
});
Ответ 10
Вам нужно предотвратить поведение формы по умолчанию, добавив e.preventDefault();
(после получения e
в качестве параметра) до конца вашего обработчика .submit
, например:
$("#registerForm").submit(function(e) // <-- Add the e as param
{
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
e.preventDefault(); // <-- Here is where the magic happens
});
e.preventDefault();
предотвращает фактическое собственное представление формы (перезагрузка страницы...)
Ответ 11
Попробуйте следующее:
$(document).on('submit','form',function(){
// code
$.ajax({
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
}).done(function(response){
console.log(response);
var result = JSON.parse(response);
})
});
Ответ 12
Я рекомендую вам удалить тег "button" и использовать тег "a" с некоторым css, чтобы преобразовать этот тег "a" в кнопку (например, с классом "btn" из начальной загрузки)
<form id="registerForm">
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="First Name" name="guestFName" title="Up to 20 alphabetical characters" required>
<input type="text" pattern="[A-Za-z]{1,20}" placeholder="Last Name" name="guestLName" title="Up to 20 alphabetical characters" required>
<input type="email" placeholder="Email" name="guestEmail" title="Must be a valid email address" required>
<input type="text" pattern="08[36579]-\d{7}" placeholder="Phone Number" name="guestPhone" title="Must be an irish mobile number of format 08?-7 digits" required>
<input type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}" placeholder="Password" name="guestPassword" title="Must be 8 or more characters long and contain at least one number and one uppercase letter" required>
<br>
<a class="btn btn-default">Register</a>
</form>
Затем в вашем JS-коде:
$("#registerForm a").click(function()
{
$.ajax(
{
url: "URL_GOES_HERE",
data: $('#registerForm').serialize(),
type: 'POST',
async: false
})
.done(function(response)
{
console.log(response);
var result = JSON.parse(response);
})
})
Ответ 13
Я могу реплицировать и исправлять вашу проблему с помощью NodeJS, Express, Multer и Internet Edge.
Когда я редактирую:
<form id="registerForm">
к
<form method="post" id="registerForm">
Я также отправляю ему действительный ответ с помощью Express.