【问题标题】:Prevent scroll bubbling防止滚动冒泡
【发布时间】:2012-05-18 00:35:02
【问题描述】:

如何防止滚动冒泡?

以下示例无效:

<!DOCTYPE html> 
<html> 
    <head> 
        <title>Scroll Bubbling</title>
        <style>
            #menu {
                width: 80px;
                height: 150px;
                background: red;
                overflow: auto;
            }
        </style>
        <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
        <script type="text/javascript">
            function isScrollOnBound( scrollContainer ) {
                if ( $( scrollContainer ).scrollTop() === 0 || 
                     $( scrollContainer ).scrollTop() + $( scrollContainer ).innerHeight() >= $( scrollContainer )[0].scrollHeight ) {
                    return true;
                } else {
                    return false;
                }
            }

            $(function() {                  
                $( '#menu' ).on( 'scroll', function(e) {
                    if ( isScrollOnBound( this ) ) {
                        e.stopPropagation();
                    }                   
                });

                $( window ).on( 'scroll', function(e) {
                    alert( 'stopPropagation not working' );
                });                 
            });     
        </script>
    </head> 
    <body>  
        page 1<br />page 2<br />page 3<br />page 4<br />page 5<br />page 6<br />page 7<br />page 8<br />page 9<br />page 10<br />page 11<br />page 12<br />page 13<br />page 14<br />page 15<br />page 16<br />page 17<br />page 18<br />page 19<br />page 20<br />page 21<br />page 22<br />page 23<br />page 24<br />page 25
        <div id="menu">
            menu 1<br />menu 2<br />menu 3<br />menu 4<br />menu 5<br />menu 6<br />menu 7<br />menu 8<br />menu 9<br />menu 10
        </div>
        page 26<br />page 27<br />page 28<br />page 29<br />page 30<br />page 31<br />page 32<br />page 33<br />page 34<br />page 35<br />page 36<br />page 37<br />page 38<br />page 39<br />page 40<br />page 41<br />page 42<br />page 43<br />page 44<br />page 45<br />page 46<br />page 47<br />page 48<br />page 49<br />page 50
    </body>
</html>

【问题讨论】:

    标签: javascript jquery css scroll event-bubbling


    【解决方案1】:

    Here's 为什么您尝试做的事情不起作用。不应该的。

    我遇到了one reliable method 来实现我猜你想要的。

    使用Brandon Aaron's plugin

    Example |代码

    var menu = $('#menu')
    
    menu.on('mousewheel', function(e, d) {
        if((this.scrollTop === (menu[0].scrollHeight - menu.height()) && d < 0) || (this.scrollTop === 0 && d > 0)) {
            e.preventDefault();
        }
    });
    

    注意:它在 IE 中也可以工作,只是当 JSFiddle 包含该插件时,IE 会返回一个 mime 不匹配错误。 IE 很烂。

    【讨论】:

    • 这个例子在 iOS 上可以正常工作,但在 Android 上就不行,知道为什么吗?
    • @Diogo 不,老实说,我对 android 没有太多经验,但我猜 android 对事件使用了非标准名称,或者该事件不存在。 Brandon 的插件使用以下内容附加事件处理程序:DOMMouseScrollmousewheelonmousescroll。在插件的顶部,您可以添加处理程序应挂钩的其他事件名称。
    • @Diogo 虽然,根据this postDOMMouseScroll 应该可以工作。
    【解决方案2】:

    您需要将touchmove 绑定到document(我认为)并返回false,这意味着什么都不做。仅在需要时绑定它(在您的 div 中滚动时),然后在滚动完成时取消绑定。

    当我不想滚动父级时,我遇到了同样的问题,这是我可以解决的唯一方法。

    当您需要文档不滚动时,请执行以下操作:

    $(document).bind('touchmove', function(){
        return false;
    });
    

    完成后解除绑定:

    $(document).unbind('touchmove');
    

    【讨论】:

      【解决方案3】:

      您可以尝试 setContentHeight() 来解决您的问题。

      【讨论】:

        猜你喜欢
        • 2019-08-13
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多