【发布时间】:2018-07-05 23:10:36
【问题描述】:
我正在尝试使用 JavaScript 通过 Ajax 提交表单。它适用于 Browserstack 中的 IE、Firefox、Chrome 和 iOS,但不适用于 iOS Simulator 或真正的 iOS 设备或桌面 Safari。
我试过XMLHttpRequest onload 和XMLHttpRequest onreadystatechange,都没有被触发。据我所知request.open('POST', url, true); 不起作用。 console.log('2'); 也永远不会被触发。
我添加了这个用于调试:
request.send(data);
console.log(request);
setTimeout(function(){ console.log(request); }, 3000);
它们在 Safari 中都返回 readyState: 1,在其他浏览器中第一个返回 readyState: 1 而第二个返回 readyState: 4 符合预期。
这是我的代码精简到基本要素:
$('.ajax-form').submit(function(event) {
var form = event.target;
var data = new FormData(form);
var request = new XMLHttpRequest();
var method = form.getAttribute("method");
var action = form.getAttribute("action");
var url = window.location.href
request.open('POST', url, true);
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.setRequestHeader("HTTP_X_REQUESTED_WITH", "XMLHttpRequest");
request.setRequestHeader("pragma", "no-cache");
console.log('1');
request.onreadystatechange = function() {
console.log('2');
if (request.readyState === 4 && request.status === 200) {
var response = JSON.parse(request.response);
if (response.success && response.finished) {
// Go to selected success page
window.location.href = $(form).find('[name="formReturnUrl"]').attr('value');
} else if (response.errors || response.formErrors) {
// Deal with errors
}
}
};
request.send(data);
console.log(request);
setTimeout(function() {
console.log(request);
}, 3000);
event.preventDefault();
});
我所有的 iOS 测试都是在 Safari 中的 iOS 11 上进行的。我读过一些关于 iOS 很奇怪的文章,但我还没有找到适合我的解决方案。我做错了什么?
【问题讨论】:
-
我不知道为什么会这样,但我建议您尝试
$.post(),因为您已经在使用 jQuery。 -
感谢您的想法,但 jQuery Ajax 没有从我的 CMS(运行 Freeform 的工艺)正确返回表单错误数据。我正在尝试对 Ajax 使用纯 JavaScript,因为它在我的环境中完美运行,除了在 iOS Safari 中......还有其他想法吗?
标签: javascript ios ajax forms