You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Safari浏览器focus函数失效致文档上传保存失败问题求助

解决Safari中文件上传focus事件失效问题,兼容Chrome与Safari

问题根源

你当前代码的核心问题有两个:

  • 错误使用focus事件作为文件上传触发时机:文件输入框在用户选择文件后会失去焦点,不会触发focus,这在Safari中表现得尤为明显,Chrome中也无法按预期触发。
  • 仅针对Safari绑定事件,Chrome完全没有处理逻辑,自然无法工作。

修复方案

改用change事件(所有浏览器通用,文件选择完成后会触发),同时移除不必要的浏览器UA判断,统一处理逻辑:

修复后的代码

$(document).on("change", ".docs_field", function(){
    console.log("文件已选择,开始上传");
    var base_url = $('#base_url').val();
    var _token = $('#_token').val();
    var activeField = $(this);
    var lead_id = $("#lead_id").val();
    var file = this.files[0];
    
    // 先判断是否选择了文件
    if (!file) return;
    
    var ids = $(this).attr('name');
    var formData = new FormData();
    
    formData.append('lead_id', lead_id);
    formData.append('ids', ids);
    formData.append('_token', _token); // 将CSRF Token放入FormData,比设置请求头兼容性更好
    
    var reader = new FileReader();
    reader.readAsDataURL(file);
    
    reader.onload = function() {
        formData.append('file_data', reader.result);
        
        var xhr = new XMLHttpRequest();
        xhr.open('POST', base_url + "auto_save_doc.php", true);
        
        xhr.onload = function() {
            if (xhr.status >= 200 && xhr.status < 300) {
                console.log("响应内容", xhr.responseText);
                console.log("上传成功");
                try {
                    var result = JSON.parse(xhr.responseText);
                    var docu_ids = result['document_id'];
                    activeField.next().val(docu_ids);
                } catch (e) {
                    console.error("响应解析失败", e);
                }
            } else {
                console.error("上传失败,状态码:", xhr.status);
            }
        };
        
        // 新增网络错误处理
        xhr.onerror = function() {
            console.error("网络请求出错");
        };
        
        xhr.send(formData);
    };
    
    // 新增文件读取错误处理
    reader.onerror = function() {
        console.error("文件读取失败");
    };
});

关键改进点

  • 替换事件类型:用change替代focus,确保用户选择文件后立即触发上传逻辑,兼容所有主流浏览器。
  • 移除UA判断:统一处理Chrome和Safari,无需针对特定浏览器编写分支代码。
  • 增加校验与错误处理:添加文件存在判断、响应解析异常捕获、网络错误处理,避免代码崩溃。
  • 优化CSRF Token传递:将Token放入FormData中,比设置请求头更适配不同浏览器的表单提交规则。
  • 完善日志输出:更清晰的日志信息,便于调试排查问题。

内容的提问来源于stack exchange,提问作者Abdullah Shahab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:14:56