javascript - 为什么在为 touchstart 事件调用 preventDefault() 时会抑制 onclick 事件?

标签 javascript ios ipad

我尝试为我的 Ipad 设备实现一些 javascript 函数。我想在我的 Canvas div 上使用一些滑动操作和点击操作。

我实现了水平和垂直滑动功能。我必须在 touchstart 事件上使用 preventDefault 来防止滑动时整页滚动。它运行良好,但在此之后我注意到它禁用了此 div 上的每个点击事件。当 preventDefault 被移除时,点击事件再次起作用。

有什么办法可以解决这个问题吗?

dojo.connect(this.node, "ontouchstart", this, "touchstart"); 

...   

touchstart: function(e){
    this.touch = dojo.clone(e.changedTouches[0]);
    e.preventDefault();   
}

this.node = document.getElementById('aa');

<div id="aa" style="width: 600px; height: 400px;">
  <div onclick="alert('asd');" style="width: 100px; height: 100px; background-color: #ff0000; margin: auto;">

  </div>
</div>

最佳答案

我知道 Prusse 已经正确回答了这个问题,但它缺乏我在答案中寻找的信心。 touchstart 中preventDefault() 抑制click 事件的原因是因为任何连接的事件和touchstart 之后的事件都将被抑制。 解决方案是改为将 preventDefault() 添加到 touchmove 事件。

这在 Mozilla documentation 中有更详细的解释。在处理点击下:

Since calling preventDefault() on a touchstart or the first touchmove event of a series prevents the corresponding mouse events from firing, it's common to call preventDefault() on touchmove rather than touchstart. That way, mouse events can still fire and things like links will continue to work.

关于javascript - 为什么在为 touchstart 事件调用 preventDefault() 时会抑制 onclick 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6780965/

相关文章:

ios - 将 Admob 横幅广告移动到导航 Controller 中嵌入的 tableView 的底部 (Swift 3)

iphone - "The argument is invalid."从iPhone配置实用程序安装IPA时

javascript - 使用 Javascript 在 session 中自动递增不起作用

javascript - jQuery:搜索相同的多个值

objective-c - UIScrollView 的 subview 中的拖动事件

ios - 在 swift 中初始化一个具有数组作为属性的自定义对象

iphone - NSDictionary 没有正确存储 CGRect?

iOS AIR 应用程序在关闭条形码读取器 ANE 后未获取用户输入

javascript - 如何在 jQuery 中使用 $(this) 改进此代码?

javascript - 鼠标右键单击任务显示上下文菜单