использование jquery для отображения обновлений

#javascript #jquery #fade

#javascript #jquery #исчезать

Вопрос:

У меня есть около 8 продуктов / услуг, и я хочу показывать обновления на основе пользователей, которые использовали такие сервисы, как

 Product 1
smith used this service 8 hours ago

Product 2
neo used this service 10 hours ago
  

Теперь я извлек список пользователей со временем и заполнил его в виде списка

 product 1
<ul class="ncls">
<li>Smith used this service 10 hours ago</li>
<li>Trinity used this service 11 hours ago</li>
<li>Morpheus used this service 12 hours ago</li>
</ul>

Product 2
<ul class="ncls">
<li>Neo used this service 3 hours ago</li>
<li>Oracle used this service 2 years ago</li>
</ul>
  

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

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

 $(".ncls").children().hide().eq(0).show();
        (function showThisTat(){
            $('.ncls li:visible').delay(1500).fadeOut('slow',function(){
                  $(this).appendTo(this);
                  $('.ncls li:first').fadeIn('slow',function(){
                      showThisTat();
                  });
            });
        })();
  

Комментарии:

1. Вы хотите показать 2 отдельных «потока» уведомлений (2 окна уведомлений) или 1 поток, который циклически проходит через продукт 1, а затем переходит к продукту 2?

Ответ №1:

попробуйте это, вы можете изменить настройки по своему усмотрению: вы можете установить минимальную высоту для ul, чтобы она не прыгала вверх и вниз. http://jsfiddle.net/vt5u6/3 /

 $(document).ready(function() {

    var lists = $(".ncls");
    var listsLength = lists.length;
    var rotateDelay = 3500;
    var fadeDelay = 444;

    function swapItems(theList) {
        var current = theList.find("li:visible");
        current.fadeOut();
        if (current.next("li").length == 0) {
            theList.find("li").eq(0).delay(fadeDelay).fadeIn()
        } else {
            current.next("li").delay(fadeDelay).fadeIn();
        }
    }

    function createRotatingList(theList) {
        var listItems = theList.find("li");
        var listItemsLength = listItems.length;

        for (j = 0; j < listItemsLength; j  ) {
            listItems.eq(j).hide();
        }

        listItems.eq(0).show();

        setInterval(function() {
            swapItems(theList)
        }, rotateDelay)


    }

    for (i = 0; i < listsLength; i  ) {
        createRotatingList(lists.eq(i))
    }

});
  

Ответ №2:

$(this).appendTo(this); ?

Может быть;

 $(".ncls").children().hide().eq(0).show();
    (function showThisTat(){
        $('.ncls li:visible').delay(1500).fadeOut('slow',function(){
              $(this).appendTo($(this).parent());
              $('.ncls li:first').fadeIn('slow',function(){
                  showThisTat();
              });
        });
    })();
  

Отмечая $(this).parent()

Редактировать

Если подумать об этом подробнее, благодаря Грегу, showThisTat() будет запускаться дважды каждые 1500 мс, увеличиваясь экспоненциально. Кроме того, первая строка может работать только с первым списком. Итак, вот редактирование;

 $(".ncls").children().hide();
$(".ncls").children(":first-child").show();

    (function showThisTat(list){
        (list ?? $('.ncls li:visible')).delay(1500).fadeOut('slow',function(){
              var currentList = $(this).parent();
              $(this).appendTo(currentList);
              $('.ncls li:first').fadeIn('slow',function(){
                  showThisTat(currentList);
              });
        });
    })();
  

Комментарии:

1. Это ближе (this.parent должен быть $(this).parent, имейте в виду), но проблема по-прежнему заключается в двух списках. Он будет проходить через продукт 1 и игнорировать продукт 2.

2. @GregPettit да, уже исправил $(this).parent() . Функция showThisTat() должна выполняться в обоих списках, поскольку они оба будут выбраны селектором jQuery. Не уверен насчет первой строки.