Jquery:将事件更改为 IE 上的输入文件

IT技术 javascript jquery internet-explorer events
2021-02-08 03:05:02

我有一个上传文件的表单,它应该在文件选择后触发提交。

在 FireFox/Chrome 上运行良好,并在选择文件后提交表单,但我无法在 Internet Explorer 上执行此操作。

已经尝试使用 click/propertychange 但没有任何react。我已经尝试过的一些代码:

$("#attach").attr("onChange", "alert('I changed')");
$("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { ... });

这个输入文件是动态创建的;因为它我.live()用来绑定事件。

有什么建议?

6个回答

我知道这已经晚了几个月,但我在 IE7 中遇到了完全相同的行为;在所有其他浏览器中,文件输入的更改事件发生在文件选择之后。在 IE7 中,只有再次触发文件选择或模糊时才会发生。

这是我最终修复它的方式:

var $input = $('#your-file-input-element');

var someFunction = function()
{
    // what you actually want to do
};

if ($.browser.msie)
{
    // IE suspends timeouts until after the file dialog closes
    $input.click(function(event)
    {
        setTimeout(function()
        {
            if($input.val().length > 0) {
              someFunction();
            }
        }, 0);
    });
}
else
{
    // All other browsers behave
    $input.change(someFunction);
}

从技术上讲,您可以/应该将 hack 条件过滤为仅 IE7,因为 IE8 在更改事件上的行为正确,但它也具有与 IE7 相同的行为,即在与浏览器相关的 chrome 可见时暂停超时(我猜它认为它阻止了 I/ O),所以它按原样工作。

这对我很有效,但我想了解设置时间做了什么?以及它是如何解决问题的?看不懂
2021-03-14 03:05:02
嗨Amr:直到现在才注意到你的评论。它之所以有效是因为 IE 似乎认为像文件对话框这样的对话框本质上是在阻止 I/O:所有 javascript 执行在它打开时都会停止。这意味着,如果您基本上让点击处理程序完成以便 IE 弹出对话框,然后立即调用您的回调(例如,通过将超时设置为零),那么它应该在对话框关闭后立即发生。
2021-03-26 03:05:02
几个月前我发现了相同的解决方案。我认为这应该标记为正确答案,因为完美的解决方案不存在(我在错误跟踪器中与 jQuery 团队讨论了这个解决方法,他们说这很有趣,因为他们认识到 jQuery 无法处理旧 IE 上的输入类型文件更改事件)。
2021-03-28 03:05:02
谢谢你。在 jQuery 核心中仍然没有修复。
2021-04-05 03:05:02
在 IE10 上不起作用:/单击按钮后正在调用回调,但在显示文件对话框之前。
2021-04-12 03:05:02

这真的很晚了,但我遇到了同样的问题,我通过使用<label>带有 Firefox 轻微变通方法的样式标签解决了这个问题

http://jsfiddle.net/djibouti33/uP7A9/

目标:

  1. 允许用户使用标准 html 文件输入控件上传文件
  2. 隐藏标准 html 文件输入控件并应用自己的样式
  3. 用户选择要上传的文件后,自动提交表单

浏览器:

  • 火狐、Chrome、IE8/9、Safari
  • IE7 不起作用,但如果您将该浏览器添加到底部详述的解决方法中,则可能

最初的解决方案:

  1. 通过将文件输入放置在屏幕外来隐藏文件输入。重要的是不要显示:无,因为有些浏览器不喜欢这样。
  2. 向页面添加另一个样式元素(链接、按钮)。
  3. 监听对该元素的点击,然后以编程方式向文件输入发送点击以触发本机“文件浏览器”
  4. 监听文件输入的 onchange 事件(在用户选择文件后发生)
  5. 提交表格

问题:

  1. IE:如果您以编程方式向文件输入发送点击以激活它 (2),以编程方式提交表单 (5) 将引发安全错误

变通解决方案:

  1. 和上面一样
  2. 通过设置标签而不是链接/按钮的样式来利用标签内置的辅助功能(单击标签将激活它的关联控件)
  3. 监听文件输入的 onchange 事件
  4. 提交表格
  5. 出于某种原因,Mozilla 浏览器不会通过单击文件输入来激活它的 .
  6. 对于 Mozilla,监听标签上的点击并向文件输入发送点击事件以激活它。

希望这可以帮助!查看 jsfiddle 有关用于使其全部工作的 html/js/css 的详细信息。

这是我可以为我们正在构建的幻想“单击此图像上传新图像”工作的唯一解决方案。非常感谢!
2021-03-21 03:05:02
非常聪明但简单的解决方案。谢谢你。与 IE8 和 primefaces 5 一起使用。
2021-04-04 03:05:02

像这样格式化:

$("#attach").change(function() { 
  alert('I Changed');
});

更新:在之前回答了另一个问题,我们意识到这是作为jQuery 1.4.2 事件重写的一部分修复的,只需更新到最新版本即可解决IE 中change事件问题<input type="file" />

不...它提交表单,在我可以选择文件之前,感谢尼克的帮助,我会尝试使用 swfupload
2021-03-27 03:05:02
不,仅适用于 Firefox/Chrome、IE8/IE7。我认为有一个重要的信息,这个输入文件是即时创建的,因为我使用 .live() 来绑定事件。谢谢
2021-04-03 03:05:02
只有一个,这是代码:'var e = $("<div id=\""+id+"\" class=\"inner-center compose hidden\">"+$("#compose").html ()+"</div>"); $(".middle-center").append(e);' 输入文件在 $("#compose").html() 中,但我尝试将它放在一个简单的 html 文件中,但也不起作用
2021-04-05 03:05:02
@cmedeiros - 尝试使用 $("#attach").live('click change', function() {
2021-04-06 03:05:02

我使用了以下解决方案。我试图让它尽可能独立。

(function($) {
    if ($.browser.msie == false)
        return;

    $('input[type=file]').live('click', function(e) {
        var self = this;
        var blur = function() {
            $(self).blur();
        }
        setTimeout(blur, 0);
    });

})(jQuery);

这在 IE6 和 IE7 中一直对我有用。

$('#id-of-input-type-file').change(function(){});
仅当我单击屏幕的任何位置时才有效。
2021-04-04 03:05:02