Подтвердить что ты не робот

RoyalSlider: как удалить слайд с помощью класса в качестве селектора

Ресурсы

Я использую royalSlider как плагин. Ниже приведена быстрая ссылка на документацию и API.

На моем сайте слайдер работает как полноэкранный слайдер height: 100%; width: 100%.

Структура содержимого

Структура моего сайта довольно проста: у меня есть слайды, которые я использую в качестве обложки, позволяет называть их .cover, за которыми следует слайд, содержащий дополнительную информацию. Давайте назовем их .sub.

Content Cover Nr. 1
  Subslide Content Nr. 1
Content Cover Nr. 2
  Subslide Content Nr. 2
Content Cover Nr. 3
  Subslide Content Nr. 3
Content Cover Nr. 4
  Subslide Content Nr. 4

Если это проще понять, вы можете проверить прямой сайт здесь.


Внутри функции, которая добавляет мои вспомогательные слайды, я создаю три кнопки с правой стороны для прокрутки вверх, прокрутки вниз и закрытия текущего слайда. Прокрутка работает отлично. (Проверьте здесь main.js, строка 177)

Проблема

Браузер привязывает кнопки all, выбранные с помощью $(p.sl_button) к тому же суб слайду, вместо привязки each к его собственному родительскому объекту.

Трудно объяснить, легко попробовать. Если вы, например:

  • Open Subslide Number 5
  • Open Subslide Number 2
  • Выделите номер 5 подписок
  • Нажмите кнопку Закрыть (X с красным фоном)

система "ломается". Вместо закрытия Subslide Number 5 он закрывает номер 2 подклада (который был последним, вызывала вызываемую выше функцию.

Как я могу исправить эту проблему?

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

// Append Slides by ID and Database
function appendIt(num_id) {
    var $parid = num_id.parents('.rsContent').attr('id');
    var $sub_id = sliderInstance.currSlideId + 1;      
    // get current slide id & increase by 1
    // append html slide
    sliderInstance.appendSlide(eval($parid), $sub_id);
    sliderInstance.next();

    // close button on sub slides
    $('.scrolldown').on('click', function(){
        sliderInstance.next();
    });
    // Scroll Slide Up
    $('.scrollup').on('click', function(){
        sliderInstance.prev();
    });
    // Close Subslide
    $('.close').on('click', function(){
        $('#'+$parid+' p.sl_button').addClass('in');
        sliderInstance.prev();
        setTimeout( function(){sliderInstance.removeSlide($sub_id);}  , 600 ); 
    });
};

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


royalSlider Documentation and API

Текущая версия веб-сайта

Мой файл Javascript/jQuery

4b9b3361

Ответ 1

Я нашел решение самостоятельно, которое работает для меня:

Как я связываю кнопки в следующей функции:

// Append Slides by ID and Database
function appendIt(num_id) {
    var $parid = num_id.parents('.rsContent').attr('id');
    var $sub_id = sliderInstance.currSlideId + 1;      
    // get current slide id & increase by 1
    // append html slide
    sliderInstance.appendSlide(eval($parid), $sub_id);
    sliderInstance.next();

    // close button on sub slides
    $('.scrolldown').on('click', function(){
        sliderInstance.next();
    });
    // Scroll Slide Up
    $('.scrollup').on('click', function(){
        sliderInstance.prev();
    });
    // Close Subslide
    $('.close').on('click', function(){
        $('#'+$parid+' p.sl_button').addClass('in');
        sliderInstance.prev();
        setTimeout( function(){sliderInstance.removeSlide($sub_id);}  , 600 ); 
    });
};

Каждый раз, когда кто-то открывает вспомогательные слайды все на странице работают как селектор для одной и той же подписки. Чтобы исправить это, я использовал следующие ID моих подселей:

#sl1
#sl1_sub
#sl2
#sl2_sub

Поскольку каждая оглавление начинает использовать тот же ID, добавляя a _sub, я создал var, который нацелен только на кнопки с помощью селектора class в сочетании с его родительским ID:

// Append Slides by ID and Database
    var $parid = num_id.parents('.rsContent').attr('id');
    var $sub_id = sliderInstance.currSlideId + 1;

    // THIS is the new line
    var $subtarget = $('#' + $parid + '_sub'); // 

    // added the var $subtarget to every button
    $subtarget.find('.scrolldown').on('click', function(){
        sliderInstance.next();
    });
    // added the var $subtarget to every button
    $subtarget.find('.scrollup').on('click', function(){
        sliderInstance.prev();
    });
    // added the var $subtarget to every button
    $subtarget.find('.close').on('click', function(){
        $('#'+$parid+' p.sl_button').addClass('in');
        sliderInstance.prev();
        setTimeout( function(){sliderInstance.removeSlide($sub_id);}  , 600 ); 
    });
};

Спасибо всем, кто не спешил задуматься над моим вопросом и дать ответ!

Ответ 2

В вашем коде логика такова:

оригинал:

+---------+-------------+---------+
| slide   | currSlideId | $sub_id |
+---------+-------------+---------+
| sl0     | 0           |         |
| sl1     | 1           |         |
| sl2     | 2           |         |
| sl3     | 3           |         |
| sl4     | 4           |         |
+---------+-------------+---------+

, затем попытаемся добавить суб слайд:

+---------+-------------+---------+
| slide   | currSlideId | $sub_id |
+---------+-------------+---------+
| sl0     | 0           |         |
| sl1     | 1           |         |
| sl2     | 2           |         |
| sl3     | 3           |         |
| sl4     | 4           |         |
| sl4_sub | 5           | 4+1     |
+---------+-------------+---------+

, затем пытается добавить другой суб слайд над первым слайдом:

+---------+-------------+---------+
| slide   | currSlideId | $sub_id |
+---------+-------------+---------+
| sl0     | 0           |         |
| sl1     | 1           |         |
| sl1_sub | 2           | 1+1     | Notice the currSlideId are always auto sort the id,
| sl2     | 2->3        |         | so the slides below sl1_sub are auto increment by 1.
| sl3     | 3->4        |         |
| sl4     | 4->5        |         |
| sl4_sub | 5->6        | 4+1     |
+---------+-------------+---------+

Попытка удалить первый суб-слайд:

+---------+-------------+---------+
| slide   | currSlideId | $sub_id |
+---------+-------------+---------+
| sl0     | 0           |         |
| sl1     | 1           |         |
| sl1_sub | 2           | 1+1     | 
| sl2     | 3           |         | 
| sl3     | 4           |         |
| sl4_sub | 6->5        | 4+1     | It recorded $sub_id with value 4+1, so it removed the
+---------+-------------+---------+ sl4 slide.

Так что вам нужно, чтобы правильно установить текущий слайд и удалить его.
Это может помочь вам получить правильный идентификатор слайда. Вы должны получить текущий идентификатор слайда, каждый раз, когда вы запускаете .close:

$subtarget.find('.close').on('click', function(){
    var $sub_id = sliderInstance.currSlideId; // this line should be added.
    $('#'+$parid+' p.sl_button').addClass('in');
    sliderInstance.prev();
    if ($parid == 'sl0') $skip_0=false;
    else if ($parid == 'sl1') $skip_1=false;
    else if ($parid == 'sl2') $skip_2=false;
    else if ($parid == 'sl3') $skip_3=false;
    else if ($parid == 'sl4') $skip_4=false;
    else if ($parid == 'sl5') $skip_5=false;
    else if ($parid == 'sl6') $skip_6=false;
    else if ($parid == 'sl7') $skip_7=false;
    else if ($parid == 'sl8') $skip_8=false;
    setTimeout( function(){sliderInstance.removeSlide($sub_id);}  , 600 ); 
});