IE9文件输入使用Javascript触发

我有一个post在这里:

变化在IE9中表现得很奇怪

但是,我遇到了一个关于文件上传的表单处理的新事件,如果有人遇到这个问题,我很好奇。

我最初的问题是我无法使用onchange事件工作,我想也许这是我的javascript的一个问题,但我发现它与表单被激活的方式有关。

我有一个文件输入

 

现在我做了两件事。

我隐藏了输入并创建了一个按钮(用于更好的样式控制)来激活输入。

   

然后JS用于两者之间的交互:

 $("#mybutton").click(function() { $("Input[type=file]").click() }; 

当然是表单的提交(我在本例中使用parent,但是在我的实际代码中我使用了表单id)。

 $("input[type=file]").change(function() { $(this).parent().submit(); }); 

当我点击“mybutton”时,预期的结果确实发生了,我的浏览窗口打开,让我从我的电脑中选择一个文件。 此外,当我在IE以外的所有浏览器中更改文件时,会触发onchange事件。 现在,如果我取消隐藏表单并手动单击“浏览”按钮并选择一个文件,则会触发onchange事件。 所以基本上浏览器会点击实际文件按钮而不是执行$(“input [type = file]”)。click()

有人知道怎么修这个东西吗?

如前所述,IE在提交包含文件输入的表单时非常严格。 必须通过真正的鼠标单击来触发文件输入以允许表单提交。 另外,IE9和文件输入似乎存在错误。

好消息是有一种方法可以使用标签绕过IE的安全限制:

  1. 创建链接到文件输入的常规标签标记。 标签将像往常一样触发输入文件。
  2. 使用CSS将标签伪装成一个按钮。
  3. 必须显示文件输入(对于IE8),但可以使用“visibility:hidden”隐藏。 IE8会接受这个黑客攻击。

如果我没有太多错误,你不能改变它,因为这是(原本)旨在保护用户的隐私,无论如何在没有明确的用户许可/行动的情况下上传文件。

  1. 确保你的代码在$("document").ready(function(){... here..});

  2. .live("change", function(){});连接时似乎是文件输入.live("change", function(){}); 不太好用

其他样式的东西是别的东西,但CSS并不是那么复杂 – 漂亮的文件上传