2013-02-20 10 views
11

मैं एंड्रॉइड और आईओएस ऐप बनाने के लिए फोनगैप 2.4.0 का उपयोग कर रहा हूं।एंड्रॉइड 4.2 के साथ फोनगैप 2.4.0 - अजीब डबल क्लिक व्यवहार

अब मुझे पता चला है कि नेक्सस 4 डिवाइस पर एंड्रॉइड 4.2.2 का उपयोग करके एंड्रॉइड ऐप के अंदर लिंक में ऑनकिक इवेंट दो बार निकाल दिया गया है, जैसे डबल क्लिक (अल्थौग मैंने इसे केवल एक बार टैप किया!)। प्रयोग में

<a href="#" onclick="$(this).append('test'); return false;" style="some styles...">some text</a> 

libs:

  • jQuery 1.9.1
  • jQuery मोबाइल 1.3.0 (आरसी)
  • jQuery ui 1.10.0
  • jQuery स्पर्श पंच 0.2.2
  • फोनगैप 2.4.0

जब मैंने अपने नेक्सस 4 (एंड्रॉइड 4.2.2) पर लिंक क्लिक किया (या टैप किया) तो स्ट्रिंग 'टेस्ट' ऐप के अंदर दो बार जोड़ा गया है।

ऐसा तब नहीं होता जब मैं इसे एंड्रॉइड ब्राउज़र में सीधे मोबाइल वेब ऐप के रूप में परीक्षण करता हूं।

यह ऐप के अंदर मेरे सैमसंग एस 3 (एंड्रॉइड 4.1.2) पर भी काम करता है। iPhones पर भी कोई समस्या नहीं है।

किसी और ने इस अजीब व्यवहार को पहचाना? (और शायद इसे ठीक करने में सक्षम था? ;-))

उत्तर

15

से scirra.com

last_click_time = new Date().getTime(); 
document.addEventListener('click', function (e) { 
    click_time = e['timeStamp']; 
    if (click_time && (click_time - last_click_time) < 1000) { 
     e.stopImmediatePropagation(); 
     e.preventDefault(); 
     return false; 
    } 
    last_click_time = click_time; 
}, true); 
+0

अद्भुत हैक! ;) एक जादू की तरह काम करता है! – Sebastian

+0

मैंने एक ही हैक के कई संस्करणों को लागू किया है, यह एक सुंदर है - मुझे नहीं पता कि मैंने इसे दस्तावेज़ क्लिक स्तर पर क्यों हल नहीं किया है, इसे फिर से साझा करने के लिए धन्यवाद :) –

+0

अच्छा समाधान, मुझे एक गड़बड़ थी क्योंकि अगर "भूत" का पता लगाने पर बटन सक्रिय स्थिति में रहता है, इसलिए मैंने $ ('। ui-btn') जोड़ा। removeClass ('ui-btn-active'); रोकथाम के बाद(); – Maurix

0

एक अस्थायी समाधान का उपयोग करते हुए मुझे लगता है कि इन डबल/अनेक क्लिक के कारण खराब हार्डवेयर त्वरण कर रहे हैं, मैं एक साथ हो रही हैं क्लिक + प्रचार, प्रचार की रोकथाम आसान है, हालांकि, मेरे मामले में addEventListener का तीसरा तर्क सम्मानित नहीं है, इसलिए मैं पहले उत्तर दिए गए कोड के साथ भी डबल क्लिक को रोक नहीं सकता, यहां मैं

function cw(event) // click wall 
{ try { 
    click_time_cw = (new Date()).getTime(); 
    if (click_time_cw && (click_time_cw - last_click_time_cw) < 350) { 
     event.stopImmediatePropagation(); 
     event.preventDefault(); 
     add_log('prevented misclick [CW] '+(click_time_cw - last_click_time_cw)); 
     return true; 
    } 
    last_click_time_cw = click_time_cw; 
    event.stopImmediatePropagation(); 
    event.stopPropagation(); 
    return false; 
} catch(e){ add_alert(e,"stpr"); } } 
का उपयोग करके समाप्त हुआ

आप एक LSO प्रारंभ करने में last_click_time_cw = (नई तिथि()) है getTime() कहीं

इस onclick एक उदाहरण है:।

<button class="btn" onclick="if(cw(event)) return true; onclick_logic()">something</button> 

यह बहुत काम है और एक अप्रिय/बदसूरत ठीक तरह लग सकता है लेकिन क्लिक करें मुझे महीनों के लिए परेशान कर रहा है, ऐसा लगता है कि मुझे शुरुआती

2

से किया जाना चाहिए था, मैंने सोल्वाक्स के समाधान के लिए मेरी इसी तरह की स्थिति को बहुत करीब से संभाला, हालांकि मैं तेजी से क्लिक नहीं करना चाहता था समय अंतराल का ट्रैक रखकर उपयोगकर्ता। इसके बजाय, मैं बस लिंक के डेटा ऑब्जेक्ट में ईवेंट प्रकार को ट्रैक करता हूं और यदि यह टचस्टार्ट के तुरंत बाद क्लिक को संभालने का प्रयास कर रहा है, तो मैं उस कॉल को अनदेखा करता हूं।

$('.link').on('touchstart click', function(e){ 
    e.preventDefault(); 

    //Prevent against handling a click immediately after touchstart. 
    if(e.type == "click" && $(this).data("lastTouch") == "touchstart"){ 
    e.stopImmediatePropagation(); 
    return false; 
    } 
    $(this).data("lastTouch", e.type); 

    $('.nav-bar').toggleClass('active'); 
}); 
0

मेरा फ़िक्स थोड़ा अलग था। मैंने touchend के बजाय click ईवेंट श्रोता का उपयोग किया है, क्योंकि click हर बार इसकी आवश्यकता नहीं होती है। आइए मान लें कि आप एक बटन पर क्लिक करते हैं, क्लिक इवेंट श्रोता को निकाल दिया जाता है, लेकिन यदि आप फिर से उस बटन पर क्लिक करते हैं तो यह नहीं है।

यह किसी भी प्रकार के डीओएम तत्व के साथ होता है।मेरा पर्यावरण है:

  • jQuery 1.9.1;
  • जेक्यूएम 1.3.2;
  • फोनगैप 3.5.0-0.21.14।

यहाँ मेरी कोड है:

if (window.cordova) { 
    // hack to avoid double tap 
    var lastTapTime = new Date().getTime(); 
    function tryToAvoidDoubleTap(e){ 
     var tapTime = e["timeStamp"]; 
     if (tapTime && (tapTime - lastTapTime) < 300) { 
      // prevent double tap to happen 
      e.stopImmediatePropagation(); 
      e.preventDefault(); 
      // jQM button handling 
      if ($('.ui-btn').length) 
       $('.ui-btn').removeClass('ui-btn-active'); 
      return false; 
     } 
     lastTapTime = tapTime; 
    } 

    // Wait for PhoneGap to load 
    document.addEventListener("deviceready", onDeviceReady, false); 

    // PhoneGap is ready 
    function onDeviceReady() { 
     document.addEventListener("touchend", tryToAvoidDoubleTap, true); 
    } 
} 
0

मैं ठीक उसी मुद्दे का सामना करना पड़ रहा था, लेकिन मेरे एप्लिकेशन/खेल उपयोगकर्ता की जरूरत है, डबल टैप करने में सक्षम होना touchstart पर। तो उपर्युक्त वर्णित स्किरा समाधान उपयोग योग्य नहीं था क्योंकि 500 ​​या 1000 एमएस की आवश्यक देरी डबलटैप को मार देती है।

event.originalEvent.touches 

दूसरा बग नल में उपलब्ध नहीं है:

कुछ खुदाई के बाद मैं पहली बार (उपयोगकर्ता) नल और दूसरा (बग) नल के बीच एक अंतर देखा। तो मैं इस बग का पता लगाने सहायक जो मेरे मामले को हल कर लिखा है:

function isDoubleTapBug (e) { 
    // only handle touch events (in case your listener works on mouse events too) 
    if (!'ontouchstart' in document.documentElement)) 
    return false; 
    if (!e.originalEvent.touches) { 
    e.preventDefault(); 
    e.stopPropagation(); 
    return true; // indicate to caller that it's a bug 
    } 
    return false; 
} 
अपने श्रोता में फिर

, ऐसा करते हैं:

document.addEventListener('touchstart', function (e) { 
    if (isDoubleTapBug(e)) 
    return false; 
    // now do your actual event handling stuff...  
} 
+0

आपके पास आपके कोड में एक टाइपो है, अगर (document.ocumentElement में 'ontouchstart') होना चाहिए (अगर 'dtouchstart' document.documentElement में) अगर मैं गलत नहीं हूं – Miguel

संबंधित मुद्दे