Unter iOS möchte ich das Scrollen nur für das Element <body> deaktivieren, nicht für Elemente innerhalb des Elements <body>. Der folgende Code deaktiviert das Ziehen des Elements <body>, verhindert jedoch auch das Ziehen untergeordneter Divs:

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

Gibt es überhaupt eine Auswirkung auf das übergeordnete Div, nicht auf das untergeordnete Div innerhalb des übergeordneten Div (<body>)? Ich dachte, vielleicht würde $("#yourdiv").parent() funktionieren, aber kein Glück.

BEARBEITEN : Dieser Link hat zwar das gleiche Problem behoben, mein Problem jedoch nicht gelöst: Verhindere das Ziehen der App, erlaube aber das Scrollen der inneren Div-Elemente in iOS

0
Charlie 6 Okt. 2012 im 07:34

3 Antworten

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

Sie könnten das target des Ereignisses überprüfen - nicht 100% sicher, wie dies unter iOS funktioniert, aber ich würde annehmen, dass es in Ordnung sein sollte.

Eine andere Möglichkeit wäre, die Ausbreitung des Ereignisses zu stoppen.

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

Aber das ist nur ein Gedanke, und ich bin mir auch nicht ganz sicher, ob es funktionieren würde.

4
ahren 6 Okt. 2012 im 03:59

Sie können auch this mit e.target vergleichen.

$("body").bind("touchstart", function(e) {
    if (this === e.target) {
        e.preventDefault();
    }
});
3
xdazz 6 Okt. 2012 im 03:41

Ich bin mir nicht sicher, wie unterschiedlich es unter iOS sein würde (habe es dort noch nicht getestet), aber hier ist, wie ich das Problem unter Android gelöst habe.

JSBIN DEMO

Die Lösung beinhaltet einige Dinge:

  1. Deaktivieren des Standardereignisses Body touchmove
  2. Verhindern, dass das touchmove -Ereignis auf Zielen, an denen touchmove arbeiten soll, zum Körper sprudelt
  3. Erzwingen eines Overscrolls auf erlaubten Zielen, um zum Körper zu sprudeln und negiert zu werden
0
akamaozu 5 Juni 2014 im 09:36