【问题标题】:Android - JavaScript : touchstart event not fired until zoom or scroll the pageAndroid - JavaScript:在缩放或滚动页面之前不会触发 touchstart 事件
【发布时间】:2013-01-23 10:33:58
【问题描述】:

在我的 Android 应用程序中,用户可以使用 ViewPager 浏览一些 HTML 页面,并且用户可以触摸某个元素以突出显示。

问题是当尝试使用以下代码使用 javascript 获取触摸事件时,elementFromPoint 在导航到新页面时返回 null,但在用户缩放页面或滚动页面后,它可以正常工作。

我发现 touchstart 事件的注册发生在缩放或滚动页面之后。所以它在那之后就可以工作了,尽管它是在 $(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);  
            }

谢谢

【问题讨论】:

    标签: javascript android webview touch-event touchstart


    【解决方案1】:

    在调用 javascript 后在你的 java 代码中编写下一个代码:

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

    或者先放大再缩小

        myWebview.zoomIn();
        myWebview.zoomOut();
    

    【讨论】:

    • 感觉很hacky,但它确实有效。顺便说一句,如果您从屏幕外为 WebView 设置动画,则需要在动画完成后运行这些代码行。我在 Animator.AnimatorListener() 的 onAnimationEnd 方法中设置它,效果很好。我还确认,即使页面内容不够大,需要滚动,它也能正常工作。
    • Brian - 如果您没有等待动画完成并调用 zoomin/zoomout 方法,您还记得 webview 是否是白色的吗?
    • 我一直在使用没有 AnimatorListener 的 zoomin/zoomout 方法,我注意到(尤其是在 Kindle 上)即使页面已加载,webview 有时也是白色的。然后我切换到 scrollTo 方法(同样,没有 AnimatorListener),我不再看到白色的 webview。
    【解决方案2】:

    使用 Mohamed Abdel Latif 的解决方案(显然这是另一个蹩脚的 WebView 错误)在 Android 4.1.2 上为我修复了它。 注意:我在 Android 4.4.2 上对此进行了测试,不需要这个 hack-to-fix-a-bug。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2017-06-18
      • 2018-09-03
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多