【问题标题】:slimScroll destroy doesn't unbind the scroll eventsslimScroll destroy 不会取消绑定滚动事件
【发布时间】:2014-11-06 15:25:01
【问题描述】:

我正在使用slimScroll jQuery plugin,似乎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
    });
});

【问题讨论】:

  • 我在当前项目中所做的,虽然这不是最有效的方法,但在我使其可滚动之前克隆我希望使其可滚动的元素。而当我想摆脱它时,我只是替换它。

标签: javascript jquery slimscroll


【解决方案1】:

问题是插件没有删除注册的事件。这应该可以解决问题:

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

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

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

});

【讨论】:

  • 谢谢它,它似乎可以工作,需要再测试一下,但是......你为什么用jQuery._而不是$.
  • 好的,我看到“ jQuery 的事件数据仍然可以通过 jQuery._data(element, "events") 访问,但请注意这是一个未记录的内部数据结构,不应修改。 "听起来有点像 hackFix,但我想这是唯一的方法?
  • 当尝试在另一个插件中使用 $._removeData( $elem[0], "events" ); 来禁用 slimScroll 时,我收到了错误 undefined is not a function
  • @Alvaro 该数据结构用于在 jQuery 中存储已注册的事件处理程序。尽管它没有被记录在案,但它并不广为人知并被广泛使用。在 jQuery 1.9 之前,“事件”对象是从 $('selector').data('events') 访问的,并且在 1.9 和更高版本中已弃用。在 1.9 之后我们应该使用 $._data(element, key)。至于您的最后一条评论-您确定在其他插件内部 $ 指的是 jQuery 对象吗?另外你使用的jQuery版本是什么?
  • $elem 是否包含任何匹配的元素?您可以为此添加检查: var $elem = $('.scrollable'); if($elem[0]) {// 获取和移除事件数据}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2015-01-15
  • 2023-03-23
  • 2012-07-04
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多