当为touchstart事件调用preventDefault()时,为什么onclick事件被抑制?

时间:2011-07-21 18:37:36

标签: javascript ios ipad

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

我实现了水平和垂直滑动功能。我必须在touchstart事件上使用preventDefault来防止整个页面滚动时滑动。它工作得很好,但在此之后我注意到它禁用了这个div上的每个点击事件。删除preventDefault后,click事件将再次起作用。

有没有解决这个问题的方案?

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>

2 个答案:

答案 0 :(得分:7)

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

处理点击次数下的Mozilla documentation详细说明了这一点:

  

因为在touchstart或第一次touchmove上调用preventDefault()   系列事件会阻止相应的鼠标事件触发,   通常在touchmove上调用preventDefault()而不是   touchstart。这样,鼠标事件仍然可以触发等等   链接将继续有效。

答案 1 :(得分:2)

您可以尝试阻止touchmove事件的默认操作。