当javascript触发对话框打开时,如何使IE8 / 9提交输入类型=“文件”

时间:2013-04-19 21:50:46

标签: javascript internet-explorer dom

如果我在某个地方有input type="file",并且点击某个链接,它也会触发对文件输入的点击。用户选择一个文件。

在IE8 / 9中,如果用户点击button type="submit",则第一次点击会清除文件输入中的所有数据,然后第二次提交一个空白表格。

如何允许提交input type="file"发布javascript点击触发器。

一些注意事项:

  • 由于另一次点击事件而触发了点击。在活动中。
  • 输入类型=“文件”未设置为显示:无。
  • 没有尝试操纵用户输入

想法?

2 个答案:

答案 0 :(得分:5)

我一直在努力解决同样的问题,而且我还没有找到一个干净的解决方案。

然而,我发现了一种解决方法。请注意下面的解决方案完全忽略了最佳实践(以我的拙见),如果有人有更好的,更符合标准的方法,请在此处发布。

修复按钮点击事件

经过大量的研究,似乎很多人都在使用一种技巧,他们绝对将<input type="file" />立即放在按钮上,并将不透明度设置为零。这意味着,对于用户来说,看起来他们正在点击按钮,但浏览器将其视为点击<input type="file" />(因此避免了IE中提到的问题)。我很惊讶地看到Quirksmode实际上推荐了这种方法。

修复按钮样式

现在,这确实引入了更多的美容问题;您可能会发现按钮不再触发:hover:active CSS伪类(除非您将<input type="file" />放在按钮内),并且您的鼠标光标可能是默认鼠标光标,尽管您已将任何CSS应用于<input type="file" />或按钮。

使用JavaScript解决这些类很容易解决(我会留给你),但光标仍然是一个问题。奇怪的是,您可以设置cursor右侧path<input type="file" \>的样式,但这不会影响它的Browse按钮。不幸的是,这个(现在是透明的)按钮可能会超出样式按钮的某些部分,导致悬停时出现默认光标。

为了解决这个问题,我偶然发现了this work-around(JSFiddle here)。基本上,有人将事件绑定到其按钮的mousemove事件,并且每次将鼠标悬停在按钮上时,将<input type="file" />的右侧放在鼠标光标下。如果按钮没有固定大小且设置为<input type="file" />,则可能还需要增强一点,以阻止从按钮的坐标外部点击overflow: hidden

<强>结论

总的来说,我发现造型<input type="file" />不值得;如果你真的希望它看起来不错,那么你可能会在某些时候使用JavaScript(如果你试图支持禁用JavaScript的人,那就不好了)。我也不知道这对移动设备有何影响。

如果您要定位支持Html5 File API的较新浏览器,请实施AJAX拖放上传解决方案(here是一个很好的解决方案),并完全摆脱<input type="file" /> 。对于那些不支持它的人(较旧的浏览器和禁用了JavaScript的浏览器),只需将没有样式的<input type="file" />作为后备保留。

答案 1 :(得分:2)

我发现使用jquery fileupload extension会更好。它比我手动操作时更能处理错综复杂的错误。它基本上做了jquery为x-browser dom操作&amp; ajax但输入类型=“文件”。