【问题标题】:jQuery .fadeOut Callback to .click Not WorkingjQuery .fadeOut 回调到 .click 不工作
【发布时间】:2013-03-04 20:49:40
【问题描述】:

我正在开发一个图片上传器应用程序,除了一个仅在 Chrome 中出现的错误之外,一切都运行良好。我已将问题简化为一个未通过的回调。

问题是 .click() 触发器的 .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 链接已更改。

【问题讨论】:

  • 不知何故将 trigger() 放在回调中似乎推迟了事件,看起来它是 Chrome 的安全停止事件,可能是因为它认为它不是用户生成的或类似的东西。只是将其从回调中取出即可解决问题,而使用常规 setTimeout 进行测试似乎也有同样的问题,因此它与 trigger() 的延迟有关。有一个答案here 处理了一个类似的问题。
  • another answer 支持 adeneo 的说法。
  • 所以没有办法解决这个问题?

标签: jquery callback click fadeout


【解决方案1】:

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

问题的核心是:&lt;input type="file" /&gt; 不能以编程方式打开Loads ofquestions on SO/Google 上关于它的资料)。不仅是 Chrome; Firefox 显示弹出窗口被阻止的消息,Safari 也会阻止它,并且在 IE 中表单不会提交。

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

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

JSFiddle.

为了表明它实际上是&lt;input type="file" /&gt;,下面是一个带有&lt;input type="button" /&gt; 的示例,确实工作:

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.

【讨论】:

  • 这令人失望,但我可以解决它。奇怪的是,当我在 Firefox 和 IE 10 上进行测试时,它起作用了。 FF 给了我和“你想允许这个网站的弹出窗口吗”,而 IE10 根本没有给出任何警告,只是工作。
  • 这让我发疯了。我很困惑为什么它在事件回调中起作用,而不是在事件回调中的回调。看来我得解决它了。
【解决方案2】:

将您的 $('.overlay_wrap').fadeOut(1000,complete) 更改为

$('.overlay_wrap').fadeOut(1000);
complete();

【讨论】:

  • 这不会在执行完整功能之前等待淡入淡出完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2012-11-19
  • 2013-10-23
相关资源
最近更新 更多