Javascript AndroidWebView:非常滞后的按钮响应

Javascript AndroidWebView:非常滞后的按钮响应,javascript,android,html,web-applications,Javascript,Android,Html,Web Applications,我有一个小的网络应用程序,我用Android的WebView功能玩 我有一些div用作按钮(带有onclick属性)。在试用该应用程序时(在设备的浏览器中),我在点击按钮后立即注意到一个巨大的延迟。延迟介于我点击按钮和浏览器在按钮周围显示橙色突出显示之间 我做了一些测试,得到了一些信息: JavaScript不是问题所在。我取消了所有脚本的链接,并删除了所有的onclick属性。表演没有改变 CSS3不是问题所在。我去掉了所有花哨的渐变,表演也没有改变 元素的数量不是问题所在。我在页面上尝试了

我有一个小的网络应用程序,我用Android的WebView功能玩

我有一些div用作按钮(带有
onclick
属性)。在试用该应用程序时(在设备的浏览器中),我在点击按钮后立即注意到一个巨大的延迟。延迟介于我点击按钮和浏览器在按钮周围显示橙色突出显示之间

我做了一些测试,得到了一些信息:

  • JavaScript不是问题所在。我取消了所有脚本的链接,并删除了所有的
    onclick
    属性。表演没有改变
  • CSS3不是问题所在。我去掉了所有花哨的渐变,表演也没有改变
  • 元素的数量不是问题所在。我在页面上尝试了一些元素,但性能没有改变
  • Doctype和meta不是问题所在。我确保我使用的是安卓系统
我真不明白为什么会有这么多的滞后。我已经排除了所有可能导致它的因素,但没有任何帮助

我错过什么了吗


点击按钮后如何消除延迟?

基本上,移动浏览器上的点击事件会延迟300毫秒。你知道快速按钮的样式吗?基本上,您可以使用
touchstart
事件(立即触发)


这里有一个完整的解释:

因此,WebView会保存每个点击事件,以查看它是双击还是触摸移动事件。除了绑定到touchstart事件之外,还有其他选择。如果使用viewport meta指令指定WebView不应缩放或滚动,则触摸事件将立即到达代码(因为姜饼)

您可以在此处找到视口指令的详细信息:
由于谷歌代码非常复杂,我使用Mootools 1.3+实现了自己的代码:

Element.Events.touch = 
{
    base: 'touchend',
    condition: function(e) 
    {
        return  ((new Date().getTime() - this.startT < 200) && this.valid) ? true : false;
    },
    onAdd: function(fn) 
    {
        this.addEvent('touchstart', function(e)
        {
            this.valid = true;
            this.startT = new Date().getTime();
            this.startX = e.touches[0].clientX;
            this.startY = e.touches[0].clientY;
        });
        this.addEvent('touchmove', function(e)
        {
            if ((Math.abs(e.touches[0].clientX - this.startX) > 10) || (Math.abs(e.touches[0].clientY - this.startY) > 10)) this.valid = false;
        });
    }
};
它通过添加touchend和touchstart事件来工作,如果它们发生在不到200毫秒的时间内,并且触摸没有走得太远,则为有效触摸,否则为无效触摸


它在2.2和4.0上运行得非常好

尝试插入html代码



快速点击不再是一个问题(对于我来说。4.2.2和WebChromeClient)

“触摸事件将立即到达您的代码(因为姜饼)。”我找不到任何证据支持这一说法。而且,它似乎在我的姜饼设备上不起作用。视口元标记是holly grail!忘了快速点击和那些废话吧。这就是你想要使用的。延迟是因为webview正在等待检测双击缩放,但是一旦您不想缩放,就不需要检测双击:)。。。而且X-UA-Compatible是完全无用的,因为没有人在Android手机/平板电脑上安装IE。
$('id').addEvent('touch', function()
{
    // your code
});