我的$.ajax请求在iOS 11.3上停止正常工作
多年来,这段代码一直运行良好且快速 鉴于$.ajax没有收到任何文件数据,在iOS 11.3更新时,当在iOS浏览器上测试时,$.ajax的工作速度似乎非常慢,最长可达20秒,无法提交一个简单的纯文本表单 但是,如果file元素传递文件数据,$.ajax在这两种情况下都可以正常工作,并且速度与预期的一样快我的$.ajax请求在iOS 11.3上停止正常工作,ios,ajax,Ios,Ajax,多年来,这段代码一直运行良好且快速 鉴于$.ajax没有收到任何文件数据,在iOS 11.3更新时,当在iOS浏览器上测试时,$.ajax的工作速度似乎非常慢,最长可达20秒,无法提交一个简单的纯文本表单 但是,如果file元素传递文件数据,$.ajax在这两种情况下都可以正常工作,并且速度与预期的一样快 HTML --- <form enctype="multipart/form-data" id="chatform" method="post"> <input ty
HTML ---
<form enctype="multipart/form-data" id="chatform" method="post">
<input type="file" name="pic" id="pic" class="hidden" />
<textarea name="chattextarea" id="chattextarea" rows="3" cols="10"></textarea>
<input type="button" value="Send" onclick="sendMessage();" />
</form>
JavaScript ---
function sendMessage() {
var formData = new FormData($("#chatform")[0]);
$.ajax({
url: 'send.php',
type: 'POST',
data: formData,
async: true,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
/* some success message */
}
});
}
HTML---
JavaScript---
函数sendMessage(){
var formData=新的formData($(“#chatform”)[0]);
$.ajax({
url:'send.php',
键入:“POST”,
数据:formData,
async:true,
cache:false,
contentType:false,
processData:false,
成功:函数(返回数据){
/*一些成功的信息*/
}
});
}
这是一个iOS 11.3错误吗
-----编辑-----
的确,这不仅是iOS 11.3的bug,也是Safari 11.1的bug。
到目前为止,我测试了这些环境并复制了错误:
我写了一个简单的解决方法,请检查我的答案,并告诉我是否有更干净的解决方案。我有完全相同的问题!我有一个web应用程序,其中有几个表单,如果用户不选择包含文件,这些表单将不再工作。自beta 1以来一直在运行iOS 11.3测试版,希望每一个新的测试版都能解决这个问题。这个问题一直存在于公开发行中,这让人非常恼火。希望现在有更多关于如何解决这个问题的信息,因为这个“错误”影响了更多的人。这里也有同样的问题!!!由于许多IOS用户正在升级,这将是一个真正的问题。有人找到解决这个问题的方法了吗?如果我发送一个文件,它就可以工作。我的解决方法是将选中文件和不选中文件的表单的行为分开 这个解决方案相当糟糕,但它解决了苹果的一个bug:(
如果您有更干净的解决方案,请告诉我。只需从formData中删除空文件输入:
if(!imageUsed){
formData.delete('file[]');
}
我们仍在不同的设备上进行测试,但似乎有效。谢谢!我将前面的两个答案结合起来,给出了一个更干净、更有效的示例。我认为苹果应该尽快解决这个问题
var formData = new FormData( this );
if(!$("#image").val()) {
formData.delete('image_file');
}
if(!$("#pdf").val()) {
formData.delete('pdf_doc');
}
$.ajax({
type: 'post',
data: formData
//and so on...
在创建类之前,我禁用了formData中的空文件输入,而不是删除:
if(!file.val()){
file.attr('disabled', true);
}
此功能适用于iOS 11.3、iOS 10.2和windows Chrome 65.0.3325.181。 有人可以帮助在其他浏览器上进行测试吗
function formDataFileFix(formData) {
try {
if (formData.keys) {
var formKeysToBeRemoved = [];
for (var key of formData.keys()) {
var fileName = null || formData.get(key)['name'];
var fileSize = null || formData.get(key)['size'];
if (fileName != null && fileSize != null && fileName == '' && fileSize == 0) {
formKeysToBeRemoved.push(key);
}
}
for (var i = 0; i < formKeysToBeRemoved.length; i++) {
formData.delete(formKeysToBeRemoved[i]);
}
}
}
catch(err) {
console.log(err.message);
}
}
var formData = new FormData($(formID)[0]);
formDataFileFix(formData);
函数formDataFileFix(formData){
试一试{
if(formData.keys){
var formkeysteberemoved=[];
for(formData.keys()的var键){
var fileName=null | | formData.get(key)['name'];
var fileSize=null | | formData.get(key)['size'];
如果(fileName!=null&&fileSize!=null&&fileName=''&&fileSize==0){
FormKeyStoreMoved.push(按键);
}
}
对于(var i=0;i
我也遇到了同样的问题,这对我很有效,我希望我的解决方案能帮助任何人:
在Ajax请求之前:
// disable all empty inputs with type file :
let fileInputs = document.querySelectorAll(".myForm input[type=file]");
fileInputs.forEach(function (file) {
let fileInput = $('#'+file.id);
if(fileInput.get(0).files.length === 0){
fileInput.attr('disabled',true);
}
});
然后,在这里您可以发出普通的Ajax请求
注意:在此之后,您可能需要再次使用类型文件启用输入。
(与禁用它们的方式相同)
嗨,刚刚添加了一个变通方法,请让我知道它是否对您有效。嗨,阿霍霍霍,非常感谢,您的变通方法对我有效!我没有足够的声誉来验证您的答案,但它是有效的!我欠您一杯啤酒!嗨,刚刚添加了一个变通方法,请让我知道它是否对您有效。显然,这个解决方案不适用于iOS<11.3I tried使用FormData.delete和FormData.set替换文件字段。它适用于iOS 11.3,但在任何旧版本中再次被破坏。此解决方案是唯一对我有效的解决方案,无需使用FormData替代方案。我在创建FormData对象之前立即禁用了文件字段,并将该设置禁用为false在IE8、IE10和IE11中,我得到了以下JavaScript错误:
Expected';
,它指向(formData.keys()的var key){…}的行
。我目前正在寻找解决方案。
// disable all empty inputs with type file :
let fileInputs = document.querySelectorAll(".myForm input[type=file]");
fileInputs.forEach(function (file) {
let fileInput = $('#'+file.id);
if(fileInput.get(0).files.length === 0){
fileInput.attr('disabled',true);
}
});
let myFiles = document.querySelectorAll(".myForm input[type=file]");
myFiles.forEach(function (file) {
let fileInput = $('#'+file.id);
fileInput.attr('disabled',false);
});