【发布时间】:2018-09-11 20:04:32
【问题描述】:
更新:截至Webkit build r230963,此问题已在 Webkit 中解决。
============
自从最近 macOS 和 iOS 上的 Safari 11.1 更新以及 Safari 技术预览版 11.2 中,当 input[type=file] 字段没有选择文件时,我的 Web 应用程序中的 $.ajax 调用失败(不是必需的)以我的形式)。当字段确实选择了文件时不会失败。
ajax 的 error 回调运行,Safari 控制台包含以下消息:Failed to load resource: The operation couldn’t be completed. Protocol error。我是 HTTPS 并通过 HTTPS 提交到同一域(和服务器)上的位置。
在 11.1 更新之前,$.ajax 调用在没有选择文件时提交得很好。最新版本的 Chrome 和 Firefox 没有问题。
我的代码的相关部分:
输入:
Browse... <input id="file-upload" type="file" name="image" accept=".jpg,.jpeg">
JS:
var formData = new FormData($(this)[0]);
$.ajax({
type: 'POST',
enctype: 'multipart/form-data',
url: '../process.php',
data: formData,
contentType: false,
processData: false,
cache: false,
success: function(response) { ... },
error: function() { //my code reaches here }
});
作为一个临时(希望)解决方案,我检测到一个空文件字段,并在调用 ajax 之前将其从 formData 中删除,并且一切都按预期/之前工作:
$("input[type=file]").each(function() {
if($(this).val() === "") {
formData.delete($(this).attr("name"));
}
});
我做错了什么,Safari 是否存在问题,或者 Safari 中是否存在需要在 ajax 调用中考虑的变化?
【问题讨论】:
-
很好的临时解决方案,但如果应用于所有 Safari 浏览器,则在 safari 11 下不起作用。你找到任何“真正”的解决方案了吗?
-
@Karem - 感谢您的提醒!幸运的是,我的应用程序的用户不会低于 Safari 11,但很高兴知道这一点。不,还没有解决方案。我向 Apple 提交了一份雷达/错误报告,他们今天才要求我提供系统诊断信息。
-
遇到了同样的问题,这篇文章对我帮助很大。谢谢你。 FWIW 我相信 FormDeta#delete() 仅在 Safari 11 或更高版本中受支持。因此,您可能必须添加版本检查。 caniuse.com/#feat=xhr2 无论如何,谢谢你的信息。
-
是的 delete() 可能是它。有关如何使用 javascript 添加版本检查的任何建议?
-
有为 WebKit 打开的 bugzilla 项目,而且似乎也是一个 rdar。 bugs.webkit.org/show_bug.cgi?id=184490
标签: javascript jquery ajax forms safari