javascript - 我将如何在 vanilla JS 中执行此 ajax jquery?
问题描述
我正在尝试用 Vanilla JS 编写这个 jQuery ajax POST 请求;最初是:
$.ajax({
method: 'POST',
url: window.location.href + 'email',
data: {
toEmail: to, //var set elsewhere
fromName: from, //var set elsewhere
message: message, //var set elsewhere
recaptcha: recaptcha //var set elsewhere
}
})
.done(function (data) {
handleResponse(data, form)
})
.fail(function (error) {
console.error(error)
alert('Couldn't send your email. Try again later.')
})
处理响应是
function handleResponse (data, form) {
if (!data.message) return
if (!form) return
const responseMessage = form.querySelector('[email-response]')
const formData = form.querySelector('[email-data]')
if ('success' === data.message) {
responseMessage.classList.remove('error')
responseMessage.classList.add('success')
responseMessage.innerText = 'Success! Email has been sent.'
formData.classList.add('hidden')
return
}
return handleError(responseMessage, data)
}
但是,我尝试将 Ajax 部分转换为:
var req = new XMLHttpRequest();
req.onLoad = function(e){
resolve(req.response);
}
req.onerror = function(e){
console.log(e);
alert('Couldn't send your email. Try again later.')
};
var data = {
toEmail: to, //var set elsewhere
fromName: from, //var set elsewhere
message: message, //var set elsewhere
recaptcha: recaptcha //var set elsewhere
}
}
var url = window.location.href + 'email';
req.open("POST",url,true);
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(data);
我收到一个控制台错误,提示req is not defined
我做错了什么?如何在 vanilla JS 中正确执行 jQuery ajax 请求?
解决方案
您应该使用 fetch API:
const url = `${window.location.href}email`;
const payload = {
toEmail: to, //var set elsewhere
fromName: from, //var set elsewhere
message: message, //var set elsewhere
recaptcha: recaptcha //var set elsewhere
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
})
.then((response) => {
if (!response.ok) {
throw Error(response.statusText);
}
return response;
})
.then((response) => response.json())
.then((data) => {
handleResponse(data, form);
})
.catch((error) => {
console.error(error);
alert('Couldn't send your email. Try again later.');
});
fetch 返回一个承诺,并在响应中使用文本,如果你想使用更自动的东西,试试 Axios。
推荐阅读
- c# - 如何在客户端 PC 中打开数据库并与之连接?
- sml - 如何返回一些列表而不是普通列表?
- python - 无法在 CUDA 上下文上同步:CUDA_ERROR_NOT_INITIALIZED:Tensorflow-gpu 在 RTX 2070super 上工作非常缓慢
- javascript - 使用 Angular 应用程序向 Firebase 添加多因素 - 电话号码问题
- objective-c - SideMenu:如何包含在 Objective-C 项目中?
- servlets - Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet
- asp.net - 将值从页面传递到另一个页面 ASP.net 使用 VB
- html - Django用户认证和登录问题
- python - 比较其他熊猫数据框每一行的值
- java - CVN 14 的 ARQC/ARPC 验证