Активировать timeago только для новых добавленных элементов - PullRequest
1 голос
/ 15 сентября 2011

Я пытаюсь решить проблему не повторения функции timeago для элементов, у которых она уже есть, а для добавления к тем, у которых ее нет. Я пытаюсь это, но недавно добавленные abbrs не активируются

<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);
    }

есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

я бы не активировал их с таким интервалом, как вы пытаетесь, а скорее сразу при создании нового элемента, просто вызовите функцию, подобную этой

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

после того, как обратный вызов ajax для извлечения новых элементовготово, просто позвоните:

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

edit , чтобы не было путаницы, селектор $('#container .new') не является jQuery по умолчанию, new является классом css, как и любой другой класс,вы можете добавить класс new к вашим элементам, когда вы делаете ajaxcall, или вы можете выбрать их другим способом, так как вы, вероятно, просто добавили их в DOM в вашем обратном вызове ajax, вы уже могли бы иметь их в массиве.. end edit

но, если вы действительно хотите продолжить на интервальной части, используйте это:

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

эта функция будет вызываться только один раз на страницезагрузить, минус второй вариант, они не превращаются в timeago сразу, а только после следующего попадания интервала.

0 голосов
/ 15 сентября 2011

ок, похоже, работает

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

Благодаря eddiemonge на # jquery

...