【问题标题】:selecting list element with mousewheel scroll使用鼠标滚轮滚动选择列表元素
【发布时间】:2017-08-02 04:48:23
【问题描述】:

我希望在 dom 侦听鼠标滚轮时选择 li,以便 jquery 仅删除一个类并更改其类,然后等待下一个滚动,然后选择下一个并执行相同操作。但是我的代码正在选择所有这些并立即更改类。

function scrollMe (){
  $('.header').on('mousewheel', function(e){
    e.preventDefault();
    var scrolled = e.originalEvent.wheelDelta;
    if(scrolled < 0){
      $('li').each(function(i){
        if($('li').hasClass('no-show')){
          $('li').removeClass('no-show').addClass('is-visible');
        }
      });
    }
  })
}

【问题讨论】:

    标签: jquery html-lists mousewheel


    【解决方案1】:

    要在每次滚动时显示一个元素,知道每次旋转会触发 10 次滚动事件...
    您必须以某种方式缓冲事件。

    setTimeout() 可以与标志一起使用。
    查看代码中的 cmets 了解详细信息。

    var timer;
    
    // This is a flag to know if we scrolled.
    var scrolling=false;
    
    $('.header').on('mousewheel', function(e){
    
      // Get the scrolling direction
      var scrolled = e.originalEvent.wheelDelta;
    
      if(scrolled < 0 && !scrolling){ // if scroll down for the first time for at least 1 second.
    
        // Show the first hidden li found
        $('li.no-show').first().removeClass('no-show').addClass('is-visible');
      }
    
      // As long as user scrolls, 
      // he clears the timer
      clearTimeout(timer);
    
      // and sets a new one (delaying more...).
      timer = setTimeout(function(){
    
        // After at least 1 second not scrolling, reset the flag.
        scrolling=false;
      },1000);
    
      // Set the flag to know we just scrolled.
      scrolling=true;
    
    });
    .header{
      height:300px;
      background-color:#ddd;
      overflow-y:scroll;
    }
    .no-show{
      display:none;
    }
    .is-visible{
      display:list-item;
      color:red;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div class="header">
      <ul>
        <li>1</li>
        <li class="no-show">2</li>
        <li>3</li>
        <li class="no-show">4</li>
        <li>5</li>
        <li class="no-show">6</li>
        <li>7</li>
        <li class="no-show">8</li>
        <li>9</li>
        <li class="no-show">10</li>
      </ul>
    </div>

    【讨论】:

    • 感谢我在这个问题上花了这么多钱,所以无法弄清楚解决方案会那么容易谢谢!
    【解决方案2】:

    在循环内部,您正在控制任何具有 no-show 类的 'li' 元素。通过执行以下更改,它将查找每个 'li' 元素并为每个元素执行处理。

    function scrollMe (){
    $('.header').on('mousewheel', function(e){
        e.preventDefault();
        var scrolled = e.originalEvent.wheelDelta;
        if(scrolled < 0){
            $('li').each(function(i){
                if($(this).hasClass('no-show')){
                $(this).removeClass('no-show').addClass('is-visible');
                }});
        }
    })
    }
    

    【讨论】:

    • 如果您在代码中添加一个解释来解释为什么这会回答问题,那将会很有帮助。仅仅发布看起来与问题中的示例几乎相同的代码,可能不足以让人们相信这个答案是正确的。
    • 而您刚刚发布了与 OP 完全相同的代码...这不是答案。
    • @Louys Patrice Bessette 的确切代码?只需有一个文本比较工具并比较两个代码。
    • 如果一个答案需要与“比较工具”进行比较,那显然不是一个很好的答案。 Please read。只是将$('li') 更改为$(this) 根本不会回答OP 问题。我希望我能第二次投反对票……
    • 缺少点或分号或字符可能会导致编译错误。当你比较这段代码的工作版本和代码的非工作版本时,它几乎是一样的,除了那个小点哈?那么,检测这个错误不是一个很好的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多