【问题标题】:jQuery img src change not immediatejQuery img src 更改不是立即的
【发布时间】:2013-07-19 03:48:43
【问题描述】:

我在一个简单的图片库中使用 jQuery。图片淡出,src 改变,然后淡入。

通常,上一个图像会淡入;只有当元素达到完全不透明度时,才会显示新图像。

什么可能导致延迟和随后跳转到新图像?

HTML

<div id="slide">
    <img src="/img/products/image1.jpg">
</div>

JS

var index = 0;

$(function() {
    if (srcs.length > 1) {
        setInterval("slide(800, 800)", 6000);
    }
});

function slide(o,i) {
    index++;
    if (index == srcs.length) index = 0;
    $("#slide img").fadeOut(o, function() {
        $(this).attr("src", path + srcs[index] + ext);
        $(this).fadeIn(i);
    });
}

编辑:我将fadeIn() 放入fadeOut() 的回调中,但现在每次 都会明显出现问题。图像一直淡出,然后一直淡入,然后发生变化。

解决方案:在this answer 中,.each() 函数在新图像的fadeIn() 期间导致轻微闪烁,但删除.each() 部分完全解决了此问题。

【问题讨论】:

  • 此问题通常发生在您连续 2 次或多次单击查看下一个或上一个按钮时。如果有人在 400 毫秒后单击下一步按钮,则可能会发生此问题。
  • 我在其他地方看到过,但我没有任何按钮。它只是在设定的时间间隔内淡出、变化和淡入。
  • 可能只是需要在某个地方停下来,api.jquery.com/stop 试试看是否有帮助
  • 你能推荐一个停下来的地方吗?
  • 试试 $("#slide img").stop(true, false).fadeOut(....) 你可以玩弄真/假

标签: jquery image src


【解决方案1】:

您可以在预加载功能上尝试这样的操作:

$.each(imgArray, function() {
    var i = new Image();
    i.src = path + this + ext;
});

而不是 ajax 调用,也可以在你的幻灯片功能上试试这个:

$('#slide img').fadeOut(o, function(){
    var that = this;
    this.src = path + srcs[index] + ext;
    this.onload = function() {
        $(that).fadeIn(i);
    };
});

【讨论】:

  • 你的预加载版本不是做同样的事情吗?为什么将this 存储在临时文件中?另外,this 不需要是$(this) 吗?
  • 我使用 temp 变量,所以在使用另一个包装器时不要丢失范围,如果你看得很清楚,你有一个匿名函数作为 fadeOut 回调,并且在其中还有另一个,所以有改变的风险onload 事件回调中“this”的范围。此外,不是 $(this) 因为“onload”方法不是 jQuery 的一部分,它是一个 javascript 方法。然后我使用“$(that)”将原来的“this”扩展为 jQuery 方法,所以可以使用“fadeIn”。如果您需要我解释更多细节,请告诉我。
  • 哦,关于预加载,是的,它基本相同,我只是删除了 jQuery 包装器和 ajax 调用。
  • 好吧,这些都说得通。感谢您的澄清
【解决方案2】:

我建议将fadeIn 函数添加为fadeOut 的回调函数。这样可以确保 -out 动画在新图像加载之前完成。

查看文档:http://api.jquery.com/fadeOut/

$('#slide img').fadeOut(o, function() {
    // Animation complete.
    // Do fadeIn function here
});

【讨论】:

  • 我已经这样做了,但是现在每次加载新图片时都会出现问题。查看修改
  • 看看这个问题/答案;您应该能够验证图像是否首先加载:stackoverflow.com/questions/2435476/…
  • 为什么.each() 在那个答案中是必要的?你能澄清他代码中的评论吗?目前,这在没有.each() 的情况下有效(使用它,在淡入淡出期间会有轻微的“闪烁”)
  • 我认为没有必要——在他的例子中,它被用来遍历多个对象。在你的情况下,它只是一个,所以你应该没问题。主要是 if(this.complete) 应该有助于闪烁/延迟的外观。
【解决方案3】:

这是因为 javascript 在继续执行代码之前不会等待 fadeOut 完成,使用类似这样的东西

    $('#slide img')
         .fadeOut(o, function(){
              $(this).attr('src', path + srcs[index] + ext);
              $('#slide img').fadeIn(i);
         });

它应该等到fadeOut完成后再开始fadeIn。

【讨论】:

  • 现在每次换图都会出现这个问题。参见 OP 中的编辑
  • 您是否尝试过使用 $('#slide img').fadeIn(i) 而不是 .fadeIn(i)?如果代码就像编辑一样,那可能是错字
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多