2013-01-23 13 views
6

In meiner Android-Anwendung kann der Benutzer einige HTML-Seiten mit ViewPager durchsuchen, und der Benutzer kann ein Element zum Hervorheben berühren.Android - JavaScript: Touchstart-Ereignis nicht ausgelöst, zoomen oder die Seite scrollen

Das Problem ist, wenn versucht wird, das Berührungsereignis mithilfe von JavaScript mit dem folgenden Code zu erhalten, gibt ElementFromPoint null zurück, wenn auf neue Seite navigieren, aber nachdem der Benutzer die Seite zoomen oder scrollen, funktioniert es richtig.

Ich habe festgestellt, dass das Register des Touchstart-Ereignisses nach dem Zoomen oder Blättern der Seite passiert. so funktioniert es gleich nach, dass, obwohl es auf $ registriert (document) .ready()

 $(document).ready(function(){ 
      document.addEventListener("touchstart", touchstart, false);  
     });  

     function touchstart(e) {        
      var x = e.targetTouches[0].clientX; 
      var y = e.targetTouches[0].clientY;        
      el = document.elementFromPoint(x, y); 
      } 

Danke

Antwort

7

Schreib nächsten Code in Java-Code nach dem Aufruf von javascript:

myWebview.scrollTo(1, 0); 
    myWebview.scrollTo(0, 0); 

oder verwenden Sie vergrößern und dann verkleinern

myWebview.zoomIn(); 
    myWebview.zoomOut(); 
+0

Vielen Dank, dieser Code funktioniert gut, aber warum? –

+0

Fühlt sich ziemlich hacky, aber es funktioniert. Übrigens, wenn Sie Ihr WebView von außerhalb des Bildschirms animieren, müssen Sie diese Codezeilen ausführen, nachdem die Animation abgeschlossen ist. Ich habe es in einer Animator.AnimatorListener() onAnimationEnd Methode eingerichtet und es funktioniert super. Ich habe auch bestätigt, dass es funktioniert, auch wenn der Inhalt der Seite nicht groß genug ist, um scrollen zu müssen. –

+0

Brian - erinnerst du dich daran, dass die Webansicht weiß war, wenn du nicht auf die Fertigstellung der Animation gewartet hast und die Zoom-/Zoomout-Methoden aufgerufen hast? –

0

mit Mohamed Abdel Latifs Lösung (offensichtlich ist dies anoth ir lame WebView Bug) unten ist, was es für mich auf Android 4.1.2 behoben. Hinweis: Ich habe dies auf Android 4.4.2 getestet und dieser Hack-to-Fix-a-Bug ist nicht erforderlich.

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 

    final WebView myWebView = (WebView) findViewById(R.id.mywebview); 
    myWebView.setHorizontalScrollBarEnabled(false); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.loadDataWithBaseURL("file:///android_asset/", YOUR_HTML_GOES_HERE, "text/html", "utf-8", null); 

    myWebView.setWebViewClient(new WebViewClient() 
    { 
     // overcome the ontouchstart registration bug ! 
     @Override 
     public void onPageFinished(WebView view, String url) 
     { 
      super.onPageFinished(view, url); 
      final WebView myWebView = (WebView) findViewById(R.id.mywebview); 
      myWebview.scrollTo(1, 0); 
      myWebview.scrollTo(0, 0); 
     } 
    }); 
}