2012-10-06 88 views
0

在iOS上,我想僅禁止在<body>元素上滾動,而不是在<body>元素中的元素。下面的代碼將禁用拖動<body>元素,而且還可以防止拖子div禁用僅在「body」元素上拖動?

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

反正這只是影響到父(<body>)內父DIV,不是孩子div的?我想也許$("#yourdiv").parent()會工作,但沒有運氣。

編輯:此鏈接,而它解決了同樣的問題,並沒有解決我的問題:prevent app dragging but permit scroll of inner div elements in ios

回答

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

你可以檢查該事件的target - 這是如何去iOS上不是100% ,但我認爲它應該沒問題。

另一種可能性是首先停止事件傳播。

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

但這只是一個想法,我也不完全確定它會起作用。

+0

完美運作。唯一的問題是,如果您將滾動條一直滾動到滾動div的頂部,那麼嘗試拖動它的動量重置爲休息時,它將拖動頁面。這顯然非常具體,所以我懷疑有一個解決方法。 – Charlie

+0

要添加到我以前的評論中,當您嘗試在可滾動div內向上拖動時,也會發生這種情況,只要它已到達,它就會滾動主體。 – Charlie

+0

你也可以停止事件傳播 - 從你仍然想滾動的元素... – ahren

3

您還可以比較thise.target

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

我不確定它會在iOS上有多不同(但還沒有測試過),但這裏是我在Android上解決問題的方式。

JSBIN DEMO

的解決方案涉及的幾件事情:

  1. 禁用默認身體touchmove事件
  2. 冒泡到身體上的目標,防止touchmove事件你想touchmove
  3. 強制反彈時工作在允許的目標上冒泡到身體並得到否定