这是我的第一篇文章,所以我试图解释清楚:
我正在开发一个 Web 应用程序,但重点是,我想让我的用户感觉它是一个原生应用程序。在本机应用程序中,您无法像在 iOS Safari 中那样滚动,所以我尝试使用 event.preventDefault 禁用滚动。这很好用,除了表单元素和链接不再可点击。我的解决方案是这个小脚本,但是如果您开始触摸其中一个转义元素,它无论如何都会滚动。没什么大不了的,但它让我发疯......
脚本注释:
isTouch 如果是可触摸设备
则返回 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 事件的情况下触发点击事件以允许滚动
编辑 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);
}