【问题标题】:jQuery FadeIn element one after another ajaxjQuery FadeIn 元素一个接一个 ajax
【发布时间】:2014-03-10 23:49:49
【问题描述】:

我有一个问题,根据我阅读的其他帖子,这应该不是问题。

我想要做的是通过 ajax 抓取内容,遍历内容并将其附加到 dom。添加元素后,将其淡入,然后重复。出现的问题是,所有元素似乎都是同时淡入的,而不是一个接一个。我尝试过多种不同的方法来解决这个问题。这是最接近我想要的,但是 fadeIn 并没有过渡,它只是出现。非常感谢任何帮助。

HTML

<ul id="search_results"></ul>

JS

function doSearch( jsonPath ){
$(function() {

    $.ajax({ url: jsonPath ,  dataType: 'json',
      async: false,

      success: function(data)  {


          $.each( data, function( key, val ) {
            if( data[key].name != "NA" ){
                setTimeout(function(){
                var html = ('<li class="searchResult" id="pic_' + key +'"><div class="searchProfileResult">' + 
                    '<div class="userimage"><img  title= "' +  data[key].title+'"src="' + data[key].picture +'" /></div></div></li>');
                    $(html).appendTo( $('#search_results') ).hide().fadeIn(2000);
                    }, (key*500) );

            }
          });
    }

    });
});
}
doSearch( jsonPath );

我也试过

$.each( data, function( key, val ) {
        if( data[key].name != "NA" ){

            $('<li class="searchResult" id="pic_' + key +'"><div class="searchProfileResult">' + 
                '<div class="userimage"><img  title= "' +  data[key].title+'"src="' + data[key].picture +'" /></div></div></li>').appendTo( $('#search_results') ).hide().delay(key*500).fadeIn(2000);


        }
      });

我很难过,所以任何帮助都将不胜感激。我

【问题讨论】:

    标签: jquery ajax delay fadein appendto


    【解决方案1】:

    利用 jQuery 中的callback 功能。

    $('item').fadeIn(300,function(){
    
      //this is how you "chain" reactions
      $('item2').fadeIn(300);
    
    })
    

    这对我来说真的是“欺骗”,但它确实起到了我认为的作用。

    var items, speed;
    
    items = $('ul li')
    speed = 300;
    $(document).ready(function(e) {
    
      items.each(function(i, element) {
        $(element).delay(speed*i).fadeIn(speed);
      })
    
    })
    

    Fiddle

    【讨论】:

    • 如何在每个循环中设置它?
    • 我想你很清楚如何设置递归动画函数并使用each 内置的index,element 参数,但这是很多代码。我现在不能让它太容易吗?
    • 我更多地认为使用承诺会是一种更好的方式,但我需要更多地考虑如何在 OP 的代码中实现它
    • 我以前尝试过,但没有运气。我还阅读添加:CSS { -webkit-transition: all 1s ease-in-out; -moz-transition:全 1 缓进出局; -o-transition:全1缓入出局;过渡:全1缓入出局; } 到我的元素,这确实使它淡入,但是,动作非常不稳定,就像组会淡入一样,就好像它试图淡入整个选择器的元素组而不是我正在迭代的项目一样。
    • @Bren1818 是的,css 动画和 javascript 动画不能很好地结合在一起。一般经验法则,如果您使用 js 动画,则不需要 css - 通常会覆盖或产生一些令人讨厌的结果。我知道一个又快又脏的方法,我一会儿再贴一些代码。
    【解决方案2】:

    您应该在 UL 中添加所有 LI,并默认隐藏 LI,然后在完成后调用第一个 LI 的内部方法,使用 promise,例如:

    animateLI($('ul li:first'));
    
    function animateLI($li) {
        $li.fadeIn(2000).promise().done(function () {
            if(!$(this).next().length) return;
            animateLI($(this).next());
        });
    }
    

    看一个简化的 DEMO 给你一个想法:http://jsfiddle.net/Z8v8E/1/

    在您的每个循环中,只需设置一个字符串,将其附加到每个循环之外的 UL,然后在第一个 LI 上调用 animateLI() 方法。

    【讨论】:

    • 我在另一个堆栈溢出帖子中看到了该响应。这个答案的问题是元素只是“出现”他们不会像他们应该的那样淡入淡出。我完全不明白为什么他们不是。
    • @Bren1818 需要隐藏 fadeIn() 的元素,我想你知道但谁知道呢。您应该提供一个相关的 jsFiddle 来复制您的问题,因为您做错了我无法意识到的事情
    • @A.Wolff 你让我的浏览器崩溃了 :( 这让 JS 在一个循环中同时处理了太多事情。
    • @kcdwayne 抱歉,忘记更新 jsfiddle 为:if(!$(this).next().length) return;。更新了,现在应该更好了;)
    • 我会看看我能不能做一个小提琴 - 问题是这是内部数据,外部无法访问。似乎我可以让淡入淡出工作,但每个项目之间没有延迟,或者显示每个项目并且没有淡入淡出。
    【解决方案3】:

    好吧,我终于明白了。这是最终代码:

    function doSearch( jsonPath ){
    $(function() {
    
        $.ajax({ url: jsonPath ,  dataType: 'json',
          async: false,
          //data: myData,
          success: function(data)  {
              $.each( data, function( key, val ) {
                if( data[key].name != "NA" ){
    
                    $('#search_results').append('<li class="searchResult" id="pic_' + key +'"><div class="searchProfileResult">' + 
                '<div class="userimage"><img  title= "' +  data[key].title+'"src="' + data[key].picture +'" /></div></div></li>');
    
                }
              });
    
        }}).done(function(){
    
            var items = $('#search_results li');
            var speed = 2300;
            $(document).ready(function(e) {
    
              items.each(function(i, element) {
                $(element).delay(100*i).fadeTo( "slow" , 1, function() {
    
                });
              })
    
            })
    
    
        });
    });
    

    } doSearch(jsonPath);

    看来我不得不使用fadeTo,然后元素的默认CSS应该是:

    <style>
    #search_results li.searchResult{
        opacity: 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多