jQuery Mobile + Cordova - 在“点击”警报上调用两次

时间:2013-12-17 21:59:14

标签: ios jquery-mobile cordova

jQM 1.3,Cordova,iOS

每当我触发点击事件并且事件调用的函数包含alert时,它将被调用两次。

在这里,这会调用alert,只要我按“确定”并尝试点击/滚动应用程序上的任何其他位置,就会显示第二个alert

$(document).on('tap', '#mydiv', function(event) {
   event.preventDefault();
   alert('Tapped.');
   return false;
});

如果我这样做,#result将只包含“Tapped”,它应该如何。

$(document).on('tap', '#mydiv', function(event) {
   event.preventDefault();
   $('#result').append('Tapped');
   return false;
});

我真的不需要alerts。只是为了调试。 但是我很好奇为什么会出现这种情况。 这是为什么? 如何解决?

谢谢。

3 个答案:

答案 0 :(得分:3)

您的代码存在问题。如果点击许多时间按钮,它将执行很多次。为什么?因为一旦你点击按钮,事件点击将执行1,然后点击它将执行1 + 1事件点击上一个,依此类推1 + 1 + 1,如果你点击很多次,... 多次防止事件发生的解决方案:
 1.使用off()或one:

$(document).off().on('tap', '#mydiv', function(event) {
   event.preventDefault();
   alert('Tapped.');
   return false;
});

$(document).one('tap', '#mydiv', function(event) {
   event.preventDefault();
   alert('Tapped.');
   return false;
});

2.使用标志

var flag = true
if( flag ){
    flag = false;
    $(document).on('tap', '#mydiv', function(event) {
       event.preventDefault();
       alert('Tapped.');
       return false;
    });
}

答案 1 :(得分:2)

我遇到了同样的问题,并且对我有用的解决方法是将警报包装到setTimeout

setTimeout('alert("Tapped.")',250);

这可能与提到here的问题相同,他们得出结论认为这是一个浏览器错误。

  

基本上,如果您从touchend事件触发模态警报或提示,单击警报/提示的按钮会触发另一个触发原始触摸事件的同一元素的触摸启动事件,即使它在视觉上没有警报/提示附近的地方。奇怪的是,在你的手指上升后没有匹配的touchend ...我假设这与警报是模态的并且浏览器仍在处理触发原始touchend事件的事实有关。 touchend / tap / vclick和你的回调。

     

令人不安的是,下次你触摸屏幕时,   浏览器显然最终将冲出了touchend事件   警报/提示解雇,该事件再次针对同一目标   来自之前触摸事件的元素,即使你的手指不在哪里   靠近元素。这个冲动的touchend事件是回调似乎的原因   火了两次。

答案 2 :(得分:1)

我想补充一点:

  1. 此问题仅发生在iOS上,而不是Android中。

  2. 当您引入提示或类似内容时,也会发生这种情况。

  3. 在尝试了一切可能避免传播的方法之后,我得出结论,问题与它无关(传播),唯一真正有效的实用解决方案是Yuriy&s,它即使延迟时间较短(50)也为我工作。