【问题标题】:Content is invisible for half a second when aborting jQuery.fadeTo in Firefox only仅在 Firefox 中中止 jQuery.fadeTo 时,内容在半秒内不可见
【发布时间】:2012-07-23 20:56:42
【问题描述】:

这是 JsFiddle:http://jsfiddle.net/d6mmZ/7/

单击链接 1 和 2 会立即更新文本。单击链接 3 开始缓慢淡出。如果我在此期间单击链接 1 或 2,动画应该会中止并立即显示新文本。

在 Chrome 中,这正是发生的事情。在 Firefox 13/14 中,有半秒的暂停,在此期间内容完全不可见。如果我让淡入淡出完成,链接 1 和 2 会立即生效。

这是 Firefox/jQuery 错误还是我误用了淡入淡出?如果是错误,我可以以某种方式解决这个问题吗?

【问题讨论】:

  • 在我看来像一个 Firefox 错误:/
  • 谁能找到解决办法?
  • 对我来说也像一个 Firefox 错误。

标签: jquery jquery-ui animation


【解决方案1】:

至少在 Firefox 13 中,只需隐藏、强制回流然后再次显示它就可以解决问题:

function showIt(message) {
    var div = $("div");
    div.empty().append(message).stop().hide();
    div[0].offsetWidth; //Force reflow, required
    div.show().css('opacity', 1);
}

http://jsfiddle.net/d6mmZ/28/

【讨论】:

  • 我打算给这个答案 50 赏金,但 SO 似乎阻止了低于 200 的任何事情。这是脑死亡还是什么?...
  • @romkyns 当您选择50 时会显示什么?我也很好奇您为什么最终找到了具有潜在副作用的解决方法,或者您是否设法以某种方式中和它们?
  • “开始赏金”对话框有一个以 200 开头的下拉菜单。我不确定我最终是如何选择这个答案而不是这个答案;如果我现在可以改变它,我可能会......
  • @romkyns 我认为有一些功能只允许在初始赏金之后提供更高的赏金,以防止滥用系统或其他东西。哦,好吧。
  • 各位,请看我回答中的评论。干杯!
【解决方案2】:

这肯定是 Firefox(v14 测试)的错误。

不过,好消息是我发现了三种可供您选择的简单解决方案,它们将保留您当前的网页布局。

如果这还不够,我还为单个 .click() 功能提供了带有备用标记的奖励 jsFiddle。


参考:jsFiddle 1

解决方案 1 HTML:

<div id="status">Initial</div>

解决方案 1 CSS:

#status{
  display: table;
}

参考:jsFiddle 2

解决方案 2 HTML:

<div id="status">Initial</div> <br />

解决方案 2 CSS:

#status{
  display: inline-block;
}

参考:jsFiddle 3

解决方案 3 HTML:

<div id="status">Initial</div>

解决方案 3 CSS:

#status{
  font-size: 28px;
}

如果你只想使用 1 个 jQuery Click 事件监听器 而不是使用一大堆的,你可以考虑这个 Bonus 版本 也使用与上述相同的错误修复 CSS:

参考:jsFiddle Single Click

解决方案单击 HTML:

<div id="status">Initial</div>

<div id="links">
  <a id="a1" href="#">Link 1</a>
  <a id="a2" href="#">Link 2</a>
  <a id="a3" href="#">Link 3</a>
</div>

解决方案单击jQuery:

function showIt(message, opacity, duration) {
    $('#status').stop().html(message).animate({opacity: opacity}, duration, 'easeInExpo');
}    

jQuery('#links a').click(function(event) {

    switch (this.id) {

      case 'a1':
        showIt('Foo!', 1, 0);
      break;

      case 'a2':
        showIt('Bar!', 1, 0);
      break;

      case 'a3':
        showIt('Quux...', 0, 3000);
      break;

    }

    event.preventDefault();

});

【讨论】:

  • 所有这些都具有或可能具有布局副作用,但不确定display: table。
  • 我提供的 3 种完全不同的解决方案最能配合手头的布局(但由于它是一个 Firefox 错误,因此可能有其他使用纯 CSS 的有效解决方案),这反映了我对 的评论” ...这将保留您当前的网页布局" 。根据您接受的答案中的 romkyns cmets(恭喜 Esailija!),我错误地收到了这个赏金。公平地说,我将代表您赞助任何赏金问题 100,只需在此处发布该问题的链接即可。干杯!
  • 没必要:)。表格解决方案可能很好,因为它看起来根本不像表格(所以我知道没有副作用)但它修复了错误。
【解决方案3】:

对于它的价值,在 FF15 测试版中尝试过,它似乎工作正常,所以如果这是 FF13/14 中的错误,很快就会修复。 作为一种解决方法,可以使用.fadeTo(0,1) 而不是.css('opacity', 1)

【讨论】:

  • 感谢您尝试FF15。您提到的解决方法似乎对我的 Firefox 14 没有任何影响。有一个 JsFiddle,以防我做错了吗?
【解决方案4】:

这是我想出的解决方法。适用于 Firefox14

http://jsfiddle.net/d6mmZ/27/

【讨论】:

  • 通常当人们发布小提琴时,他们会尝试至少放置代码的战略部分,如果不是全部的话,这样就可以在不点击的情况下对其进行评估。无论如何,我不认为重新创建 div 是必要的,而且它可能很糟糕,因为它可能比简化的示例包含更多的内容。请参阅 Esailija 的答案,这似乎更可行。
【解决方案5】:

真的不明白为什么在这种情况下您将不透明度设置为 1(或 true),只需在您的 showIt 中使用 .show 即可解决它。

function showIt(message) {
    $('div').empty().append(message)
        .stop()
        .show();
}

编辑:在这里尝试一下:http://jsfiddle.net/nqkS8/

【讨论】:

  • 让 Link 3 淡出,然后点击 Link 1 或 2,你就会明白为什么了。
  • 这并不能解决问题。 div 保留中断时的过渡不透明度。
【解决方案6】:
function showIt(message) {
    //the old code here didnt update 'display' (i use show() for this), and treated the text as a node.
    $('div').text(message)
        .stop()
        .show()
        .css('opacity', '1');
}

然后将fadeTo()更改为fadeOut(),并在动画完成后运行回调:

$('div').fadeOut(1000, function(){
    //this function isnt run until fadeOut is finished
    showIt('Quux...');
});

http://jsfiddle.net/d6mmZ/57/

【讨论】:

  • -1 当点击第三个锚点时,第一个或第二个锚点的内容会淡出:这不应该是这种情况。每当第三个锚点逐渐变为零时,在该过渡期间单击第一个或第二个锚点应立即显示该锚点内容完全不透明。如果您修复您的答案以包含 OP 目标,我将不赞成并赞成。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
相关资源
最近更新 更多