extjs

2012-06-05 21 views
5

में डबल क्लिक करते समय फायरिंग एकल क्लिक ईवेंट को कैसे रोकें मेरे पास एक पेड़ पैनल है और प्रत्येक नोड के लिए मेरे पास एक क्लिक है और डबल क्लिक ईवेंट हैं। लेकिन जब मैं डबल क्लिक करता हूं तो यह एक क्लिक ईवेंट को भी फायर कर रहा है। तो डबल क्लिक होने पर फायरिंग सिंगल क्लिक इवेंट को कैसे रोकें?extjs

उत्तर

8

आम तौर पर का उपयोग करके एकल क्लिक और डबल क्लिक ईवेंट को एक खराब अभ्यास और अत्यधिक निराश माना जाता है।

हालांकि, यदि आप अभी भी ऐसा करना चाहते हैं, तो एकल क्लिक और डबल क्लिक के बीच अलग-अलग करने में सक्षम होने का एकमात्र तरीका कृत्रिम रूप से क्लिक के बीच समय को मापकर इस भेद को जोड़ना है।

विचार यह है कि आप तुरंत अपनी एकल-क्लिक कार्रवाई नहीं करते हैं लेकिन दूसरे क्लिक के लिए प्रतीक्षा करें। यदि दूसरा क्लिक जल्द ही आता है, तो आपकी डबल क्लिक कार्रवाई ट्रिगर हो जाती है। अन्यथा देरी के बाद आपकी एकल क्लिक कार्रवाई ट्रिगर हो जाती है।

आपका कोड कुछ ऐसा दिखाई देगा की तरह:

var singleClickTask = new Ext.util.DelayedTask(singleClickAction), // our delayed task for single click 
    singleClickDelay = 100; // delay in milliseconds 

function onClick() { 
    singleClickTask.delay(singleClickDelay); 
} 

function onDblClick() { 
    // double click detected - trigger double click action 
    doubleClickAction(); 
    // and don't forget to cancel single click task! 
    singleClickTask.cancel(); 
} 

function singleClickAction() { 
    // something useful... 
} 

function doubleClickAction() { 
    // something useful... 
} 


// setting event handlers on an Element 
elem.on('click', onClick); 
elem.on('dblclick', onDblClick); 

स्पष्ट कमियां हैं:

  • एक अलग सेटिंग हो सकता है एक सिंगल क्लिक कार्रवाई
  • अलग ओएस में के लिए एक का विलंब होगा डबल क्लिक को ट्रिगर करने वाले क्लिक के बीच अंतराल के लिए, हार्ड-कोडिंग सिंगलक्लिकडेले विश्वसनीय नहीं है
  • जावास्क्रिप्ट टाइमर 100% सटीक नहीं है और परिणाम विभिन्न प्रदर्शन

मुझे कोई बेहतर समाधान नहीं पता है, और फिर, मैं आपको एक ही समय में एकल और डबल क्लिक दोनों का उपयोग करने से हतोत्साहित कर सकता हूं, यह आमतौर पर टूटा हुआ उपयोगकर्ता अनुभव होता है ।

1

मुझे लगता है कि दूसरे की बजाय पहले क्लिक ईवेंट पर कार्रवाई करना बेहतर है। आप एक बूलियन सेट करके ऐसा कर सकते हैं जिसे आप प्रत्येक क्लिक ईवेंट पर चेक करते हैं।

इस कोड को एक दृष्टिकोण का प्रदर्शन किया

onGridRowClick: function(view, record, item, index, e, eOpts) { 
    if (record._task_in_progress) { 
     return; 
    } 
    // Let the second click as part of the double click to be ignored 
    record._task_in_progress = true; 

    // Emulating async task here 
    setTimeout(function() { 
     record._task_in_progress = false; 
    }, 1000); 
}