- 发现问题
近来在自己瞎捣鼓中发现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,久违的熟悉的画面终于出现了.
几个小时的努力终于有点点成果了.
相关推荐
尝试使用Chrome、Firefox等现代浏览器查看文档。 3. **缓存和Cookie**: 浏览器缓存的旧版文件或过期的Cookie可能导致加载问题。清理浏览器缓存和Cookie,然后重新加载页面,看看是否能解决问题。 4. **本地XHR...
支持的浏览器: 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效果。目标是创建没有...
4、详尽演示FireFox中ExtJs的调试及VS2008中javascript的调试方法; 5、了解ExtJs代码的混淆、加密与优化; 6、了解大型实际商业OA项目流程及实战如何使用Ext快速开而简单地开发单页面应用。 注:如果你也在思考...
-修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...
-修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...
虽然在本文中提到`localeCompare`在Firefox和IE上都得到支持,但在不同版本的浏览器上可能有所差异。因此,在开发中使用`localeCompare`之前,应该测试该方法在目标浏览器环境中的表现,确保它能正确工作。 上述...
支持的浏览器: 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效果。目标是创建没有...
支持的浏览器: 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效果。目标是创建没有...
b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...
b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...
b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...
b)扩展对多文件、单文件上传的封装(详细说明见相关文档)。 c)扩展高级插件editorgrid(可动态的添加、修改、删除行,对行的单元格进行编辑)(授权用户可用) d)扩展高级插件grid扩展列插件(授权用户可用) ...
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错误和...
3、在config.php文件中,请根据说明修改 4、后台管理地址:http://你的域名/admin,(注:后台不兼容IE6,请使用谷歌或火狐浏览器登录后台) 默认的管理员账号和密码为:admin,请进入后台后点用户管理,选择...
3、在config.php文件中,请根据说明修改 4、后台管理地址:http://你的域名/admin,(注:后台不兼容IE6,请使用谷歌或火狐浏览器登录后台) 默认的管理员账号和密码为:admin,请进入后台后点用户管理,选择...
SSH整合 部分后台页面是用ExtJs3.4做的 后台有用户、商品、类别、订单、权限管理五大模块 前台有商品列表、用户登录注册、购物车、订单用户信息几个模块 页面做的挺漂亮的 用火狐效果最佳 里面含有全部Jar包 数据库...
它是轻量级的,简单易学的(学习成本真的很低,没有extjs,没有easyUI,没有繁琐的js UI库。只要java基础扎实,再稍懂一点js即可,真的是为java开发人员量身定制的一套框架啊),框架以Spring Framework为核心、Jsp+Dwr...