Ios jquerymobile+;Cordova-on“;轻敲;警报打了两次

Ios jquerymobile+;Cordova-on“;轻敲;警报打了两次,ios,jquery-mobile,cordova,Ios,Jquery Mobile,Cordova,jQM 1.3、Cordova、iOS 每次触发tap事件且该事件调用的函数包含一个警报,它都会被调用两次 在这里,这将调用一个警报,当我按“OK”并尝试点击/滚动应用程序上的任何其他位置时,将显示第二个警报: $(document).on('tap', '#mydiv', function(event) { event.preventDefault(); alert('Tapped.'); return false; }); 如果我这样做,#result将只包含“Tappe

jQM 1.3、Cordova、iOS

每次触发tap事件且该事件调用的函数包含一个
警报
,它都会被调用两次

在这里,这将调用一个
警报
,当我按“OK”并尝试点击/滚动应用程序上的任何其他位置时,将显示第二个
警报

$(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;
});
我真的不需要
警报
。只是为了调试。 然而,我很好奇为什么会发生这种行为。 为什么呢如何修复它?


谢谢。

您的代码有问题。如果您单击按钮多次,它将执行多次。为什么?因为一旦你们点击按钮,事件点击将执行1,下一次点击它将执行上一次的1+1事件点击,如此类推,若你们多次点击。。。 防止多次事件火灾的解决方案:
1.使用off()或一个:

2.使用标志

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

您的代码有问题。如果您单击按钮多次,它将执行多次。为什么?因为一旦你们点击按钮,事件点击将执行1,下一次点击它将执行上一次的1+1事件点击,如此类推,若你们多次点击。。。 防止多次事件火灾的解决方案:
1.使用off()或一个:

2.使用标志

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

我也遇到了同样的问题,解决方法是将警报包装到setTimeout中

setTimeout('alert("Tapped.")',250);
这可能与之前提到的问题相同,他们得出的结论是这是一个浏览器错误

基本上,如果您从touchend事件触发模式警报或提示,则单击警报/提示按钮会触发另一个touchstart事件,该事件的目标是触发原始触摸事件的同一元素,即使在警报/提示附近看不到该事件。奇怪的是,在你的手指抬起后,没有匹配的touchend被发送……我假设这与以下事实有关:警报是模态的,浏览器仍在处理触发touchend/tap/vclick和回调的原始touchend事件

令人不安的是,下次你触摸屏幕时 显然,浏览器最终会刷新来自浏览器的touchend事件 警告/立即解雇,并且该事件再次针对同一目标 元素,即使您的手指不在任何位置 在元素附近。这就是为什么回调看起来很简单的原因 开火两次


我也遇到了同样的问题,解决方法是将警报包装到setTimeout中

setTimeout('alert("Tapped.")',250);
这可能与之前提到的问题相同,他们得出的结论是这是一个浏览器错误

基本上,如果您从touchend事件触发模式警报或提示,则单击警报/提示按钮会触发另一个touchstart事件,该事件的目标是触发原始触摸事件的同一元素,即使在警报/提示附近看不到该事件。奇怪的是,在你的手指抬起后,没有匹配的touchend被发送……我假设这与以下事实有关:警报是模态的,浏览器仍在处理触发touchend/tap/vclick和回调的原始touchend事件

令人不安的是,下次你触摸屏幕时 显然,浏览器最终会刷新来自浏览器的touchend事件 警告/立即解雇,并且该事件再次针对同一目标 元素,即使您的手指不在任何位置 在元素附近。这就是为什么回调看起来很简单的原因 开火两次

我想补充一点:

  • 这个问题只发生在iOS上,而不是Android上

  • 当您引入提示或类似的东西时,也会发生这种情况

  • 在尝试了所有可能的避免传播的方法后,我得出结论,问题与传播无关,唯一可行的解决方案是Yuriy的,它对我有效,即使延迟更短(50)

    我想补充一点:

  • 这个问题只发生在iOS上,而不是Android上

  • 当您引入提示或类似的东西时,也会发生这种情况


  • 在尝试了所有可能的避免传播的方法后,我得出结论,问题与传播无关,唯一可行的解决方案是Yuriy的,它对我有效,即使延迟更短(50)

    Console.log的作用方式相同吗?您是否将这些事件绑定到任何页面事件?尚未尝试console,因为我需要添加插件,之后总是忘记删除它。不,即使我只在
    中放置了点击事件而没有任何其他内容,它也会被触发两次。请尝试
    touchstart
    事件。@Omar
    touchstart
    有效。警报只有一次。但我注意到在关闭警报后,滚动被“捕获”,页面总是需要两次按下才能再次滚动(第一次滚动被“忽略”)。删除
    preventDefault()
    重新运行false
    。您也可以使用
    vclick
    单击
    触摸端
    。Console.log的作用方式相同吗?您是否将这些事件绑定到任何页面事件?尚未尝试console,因为我需要添加插件,之后总是忘记删除它。不,即使我只在
    中放置了点击事件而没有任何其他内容,它也会被触发两次。请尝试
    touchstart
    事件。@Omar
    touchstart
    有效。警报只有一次。但我注意到在关闭警报后,滚动被“捕获”,页面总是需要两次按下才能再次滚动(第一次滚动被“忽略”)。删除
    preventDefault()
    重新运行false
    。您也可以使用
    vclick
    单击
    触摸端