Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
我的$.ajax请求在iOS 11.3上停止正常工作_Ios_Ajax - Fatal编程技术网

我的$.ajax请求在iOS 11.3上停止正常工作

我的$.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

多年来,这段代码一直运行良好且快速

鉴于$.ajax没有收到任何文件数据,在iOS 11.3更新时,当在iOS浏览器上测试时,$.ajax的工作速度似乎非常慢,最长可达20秒,无法提交一个简单的纯文本表单

但是,如果file元素传递文件数据,$.ajax在这两种情况下都可以正常工作,并且速度与预期的一样快

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。 到目前为止,我测试了这些环境并复制了错误:

  • MacOS,Safari
  • iOS,Safari
  • iOS,Chrome
  • iOS、WKWebView(混合应用程序)

  • 我写了一个简单的解决方法,请检查我的答案,并告诉我是否有更干净的解决方案。

    我有完全相同的问题!我有一个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);
            });