Android - JavaScript:只有在缩放或滚动页面时才会触发touchstart事件

7
在我的安卓应用中,用户可以使用ViewPager浏览一些HTML页面,并且用户可以点击某个元素以进行高亮显示。
问题在于,当尝试使用以下代码通过javascript获取触摸事件时,当导航到新页面时,elementFromPoint返回null,但是当用户缩放或滚动页面后,它就能正常工作了。
我发现,触摸事件的注册发生在缩放或滚动页面之后。因此,虽然它是在$(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);  
            }

谢谢你

2个回答

7
在调用 JavaScript 后,将以下代码写入您的 Java 代码中:
    myWebview.scrollTo(1, 0);
    myWebview.scrollTo(0, 0);

或者使用缩放功能进行缩小然后再放大。
    myWebview.zoomIn();
    myWebview.zoomOut();

感觉有点hacky,但是它能用。顺便说一下,如果你正在将WebView从屏幕外动画进来,你需要在动画完成后运行这些代码行。我在Animator.AnimatorListener()的onAnimationEnd方法中设置了它,效果很棒。我也确认它可以工作,即使页面内容不足以需要滚动。 - Brian Rak
Brian - 你还记得如果在动画完成之前调用了缩放方法,webview 是否会变成白色吗?请确认一下。 - Someone Somewhere
我一直在使用缩放方法而没有使用AnimatorListener,但我注意到(特别是在Kindle上),即使页面已经加载完成,webview有时仍然是白色的。因此,我改用了scrollTo方法(同样没有使用AnimatorListener),现在我不再看到白色的webview了。 - Someone Somewhere

0

使用Mohamed Abdel Latif的解决方案(显然这是另一个糟糕的WebView错误),以下是我在Android 4.1.2上修复它的方法。 注意:我在Android 4.4.2上测试过,不需要这个修补程序来解决错误。

@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);
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接