Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取请求在移动设备上不起作用_Javascript_Fetch_Gatsby - Fatal编程技术网

Javascript 获取请求在移动设备上不起作用

Javascript 获取请求在移动设备上不起作用,javascript,fetch,gatsby,Javascript,Fetch,Gatsby,我有一个联系表格,上面有一个要发布的取回请求(formspree联系表格)。在桌面和任何浏览器上,它都可以正常工作,但一旦我使用移动设备,它就不能了 表单的按钮显示为“发送”,提交时该值更改为“发送…”,成功提交后显示为“已发送邮件”。在手机上,点击按钮后,它会切换到“发送…”,但没有其他事情发生,我也不会收到提交 我尝试过使用ghostlab进行调试,但得到的结果是: formData.entries is not a function 我还没有找到任何解决办法,所以我希望这里的人可能有一个

我有一个联系表格,上面有一个要发布的取回请求(formspree联系表格)。在桌面和任何浏览器上,它都可以正常工作,但一旦我使用移动设备,它就不能了

表单的按钮显示为“发送”,提交时该值更改为“发送…”,成功提交后显示为“已发送邮件”。在手机上,点击按钮后,它会切换到“发送…”,但没有其他事情发生,我也不会收到提交

我尝试过使用ghostlab进行调试,但得到的结果是:

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”