Javascript 获取请求在移动设备上不起作用
我有一个联系表格,上面有一个要发布的取回请求(formspree联系表格)。在桌面和任何浏览器上,它都可以正常工作,但一旦我使用移动设备,它就不能了 表单的按钮显示为“发送”,提交时该值更改为“发送…”,成功提交后显示为“已发送邮件”。在手机上,点击按钮后,它会切换到“发送…”,但没有其他事情发生,我也不会收到提交 我尝试过使用ghostlab进行调试,但得到的结果是:Javascript 获取请求在移动设备上不起作用,javascript,fetch,gatsby,Javascript,Fetch,Gatsby,我有一个联系表格,上面有一个要发布的取回请求(formspree联系表格)。在桌面和任何浏览器上,它都可以正常工作,但一旦我使用移动设备,它就不能了 表单的按钮显示为“发送”,提交时该值更改为“发送…”,成功提交后显示为“已发送邮件”。在手机上,点击按钮后,它会切换到“发送…”,但没有其他事情发生,我也不会收到提交 我尝试过使用ghostlab进行调试,但得到的结果是: formData.entries is not a function 我还没有找到任何解决办法,所以我希望这里的人可能有一个
formData.entries is not a function
我还没有找到任何解决办法,所以我希望这里的人可能有一个想法
这是我的代码,请注意if(typeof window!==未定义)和window.onload=函数必须被添加才能使任何东西正常工作,因为我正在使用gatsby js构建我的站点
if (typeof window !== `undefined`) {
window.onload=function(){
const sendButton = document.getElementById('send-button')
const formDataToJson = formData => {
const entries = formData.entries();
const dataObj = Array.from(entries).reduce( (data, [key, value]) => {
data[key] = value;
if (key === 'email') {
data._replyTo = value;
}
return data;
}, {});
return JSON.stringify(dataObj);
};
const postToFormspree = formData => fetch(`https://formspree.io/myemail@gmail.com`, {
method: 'POST',
body: formDataToJson(formData),
headers: {
'Content-Type': 'application/json'
}
}).then(r => r.json());
document.getElementById('myform').addEventListener('submit', function (e) {
e.preventDefault();
sendButton.value = 'Sending..';
const formData = new FormData(this);
postToFormspree(formData).then(response => {
sendButton.value = 'Message sent!';
myform.reset();
});
});
}
}
根据FormData.entries
在Chrome50+、Firefox44+和Opera中提供。Edge或Safari不支持它,也不知道什么版本的Internet Explorer支持它。在Barmar指出正确的方向后,我通过简单地添加formdata polyfill npm软件包实现了它:
然后在main.js中添加了
var WebFont = require('webfontloader');
像这样:
if (typeof window !== `undefined`) {
window.onload=function(){
require('formdata-polyfill')
.....
在移动设备上部署并在chrome和FF中测试,目前运行良好查看浏览器兼容性表,您可以写:const dataObj=[…formData]。reduce
Argh好的,谢谢大家。关于最佳解决方案有什么建议吗?也许有一个polyfill,或者我可以检测到它是否是移动的,在这种情况下,显示一个不使用fetch的表单?这有意义吗?我对所有这些都很陌生,但这些似乎是唯一可行的选择,或者还有其他选择吗?您可以使用获取
,问题在于formDataToJson
。哦,好的,有什么想法吗?formspree表单通常的工作方式是在提交后重定向到感谢页面,这样我仍然可以在手机上显示该版本,对吗?但是如果我可以避免的话,那么我当然会,因为我觉得在手机上没有太多的意义:/Google“polyfill for formdata.entries”