`
sea878412
  • 浏览: 24293 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Extjs上传文件在firefox中的bug

阅读更多
  • 发现问题

近来在自己瞎捣鼓中发现extjs4.1.1中在带有uploadfield的form中使用form.submit方法在firefox中存在bug,也就是上传文件时.

具体情况是:

我在写ajax请求是使用的方法是

var form = ....//from from panel get baseForm
.....//init and validate other data
form.duSubmit({
    url:'getUsers.req',
    ....//other params
    success:function(fp,o){
        alert(o.result.dataMsg);
    },
    failure:function(fp,o){
        alert(o.result.errorMs);
    }
});

 这个方法在ie中完全没有问题,但是在firefox中总是不正常,点击完提交按钮后,就一直停在正在处理的那个画面里转呀转的,就是不返回成功或失败的提示.

  • 研究问题

 在百度上google了好久好久都没找到一点有用的资料,有的大多是一些相关的问题,但没有人解决了.想想  如果不能解决这个问题,当碰到类似的功能时就不能再firefox上调试,就觉得后果很可怕,一狠心就决定自己从头开始分析这个问题,

 

在firefox的firebug中我看到有一条错误信息,意思是 result is undefined,然后还有个链接,点进去是

ext-all-debug.js文件中的Ext.form.action.Submit 的onSuccess 的方法(我开发时使用的debug版的extjs)

onSuccess: function(response) {
        var form = this.form,
            success = true,
            result = this.processResponse(response);
        if (result !== true && !result.success) {
            if (result.errors) {
                form.markInvalid(result.errors);
            }
            this.failureType = Ext.form.action.Action.SERVER_INVALID;
            success = false;
        }
        form.afterAction(this, success);
    },

 再通过firebug调试js中发现result 确实为undefined,但是为什么在ie中又正常了呢.于是我想到了可能是两个浏览器对某些对象的封装赋值存在差异,所以我继续查看processResponse方法,这个方法是其父类Ext.form.action.Action的方法

processResponse : function(response){
        this.response = response;
        if (!response.responseText && !response.responseXML) {
            return true;
        }
        return (this.result = this.handleResponse(response));
    },

 其中又使用到了Ext.form.action.Submit类中的handleResponse方法

handleResponse: function(response) {
        var form = this.form,
            errorReader = form.errorReader,
            rs, errors, i, len, records;
        if (errorReader) {
            rs = errorReader.read(response);
            records = rs.records;
            errors = [];
            if (records) {
                for(i = 0, len = records.length; i < len; i++) {
                    errors[i] = records[i].data;
                }
            }
            if (errors.length < 1) {
                errors = null;
            }
            return {
                success : rs.success,
                errors : errors
            };
        }
        return Ext.decode(response.responseText);
    }

 在这个方法中我看到了 

Ext.decode(response.responseText);

 而在调试过成功,我看到response中的responseText确实是undefined.

 到此我就郁闷了,为什么它是undefined,它既然在ie中能正常,那说明在ie中这个肯定有值,于是我想到了谁为responseText在什么时候赋值的呢?

又是进过一番查找,终于在Ext.data.Connection的onUploadComplete方法中我找到了为responseText赋值的语句

onUploadComplete: function(frame, options) {
        var me = this,
            response = {
                responseText: '',
                responseXML: null
            }, doc, contentNode;
        try {
            doc = frame.contentWindow.document || frame.contentDocument || window.frames[frame.id].document;
            if (doc) {
                if (doc.body) {
                    if ((contentNode = doc.body.firstChild) && /pre/i.test(contentNode.tagName)) {
                        response.responseText = contentNode.innerText;
                    }
                    else if (contentNode = doc.getElementsByTagName('textarea')[0]) {
                        response.responseText = contentNode.value;
                    }
                    else {
                        response.responseText = doc.body.textContent || doc.body.innerText;
                    }
                }
                response.responseXML = doc.XMLDocument || doc;
            }
        } catch (e) {
        }

        me.fireEvent('requestcomplete', me, response, options);

        Ext.callback(options.success, options.scope, [response, options]);
        Ext.callback(options.callback, options.scope, [options, true, response]);

        setTimeout(function() {
            Ext.removeNode(frame);
        }, 100);
    },

 在这个方法中我注意到

if ((contentNode = doc.body.firstChild) && /pre/i.test(contentNode.tagName)) {
                        response.responseText = contentNode.innerText;
                    }

 于是我又在调试的过程中去查看response的信息,发现在firefox中doc.body.firstChild没有innerText这个属性而是一个innerHTML的属性,并且它的值刚好是我在后台想要抛过来的信息,内容大概是{success:"true",data:"",errorMsg:"",dataMsg:""}. 于是我猜我找到解决此问题的办法了.

  • 解决问题

于是我果断的将上段的代码改成

if ((contentNode = doc.body.firstChild) && /pre/i.test(contentNode.tagName)) {
                        response.responseText = contentNode.innerText||contentNode.innerHTML;
                    }

 将修改后的ext-all-debug.js文件覆盖原来的文件,重新编译重新部署重启服务器,并默默的祈祷能解决这个问题.打开页面,点选要上传的文件,提交............ok,久违的熟悉的画面终于出现了.

几个小时的努力终于有点点成果了.

1
1
分享到:
评论
1 楼 daive7 2015-01-07  
非常感谢,我也是遇到这个问题,通过你的方法已经解决,不过我是重写的方式,没有直接改源代码

相关推荐

    解决extjs API文档不断Loading

    尝试使用Chrome、Firefox等现代浏览器查看文档。 3. **缓存和Cookie**: 浏览器缓存的旧版文件或过期的Cookie可能导致加载问题。清理浏览器缓存和Cookie,然后重新加载页面,看看是否能解决问题。 4. **本地XHR...

    基于Extjs的开源控件库ExtAspNet v3.1.9.rar

    支持的浏览器: IE 7.0 、Firefox 3.6 、Chrome 3.0 、Opera 10.5 、Safari 3.0 授权协议:Apache License 2.0 (Apache) ExtAspNet 是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果。目标是创建没有...

    log4Net详解(共2讲)

    4、详尽演示FireFox中ExtJs的调试及VS2008中javascript的调试方法; 5、了解ExtJs代码的混淆、加密与优化; 6、了解大型实际商业OA项目流程及实战如何使用Ext快速开而简单地开发单页面应用。 注:如果你也在思考...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...

    ExtAspNet_v2.3.2_dll

    -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...

    Extjs Gird 支持中文拼音排序实现代码

    虽然在本文中提到`localeCompare`在Firefox和IE上都得到支持,但在不同版本的浏览器上可能有所差异。因此,在开发中使用`localeCompare`之前,应该测试该方法在目标浏览器环境中的表现,确保它能正确工作。 上述...

    基于Extjs的开源控件库ExtAspNet中文版 v3.1.9

    支持的浏览器: IE 7.0+、Firefox 3.6+、Chrome 3.0+、Opera 10.5+、Safari 3.0+ 授权协议:Apache License 2.0 (Apache) ExtAspNet 是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果。目标是创建没有...

    基于Extjs的开源控件库ExtAspNet英文版 v3.1.9

    支持的浏览器: IE 7.0+、Firefox 3.6+、Chrome 3.0+、Opera 10.5+、Safari 3.0+ 授权协议:Apache License 2.0 (Apache) ExtAspNet 是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果。目标是创建没有...

    EfsFrame(java开发框架) v2.2 源代码.rar

    b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...

    EfsFrame(net开发框架) v2.2 源代码.rar

    b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...

    EfsFrame(php开发框架) 2.2.rar

    b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...

    EfsFrame(php开发框架) v2.2 源代码.rar

    b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...

    ExtAspNet控件 v3.1.9源码2012825

    IE 7.0+、Firefox 3.6+、Chrome 3.0+、Opera 10.5+、Safari 3.0+ 源码有中文示例和英文示例,以及帮助文档(存放在doc文件夹里)方便用户学习 更新信息 2012-08-18 v3.1.9 -修正other/addtab.aspx示例的JS错误和...

    游戏新手卡领号系统 v2.5

    3、在config.php文件中,请根据说明修改 4、后台管理地址:http://你的域名/admin,(注:后台不兼容IE6,请使用谷歌或火狐浏览器登录后台)  默认的管理员账号和密码为:admin,请进入后台后点用户管理,选择...

    游戏新手卡领号系统 v2.5.zip

    3、在config.php文件中,请根据说明修改 4、后台管理地址:http://你的域名/admin,(注:后台不兼容IE6,请使用谷歌或火狐浏览器登录后台) 默认的管理员账号和密码为:admin,请进入后台后点用户管理,选择...

    一个仿当当的网上商城 Eshop System 前台+后台完整版

    SSH整合 部分后台页面是用ExtJs3.4做的 后台有用户、商品、类别、订单、权限管理五大模块 前台有商品列表、用户登录注册、购物车、订单用户信息几个模块 页面做的挺漂亮的 用火狐效果最佳 里面含有全部Jar包 数据库...

    BAMS-JAVA快速开发框架 2.5

    它是轻量级的,简单易学的(学习成本真的很低,没有extjs,没有easyUI,没有繁琐的js UI库。只要java基础扎实,再稍懂一点js即可,真的是为java开发人员量身定制的一套框架啊),框架以Spring Framework为核心、Jsp+Dwr...

Global site tag (gtag.js) - Google Analytics