2013-12-17 23 views
0

JQM 1.3,科爾多瓦,iOS的jQuery Mobile的+科爾多瓦 - 上「挖掘」警報叫了兩聲

我每次觸發敲擊事件,通過事件調用的函數包含alert,它會被稱爲兩次。

在這裏,這將調用一個alert,並且當我按下「OK」,並試圖挖掘/其他地方滾動應用第二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。只是爲了調試。但我很好奇爲什麼會出現這種情況。 這是爲什麼? 如何解決?

謝謝。

+0

Console.log的行爲方式相同嗎?你是否將這些事件綁定到任何頁面事件? – Omar

+0

沒有試過控制檯,因爲我需要添加插件,並且我總是忘記隨後將其刪除。不,即使我只在「」中放置了沒有任何其他事件的輕敲事件,它也會觸發兩次。 – Kallewallex

+1

嘗試'touchstart'事件。 – Omar

回答

3

您的代碼有問題。如果你多次點擊按鈕,它會執行很多次。爲什麼?因爲一旦你點擊按鈕,事件點擊將執行1,然後點擊它將執行1 + 1事件點擊先前,如此點擊1 + 1 + 1,如果你點擊很多時間,... 防止事件發生的解決方案許多時間:
1.使用過()或一個:

$(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; 
    }); 
} 
+2

我只在div上點擊**一次**。但警報顯示了兩次。無論如何,您的代碼'$(document).one'可以防止警報顯示2次**,但**我不想將它限制爲一次性交互。 'off.on'不起作用我曾嘗試過。 – Kallewallex

+0

問題是你沒有刪除舊的事件,並添加新的事件元素。工作之前,你應該仔細閱讀文檔和教程 –

2

我有同樣的問題和解決方法,對我的工作就是包裝成警報的setTimeout

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

這可能與提到的here的問題相同,他們得出結論認爲這是一個瀏覽器錯誤。

基本上,如果你觸發模式警報或從touchend事件,即使提示,點擊警報/提示觸發的按鈕,是針對觸發原始觸摸事件相同的元素另一touchstart事件,它在視覺上沒有靠近警報/提示的地方。奇怪的是,在你的手指上升之後沒有匹配的touchend派發......我認爲這與警報是模態的,而瀏覽器仍處於處理觸發該事件的原始touchend事件的事實有關touchend/tap/vclick和你的回調。

令人不安的是,在您下次觸摸屏幕時, 瀏覽器顯然是結束了從 警報/提示解僱沖洗touchend事件,該事件再次針對同一 元從以前的觸摸事件即使你的手指沒有位於元素附近的地方 。這個刷新的touchend事件是爲什麼回調看起來好像是兩次觸發。

1

我想補充一點:

  1. 這個問題只發生在iOS上,而不是在Android系統。

  2. 當你引入一個提示或類似的東西時也會發生。

想應該避免傳播無微不至之後,我的結論是,問題已經無關,與它(傳播),和真正的工作一直是尤里的唯一可行的解​​決方案,它工作了我甚至有一個較短的延遲(50)。