jQuery Ajax beforesend, success and error with axios



我在静态网页上有一个联系表格,我是通过表单发送的。 我正在尝试实现 ajax 提交以避免重定向页面。

我找到了在jQuery中做到这一点的要点。

jQuery

var $contactForm = $('#contact-form');
$contactForm.submit(function(e) {
e.preventDefault();
var $submit = $('input:submit', $contactForm);
var defaultSubmitText = $submit.val();
$.ajax({
url: '//formspree.io/your@email.com',
method: 'POST',
data: $(this).serialize(),
dataType: 'json',
beforeSend: function() {
$submit.attr('disabled', true).val('Sending message…');
},
success: function(data) {
$submit.val('Message sent!');
setTimeout(function() {
$submit.attr('disabled', false).val(defaultSubmitText);
}, 5000);
},
error: function(err) {
$submit.val('Oops, there was an error.');
setTimeout(function() {
$submit.attr('disabled', false).val(defaultSubmitText);
}, 5000);
}
});
});

我只想使用原生的javascript,到目前为止,这就是我"翻译它"的方式

原生 JS

const form = document.querySelector('form');
form.addEventListener("submit", function(e){
e.preventDefault();
const $submit = form.querySelector('.contact__submit');
const defaultSubmitText = $submit.innerHTML;
axios({
method: 'post',
url: 'https://formspree.io/your@email.com',
data: serialize(form)
// https://plainjs.com/javascript/ajax/serialize-form-data-into-a-query-string-45/
})
.then(function(response) {
console.log('SENT!!', response.data);
})
.catch(function(){
console.log('ERROR!!');
});
//https://github.com/stefanpenner/es6-promise
});

如何"翻译"beforeSend,让用户知道消息正在发送?

我知道这很旧,但让我放弃我如何能够让我的工作。当尝试用vanilla JS重写我的jQuery代码时,我遇到了同样的问题,我所做的是使用拦截器。

使用示例代码

const form = document.querySelector('form');
form.addEventListener("submit", function(e){
e.preventDefault();
const $submit = form.querySelector('.contact__submit');
const defaultSubmitText = $submit.innerHTML;
// Axios BeforeSend equivalent
axios.interceptors.request.use( config => {
// Write whatever logic you want to run beforeSend here
$submit.attr('disabled', true).val('Sending message…');
return config; // very Important to add this, else Axios will cancel itself
});
axios({
method: 'post',
url: 'https://formspree.io/your@email.com',
data: serialize(form)
// https://plainjs.com/javascript/ajax/serialize-form-data-into-a-query-string-45/
})
.then(function(response) {
console.log('SENT!!', response.data);
})
.catch(function(){
console.log('ERROR!!');
});
//https://github.com/stefanpenner/es6-promise
});

您也可以选择执行类似BeforeReceive的操作(即在返回响应之前执行某些操作(:

axios.interceptors.response.use( config => {
// Write whatever logic you want to run beforeReceieve here
return config;
});