2014-11-06 3 views
3

Я использую slimScroll jQuery plugin, и кажется, что опция destroy не полностью разрушает эффект плагина на сайте.slimScroll destroy не отвязывает события прокрутки

Например, если вы попытаетесь уничтожить плагин, а затем прокрутите ранее прокручиваемый контент, функция прокрутки сайта перестанет работать. Вы сможете прокручивать, используя полосу прокрутки, а не с помощью колеса мыши/трекпада.

Here's a reproduction of the bug

Обратите внимание нескольких вещей:

  • скроллинг с колесиком мыши/трекпадом над ранее прокруткой блоками элементов прокручивающейся.
  • Прокрутка за пределами ранее прокручиваемого элемента работает должным образом.
  • Если вы прокрутите slimScroll до самого нижнего уровня, прежде чем уничтожить его, при его уничтожении он работает правильно, как и должно быть в любом случае.

У меня уже есть reported it in the repository, но ответов нет. Кажется, это заброшено. Я попробовал different предложил solutions, но никто из них не работает должным образом.

Отсутствие надлежащего способа уничтожить плагин, как представляется, проблема ...

Используется код в jsfiddle:

$('.scrollable').slimScroll({ 
    allowPageScroll: true, 
    height: '250px', 
    size: '10px', 
    alwaysVisible: true 
}); 

$('.destroy').click(function(){ 
    $('.scrollable').slimScroll({ 
     destroy:true 
    }); 
}); 
+0

Что я сделал в текущем проекте, хотя это не самый эффективный способ, это клонирование элемента, который я хочу сделать прокручиваемым, прежде чем сделать его прокручиваемым. И когда я хочу избавиться от него, я просто заменю его. – MisterBla

ответ

8

Проблема заключается в том, что плагин не вынимая зарегистрированных событий , Это должно исправить эту проблему:

$('.destroy').click(function(){ 
    $('.scrollable').slimScroll({ 
     destroy:true 
    }); 

    var $elem = $('.scrollable'), 
    events = jQuery._data($elem[0], "events"); 

    if (events) { 
     jQuery._removeData($elem[0], "events"); 
    } 

}); 
+0

Спасибо за это, похоже, что нужно работать, нужно протестировать его немного больше, но ... Почему вы используете 'jQuery._' вместо' $ .'? – Alvaro

+1

Хорошо, я вижу, что «данные события jQuery могут быть доступны через jQuery._data (элемент,« события »), но имейте в виду, что это внутренняя структура данных, которая недокументирована и не должна быть изменена». Звучит вроде * hackFix *, но, полагаю, это единственный способ? – Alvaro

+0

При попытке использовать '$ ._ removeData ($ elem [0]," events ");' внутри другого плагина для отключения slimScroll. Я получаю сообщение об ошибке: undefined не является функцией. – Alvaro

Смежные вопросы