仅当我添加文件输入时才显示错误。我在成功事件中返回 FALSE。仅在 Opera 中发生。
知道哪里有问题吗?
jQuery 创建一个隐藏的 IFRAME 来提交表单,因为这是以 AJAXy 方式处理文件上传的唯一方法。
这个问题的根本原因是当一个空的 iframe 被插入到文档中时 Opera 会触发 onload。jQuery 脚本没有预料到这个初始的 onload 事件,认为提交表单已经完成,并得出没有成功的结论。它在 http 上不容易发生的原因可能与 Opera 必须加密文件上传有效负载时的时间不同有关。
如果插入 IFRAME 的同一脚本也启动将文档加载到 IFRAME 中,则其他浏览器将等到加载文档完成加载并仅触发一个加载事件。(或类似的东西 - 在这种特定情况下,启动文档加载的脚本是从超时运行的,所以它甚至不是同一个脚本)。
我建议的解决方法是增强针对此问题已经存在的解决方法尝试:
if (!isXml && (doc.body == null || doc.body.innerHTML == '' ))
并在 if 语句中检查 IFRAME 中文档的 URL 是否仍然是初始 javascript:false :
if (!isXml && (doc.body == null || doc.body.innerHTML == '' || doc.URL=='javascript:false' ))
这应该足以确保 jQuery 等到新文档完成加载。
迁移到 jQuery 1.5 和最后一个 jQuery Form 插件 (2.63) 后,这个问题看起来已经解决了