Skip to main content
 首页 » 编程设计

jQuery .fadeOut 回调到 .click 不起作用

2026年07月24日7落叶无声

我正在开发一款图像 uploader 应用,除了一个仅在 Chrome 中出现的错误之外,一切都运行良好。我已将问题简化为一个未执行的回调。

问题是 .click() 触发器的 .fadeOut 回调未触发。我在 fiddle 中重新创建了一个简化版本,链接如下。第一次单击会启动 fadeOut,当 fadeOut 完成时,不会发生 .click 触发器。单击第二次然后触发触发器。有什么想法吗?

HTML:

<div><input type="file" name="image_file" id="image_file"/></div> 
 
<div class="overlay_wrap"> 
    Overlast 
</div> 
 
<a id="click" href="">Click</a> 

jQuery:

$(document).ready(function() { 
    $("#click").click(function(event) { 
        event.preventDefault(); 
        $('.overlay_wrap').fadeOut(1000, function(event){ 
            $('#image_file').trigger('click'); 
        }); 
    }); 
}); 

http://jsfiddle.net/gg2a7/5/

感谢您的帮助!

编辑:旧的 Fiddle 链接已更改。

请您参考如下方法:

遗憾的是,这行不通。这一切都与浏览器内的计时/线程功能有关。

问题的核心是这样的:<input type="file" />不能以编程方式打开(Loads of questions on SO/Google 上的相关内容)。不仅仅是 Chrome;还有 Chrome。 Firefox 显示一条弹出窗口被阻止的消息,Safari 也会阻止它,并且在 IE 中表单将不会提交。

这背后的原因是因为它存在潜在的安全风险。只有用户操作才能打开此<input type="file" /> 。因为.fadeOut() ,浏览器不再将其识别为用户事件。现在我们回到浏览器的计时/线程,因为这确实有效。没有任何委托(delegate),也没有某种阻止对话框打开的其他线程/超时。

$("#click").click(function(event) { 
    event.preventDefault(); 
    $('#image_file').trigger('click'); 
}); 

JSFiddle .

表明它实际上是 <input type="file" /> ,这是一个带有 <input type="button" /> 的示例这确实有效:

HTML

<input type="button" name="image_file" id="image_file" value="type='button'" /> 

JS

$("#click").click(function(event) { 
        event.preventDefault(); 
        $('.overlay_wrap').fadeOut(1000, function(){ 
            $('#image_file').trigger('click'); 
        }); 
    }); 
 
    $('#image_file').click(function() { 
         alert('ok');    
    }); 

JSFiddle .

长话短说:你不能用淡入淡出效果来做到这一点。您只需打开对话框并隐藏该元素即可,但仅此而已。

$("#click").click(function(event) { 
    event.preventDefault(); 
    $('.overlay_wrap').hide(); 
    $('#image_file').trigger('click'); 
}); 

JSFiddle .