Activate timeago on newly added elements only

匆匆过客 提交于 2019-12-22 00:20:39

问题


I'm trying to fix the problem of not repeating the timeago function to elements that have it already, but adding it to the ones that don't have it. I'm trying this but newly added abbrs are not getting activated

<abbr title="2011-09-15T12:46:26" class="timeago">less than a minute ago</abbr>


function activate_timeago(){
        setInterval(function(){
            $('.timeago').each(function(){
                if ($(this).data('active')!='yes'){
                    $(this).timeago();
                    $(this).data('active','yes');   
                }
            });
        },60000);
    }

any ideas?


回答1:


i would not activate them with an interval like you are trying, but rather immediately when creating the new item, just call a function like this one

function activate_timeago(el){
    $(el).each(function(){
        if (!$(this).hasClass('processed')){
            $(this).timeago();
            $(this).addClass('processed');   
        }
    });
}

after the ajax callback for fetching new items is done, just call:

var elements = $('#container .new');
activate_timeago(elements);

edit just so there is no confusion, the $('#container .new') selector is not default jQuery, new is a css class like any other class, you could add the class new to your elements when you do the ajaxcall, or you could select them in another way since you probably have just added them to the DOM in your ajax callback you already might have them available in an array ... end edit

but, if you really want to continue on the interval part use this:

function activate_timeago(){
    setInterval(function(){
        $('.timeago:not(.processed)').each(function(){
                $(this).timeago();
                $(this).addClass('processed');
            }
        });
    },60000);
}

this function you'd only call once at the page load, downside of option two, they are not made into timeago immediately, but only after the next time the interval hits.




回答2:


ok this seems to work

function activate_timeago(){
    $('.timeago').each(function(){
        var $this = $(this);
        if ($this.data('active')!='yes'){
            $this.timeago().data('active','yes');    
        }
    });
    setTimeout(activate_timeago, 60000);
}

Thanks to eddiemonge on #jquery



来源:https://stackoverflow.com/questions/7436124/activate-timeago-on-newly-added-elements-only

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!