Есть ли способ уничтожения FlexSlider

Я пытаюсь повторно инициализировать FlexSlider без обновления страницы, когда новый список галереи вызывается асинхронно.

Я бы подумал, что процедура ниже будет работать, но это не так. Похоже, что первый FlexSlider сохраняется, даже если новые изображения успешно загружены.

есть ли способ уничтожить, а затем восстановить галерею?

спасибо

function flexInit() {
        $('.flexslider').flexslider({
            animation: "slide",
            controlsContainer: ".paginator",
            manualControls: 'a',
            after: function(slider){
                if(slider.atEnd == true)    {
                    // ??? slider.destroy;
                    galBuild();
                }
            }
        });
    }

    function galBuild() {
            $.getJSON("/gallery/next/"+galID, function (data) {
            var results = data.objects;
            var list = $(".flexslider ul.slides");
            var i = 0;
            $.each(results, function () {

                list.append('<li><p>' + results[i].title + '</p><img src="' + results[i].src + '"><p class="flex-caption">' + results[i++].caption + '</p></li>');

            });

            flexInit(); 

            });
    }

    galBuild();

3 ответов


Я использую другой подход, т. е.

вы запустили один flexslider:


    $('#element).flexslider({
      animation: "slide",
      controlNav: false,
      directionNav: true
    });

когда я хочу изменить слайды в ранее созданном слайдере и перезапустить его, id делает следующие вещи:

  • создание временного div:

    $('#element).before('
        <div id="element_temp" class="flexslider"></div>
    ');
    
  • удалить div с ранее созданным слайдером

    $('#element).remove();
    
  • вставить новый список слайдов во временное div:

    var html = `
    <ul class='slides">
    <li><img src="link to image" /></li>
    <li><img src="link to image" /></li>
    <li><img src="link to image" /></li>
    </ul>`;
    $('#element_temp').html(html);
    
  • запустить flexslider на temp div

    $('#element_temp').flexslider({
      animation: "slide",
      controlNav: false,
      directionNav: true
    });
    
  • измените идентификатор div с element_temp на element

    $('#element_temp').attr('id','element');
    

и он работает с несколькими flexliders


Роб я исследовал это и нашел решение

вам нужно изменить свои функции следующим образом

function flexInit() {
    $('.flexslider').flexslider({
        animation: "slide",
        controlsContainer: ".paginator",
        manualControls: 'a',
        after: function(slider){
            if(slider.atEnd == true)    {
                slider.addSlide(galBuild());
            }
        }
    });
}


function galBuild() {
   $.getJSON("/gallery/next/"+galID, function (data) {
    var results = data.objects;
    var i = 0;
    $.each(results, function () {
       return ('<li><p>' + results[i].title + '</p><img src="' + results[i].src + '"><p class="flex-caption">' + results[i++].caption + '</p></li>');
    });

   });
}

flexInit();

Также вам нужно сделать некоторые косметические изменения в flexSlider.файл JS в ползунок.update


самый простой способ-удалить flexscroll из набора данных элементов

function flexInit() {
    $('.flexslider').flexslider({
        animation: "slide",
        controlsContainer: ".paginator",
        manualControls: 'a',
        after: function(slider){
            if(slider.atEnd == true)    {
                slider.addSlide(galBuild());
            }
        }
    });
}
//this remove flexslider form element dataset
$('.flexslider').removeData("flexslider");

и теперь вы можете позвонить

flexInit();

и ваш flexslider будет воссоздана.