【问题标题】:Disable dragging only on "body" element?仅在“body”元素上禁用拖动?
【发布时间】:2014-06-05 17:36:11
【问题描述】:

在 iOS 上,我只想禁用 <body> 元素上的滚动,而不是 <body> 元素中的元素。以下代码将禁止拖动 <body> 元素,但也会阻止拖动子 div:

$("body").bind("touchstart", function(e) {
    e.preventDefault();
});

无论如何这只会影响父 div,而不是父 div 中的子 div (<body>)?我想也许$("#yourdiv").parent() 会起作用,但没有运气。

编辑:这个链接虽然解决了同样的问题,但没有解决我的问题:prevent app dragging but permit scroll of inner div elements in ios

【问题讨论】:

    标签: javascript jquery ios


    【解决方案1】:
    $("body").bind("touchstart", function(e) {
        if(e.target.nodeName === "BODY"){
           e.preventDefault();
        }
    });
    

    您可以查看活动的target - 不能 100% 确定 iOS 上的情况,但我认为应该没问题。

    另一种可能性是首先阻止事件传播。

    $("*:not(body)").bind('touchstart', function(e){
      e.stopPropagation();
    });
    

    但这只是一个想法,我也不完全确定它会起作用。

    【讨论】:

    • 完美运行。唯一的问题是,如果您将滚动条一直滚动到滚动 div 的顶部,然后在它的动量恢复到静止状态时尝试拖动,它将拖动页面。这显然非常具体,所以我怀疑是否有解决方法。
    • 要补充我之前的评论,当您尝试在可滚动的 div 中向上拖动时也会发生这种情况,当它已经尽可能地向上时,它会滚动正文。
    • 您也可以停止事件传播 - 从您仍要滚动的元素...
    • 您能详细说明一下吗?
    【解决方案2】:

    您还可以将this 与e.target 进行比较。

    $("body").bind("touchstart", function(e) {
        if (this === e.target) {
            e.preventDefault();
        }
    });
    

    【讨论】:

      【解决方案3】:

      我不确定它在 iOS 上会有多大不同(还没有在那里测试过),但这是我在 Android 上解决问题的方法。

      JSBIN DEMO

      解决方案涉及几件事:

      1. 禁用默认正文 touchmove 事件
      2. 防止 touchmove 事件冒泡到您希望 touchmove 处理的目标上
      3. 强制过度滚动允许的目标以冒泡到正文并被否定

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 2016-05-24
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多