在javascript中禁用webapp滚动而不终止单击(点击)事件

在javascript中禁用webapp滚动而不终止单击(点击)事件,javascript,ios,web-applications,scroll,touch,Javascript,Ios,Web Applications,Scroll,Touch,这是我的第一篇帖子,所以我会尽量解释清楚: 我正在开发一个web应用程序,但主要的一点是,我想让我的用户感觉它是一个本地应用程序。在本机应用程序中,您无法像iOS safari那样滚动,因此我尝试使用event.preventDefault禁用滚动。除了表单元素和链接不再可点击外,这非常有效。我的解决方案是这个小脚本,但是如果你开始触摸其中一个转义元素,它仍然会滚动。没什么大不了的,但这让我发疯 脚本注释: 如果是可触摸设备,iTouch返回true/false 如果数组包含字符串,则.cont

这是我的第一篇帖子,所以我会尽量解释清楚:

我正在开发一个web应用程序,但主要的一点是,我想让我的用户感觉它是一个本地应用程序。在本机应用程序中,您无法像iOS safari那样滚动,因此我尝试使用event.preventDefault禁用滚动。除了表单元素和链接不再可点击外,这非常有效。我的解决方案是这个小脚本,但是如果你开始触摸其中一个转义元素,它仍然会滚动。没什么大不了的,但这让我发疯

脚本注释:
如果是可触摸设备,iTouch返回true/false
如果数组包含字符串,则.contains方法返回true/false

if (isTouch) {
    window.addEventListener("touchstart", function (evt) {
        var target = evt.touches[0].target;
        var tags = 'a input textarea button'.split(' ');

        if ( tags.contains(target.tagName) === false ) {
            evt.preventDefault();
        }       
    }, false);
}
编辑 我的主要问题是,有没有一个解决方案可以在没有touchmove事件的情况下触发tap事件以允许滚动

编辑2
我解决了这个问题。我的解决方案是,在交互元素上模拟事件:

var eventFire = function (el, etype) {
    if (el.fireEvent) {
        (el.fireEvent('on' + etype));
    }
    else {
        var evObj = document.createEvent('Events');
        evObj.initEvent(etype, true, false);
        el.dispatchEvent(evObj);
    }
}

if (isTouch) {
    window.addEventListener("touchstart", function (evt) {
        var target = evt.touches[0].target;
        var foc = 'input textarea'.split(' ');
        var clck = 'a button'.split(' ');

        if ( foc.contains(target.tagName) ) {
            target.focus();
            eventFire(target,'click');
            evt.preventDefault();
        }
        else {
            evt.preventDefault();
        }

    }, false);
}

你在Safari浏览器上试过这段代码吗?我在我的ipad上的ios Safari上测试过这段代码,它工作得很好,就像我说的,只是如果我开始触摸其中一个转义元素(a、输入、按钮…),它还是会滚动