2011-05-12 96 views
6

任何人都有任何想法如何检测滚动条上的mouseup事件?它适用于FF,但不适用于Chrome或IE9。如何检测滚动条上的mouseup? (或“scrollEnd”事件)

我成立了一个快速演示:http://jsfiddle.net/2EE3P/

的总体思路是,我想检测scrollEnd事件。显然没有这样的事情,所以我要结合使用mouseUp和定时器,但mouseUp在大多数浏览器中都没有启动! div包含一系列项目,所以当用户停止滚动时,我想将滚动位置调整到最有意义的点,例如,最近的细胞的边缘。但是,如果他们处于滚动中,我不想自动调整位置。

我还会愉快地接受,让我的scrollEnd

回答

0

回答我的问题,所以我可以关闭它 - 没有很好的解决了这一点,所以计时器是...

+1

你是如何使用计时器解决问题的? – baltoro 2012-07-16 11:17:34

+1

使用定时器以何种解决方案? jQuery的滚动事件? – ThdK 2015-03-05 08:05:45

+1

这不是一个答案,不应该这样选择,即使这是你自己的问题。请帮助其他开发人员,并跟进您使用的计时器代码。 – 2015-07-27 19:13:06

0

相当于使用jQuery有可以使用.scroll事件的任何答复。也许使用一个全局变量来跟踪何时.scrollTop()(它返回屏幕上方的像素数)已停止改变?仍然会造成竞争状态,但它应该起作用。

+0

我知道,我已经在计时器上工作了,但是正在寻找一个更加稳妥的解决方案,但不幸的是一个不存在。 – 2011-05-21 19:07:31

+0

是的,你被定时器困住了,这只是解决了跨浏览器问题。 – Truk 2011-05-21 19:21:52

3

发现没有定时器工作,但只有当你正在滚动窗口完整的解决方案。

switch(event.type){ 
      case 'mousedown': 
       _btnDown = true; 
       //THIS IS ONLY CAUSE MOUSEUP ON SCROLLBAR IS BUGGY 
       $(document).bind('mousemove',function(event){ 
        if(event.pageX < ($(window).width() - 30)){ 
        //mouse is off scrollbar 
        $(this).unbind(event); 
        $(this).trigger('mouseup'); 
       } 
       }); 
      break: 
      case 'mouseup': 
       //do whatever 
       _btnDown = false; 
      break; 
} 

很脏..但工程。

+1

哈哈,好主意/黑客。实际上,您可以将其推断到任何滚动条以及不准确的'30'。你需要:设置容器“溢出:隐藏”。获取innerWidth'w1'。设置'overflow:scroll'。获取innerWidth'w2'。滚动条x位于('container.left + w1'和'container.left + w2')之间。显然高度相似。 – 2011-09-21 17:40:33

0

我正在处理同样的问题。对我来说,IE9不会为滚动条发出mouseup事件。所以,我检查了IE9,当你“mouseup”它发出mousemove事件。所以我做的是监视器滚动,并监视mousemove。当用户滚动并发生鼠标移动事件时,我将其理解为mouseup事件。只有做这个检查IE9,刨原始财产可用性。该代码也将运行于Opera,但Opera有鼠标移动,当两个事件都发生时,对我来说没有任何问题。下面是代码,我写AngularJS +仄代码,这样的想法,并编写自己的代码,不要指望直接复制粘贴&这段代码:

 // Global for scrolling timeout 
     var q; 

     // Action to do when stop scrolling 
     var updatePosition = function() { 
      // Put the code for stop scrolling action here 
     } 

     $(document).on('mousemove', function(e) { 

      console.log('MOUSE MOVE ' + e.pageX + ',' + e.pageY); 

      if(!('__proto__' in {})) { 
       // for IE only, because it dont have mouseup 
       if($scope.scrolling && $scope.mouse_down) { 

        console.log('FAKE MOUSE UP FOR IE'); 

        // Only simulate the mouseup if mouse is down and scrolling 
        $scope.scrolling = false; 
        $scope.mouse_down = false; 
        // Update Position is the action i do when mouseup, stop scrolling 
        updatePostition(); 
       } 
      } 
     }); 


     $(window).on('scroll', function(){ 

      console.log('SCROLLING'); 

      // Set the scrolling flag to true 
      if(!$scope.scrolling) { 
       $scope.scrolling = true; 
      } 

      // Stop if for some reason you disabled the scrolling monitor 
      if(!$scope.monitor_scrolling) return; 

      // Monitor scroll with a timeout 
      // Update Position is the action i do when stop scrolling 
      var speed = 200; 
      $timeout.cancel(q);  
      q = $timeout(updatePostition, speed); 

     }); 


     $(window).on('mousedown', function() { 
      console.log('MOUSE DOWN'); 
      // Stop monitor scrolling 
      $scope.monitor_scroll = false; 
      // Set that user is mouse down 
      $scope.mouse_down = true; 
     }); 

     $(window).on('mouseup', function() { 
      console.log('MOUSE UP'); 
      // Enable scrolling monitor 
      $scope.monitor_scroll = true; 
      // Change mouse state 
      $scope.mouse_down = false; 
      // Action when stop scrolling 
      updatePostition(); 
     }); 

与这个问题战斗。我的系统也运行移动和我有一个大的水平滚动,总是当用户停止滚动,它需要找到实际的项目,使用正在查看并集中在屏幕上的这个项目(updatePosition)。希望这可以帮到你。这是为了支持IE9 +,FF,Chorme和Opera,我不担心旧版浏览器。

问候

0

很晚,但....有在你的页面的任何部分滚动的解决方案....我做下一个代码...

onScroll = function(){ 
 
    $(window).unbind("mouseup").one('mouseup',function(e) { 
 
    alert("scroll up") 
 
    }); 
 
}; 
 
$(window).bind("scroll", onScroll);
body{ 
 
    height:5000px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

问题是'mouseUp'在许多浏览器中根本不会触发。不知道这是否仍然如此,5年没看过这个:) – 2016-10-07 21:28:36