我有一个上传文件的表单,它应该在文件选择后触发提交。
在FireFox / Chrome上,它运行良好,并在文件选择后提交表单,但我无法在Internet Explorer上执行此操作。
已经尝试过click / propertychange但没有任何反应。我已经尝试了一些代码:
$("#attach").attr("onChange", "alert('I changed')");
$("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { ... });
此输入文件即时创建;因为它,我使用.live()
绑定事件。
有什么建议吗?
答案 0 :(得分:41)
我知道这已经晚了几个月,但我在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),因此它按原样工作。
答案 1 :(得分:11)
这已经很晚了,但是我遇到了同样的问题,我通过使用样式化的<label>
标签解决了这个问题,并为Firefox做了一些解决方法。
http://jsfiddle.net/djibouti33/uP7A9/
目标:
浏览器:
初始解决方案:
问题:
变通方法解决方案:
希望这有帮助!查看jsfiddle,了解用于使其全部工作的html / js / css的详细信息。
答案 2 :(得分:10)
将其格式化为:
$("#attach").change(function() {
alert('I Changed');
});
更新:在之前回复another question后,我们意识到这是jQuery 1.4.2 event re-write的一部分,只需更新到最新版本即可解决{{1} IE中change
的事件问题。
答案 3 :(得分:3)
我使用了以下解决方案。我试图让它尽可能地自成一体。
(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);
答案 4 :(得分:2)
在IE6和IE7中,这一直对我有用。
$('#id-of-input-type-file').change(function(){});
答案 5 :(得分:2)
这可能是IE中带有输入字段的problem with a race condition。通过使用setTimeout,执行的函数将注册发生了更改。当在onChangeEvent中执行UI代码时,该事件尚未在IE中显示。
我通过在我的更改处理程序中执行以下操作来解决类似情况:
if (jQuery.browser.msie) { setTimeout(DoSomeUIChange, 0); } else { DoSomeUIChange(); }
DoSomeUIChange在事件队列上的当前代码之后执行,因此删除了竞争条件。
答案 6 :(得分:2)
我遇到了与IE相同的问题(包括IE 9)。 UI逻辑是:
div
元素会触发click
上的file-input-element
事件,以便用户点击div
触发器文件打开对话框change
事件处理程序绑定到file-input-element
,以确保在文件打开对话框关闭时提交form
应用程序(在iframe中运行)就像Chrome和FF上的魅力一样。但很快我发现它不适用于IE,因为用户选择了一个文件并关闭了表单未提交的对话框。
最终解决方案是删除逻辑#1“点击文件输入元素上的div
元素触发器click
事件”并让用户直接点击file input element
,然后它有效。
div
元素的原因是我们想要隐藏浏览器渲染的控件,因为我们在背景图像中有所有内容。但是,将display
设置为none
会使控件无法响应用户交互事件。因此,我们将file-input-element
移动到视图端口之外,并使用div
元素替换它。由于这不适用于IE,我们最终会移回file-input-element
并将其opacity
设置为0.在不支持opacity
的IE 8或更低版本上,我们使用过滤使其透明:
#browse {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
filter: alpha(opacity=0);
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
}
答案 7 :(得分:2)
我找到了这个解决方案 在HTML隐藏文件元素中(不要使用display:none,在IE中不起作用),准备IE的onchange事件:
<div style="width: 0px; height: 0px; overflow: hidden;">
<input id="ifile_template" type="file" onchange="this.focus(); this.blur();"/>
</div>
在javascript for IE绑定函数模糊,而对于FF,CH绑定函数change():
$(iFile).blur(
function () {
...some code...
}
);
// FF, CH
$(iFile).change(
function () {
...some code...
}
);
答案 8 :(得分:1)
在IE onchange事件中直接填写html标签时工作正常。像:
<input type="file" onchange="uploader.upload()" />
答案 9 :(得分:1)
对于IE您可以使用“onfocus”事件来捕获上传文件的更改。关闭文件浏览对话框后,将触发onfocus事件。您可以通过在页面中添加以下行来检查:
<input type="file" onfocus="javascript:alert('test');" />
关闭对话框后,会显示警告信息。
此解决方案仅适用于IE,不适用于FF或Chrome。
答案 10 :(得分:1)
我的解决方案:
setInterval(function()
{
if ($.browser.msie) $("input[type=file]").blur();
},500);
不漂亮,但它有效。 ; d
答案 11 :(得分:0)
我可以确认,至少它只在模糊事件发生后才有效,类似于IE中的收音机和复选框。我可能不得不添加某种视觉元素供用户点击并告诉我他们何时选择了他们的文件。
跛。
答案 12 :(得分:0)
$("#attach").attr("onChange", "alert('I changed')");
它适用于IE,但如果你想模仿“实时”行为,你应该在创建它时为每个新元素添加“onChange”属性。
答案 13 :(得分:0)
jQuery似乎无法识别propertychange
事件。我使用IE的attachEvent()
将其添加到DOM节点。
var userChoseFile = function($input) {
// ...
}
var $input = $(/* your file input */);
$input[0].attachEvent('onpropertychange', function() {
userChoseFile($input);
});
答案 14 :(得分:0)
看看这些小提琴http://jsfiddle.net/uP7A9/531/
HTML:
<input type="file" name="PicturePath" id="fileUpload" accept=".png,.jpg,.jpeg,.gif,.tif" />
jQuery的:
$("input[type=file]#fileUpload").on("change", function () {
alert('hi')
});
适用于所有经过测试的浏览器。