解决Extjs与DWR3文件上传冲突:自定义处理方式

4星 · 超过85%的资源 需积分: 10 38 下载量 133 浏览量 更新于2024-09-18 1 收藏 28KB DOC 举报
在使用Extjs的fileuploadfield结合DWR3进行文件上传时,开发者可能会遇到一个常见的问题:首次调用能够成功,但在不刷新页面的情况下,第二次调用就会失败。这个问题主要源于DWR3在处理文件上传请求时的工作机制。 DWR在检测到用户传递的是一个file类型的Input时,会自动创建一个新的form,并将文件输入元素(file input)添加到该form中以进行提交。同时,为了保持页面的可见性,DWR会将原始的file input复制并插入回原位置,这在常规情况下的确没有问题。然而,对于Extjs的fileuploadfield而言,其内部结构比较特殊,它实际上是由一个文本输入框(textinput field)和一个按钮组成的,真实文件输入隐藏在其下。当DWR的这种处理方式与Extjs的隐藏结构冲突时,Extjs无法找到其原有的file input,导致后续操作失效。 要解决这个问题,关键在于控制DWR的行为,避免其直接操作Extjs组件的底层结构。在DWR的engine.js(通常位于dwr.jar的org\directwebremoting目录下)中,可以看到两个可能引起问题的代码行:第1808行的`var clone = value.cloneNode(true);`和第1812行的`value.parentNode.insertBefore(clone, value);`。这两个操作涉及到了对file input的克隆和替换。 为避免这些问题,建议注释或删除这些代码,然后在调用文件上传函数之前,手动处理Extjs组件的file input。例如,可以使用以下代码: ```javascript var fileField = form.findField('myuploadfield'); var fileInputDom = fileField.fileInput.dom; fileField.fileInput.dom = fileInputDom.cloneNode(true); fileInputDom.parentNode.insertBefore(fileField.fileInput.dom, fileInputDom); // 调用DWR服务上传文件 myfileService.uploadFile(fileInputDom, otherParams, function(callBackFunc){ alert('uploadok'); }); ``` 通过这种方式,我们可以确保DWR不会干扰Extjs组件的内部逻辑,从而实现连续的文件上传功能,即使在不刷新页面的情况下也能正常工作。需要注意的是,这可能需要根据具体项目的配置和代码结构进行调整,以确保改动不会影响其他功能的正常运行。