禁用仅在“body”元素上拖动?

时间:2012-10-06 03:34:40

标签: javascript jquery ios

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

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

这是否只会影响父div,而不是父母(<body>)中的子div?我想也许$("#yourdiv").parent()可行,但没有运气。

编辑:此链接在解决同一问题时未能解决我的问题:prevent app dragging but permit scroll of inner div elements in ios

3 个答案:

答案 0 :(得分:4)

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

您可以查看该事件的target - 不是100%确定这在iOS上是如何发生的,但我认为它应该没问题。

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

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

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

答案 1 :(得分:3)

您还可以将thise.target进行比较。

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

答案 2 :(得分:0)

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

JSBIN DEMO

解决方案涉及以下几点:

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