मैं एक डोम तत्व पर क्लिक और dblclick ईवेंट दोनों को संभालने में कामयाब रहा हूं। प्रत्येक व्यक्ति एक अलग कमांड करता है, लेकिन मुझे लगता है कि तत्व पर डबल क्लिक करते समय, डबल क्लिक ईवेंट को फायर करने के अलावा, क्लिक ईवेंट को दो बार निकाल दिया जाता है। इस व्यवहार को रोकने के लिए सबसे अच्छा तरीका क्या है?डीबीएलक्लिक घटना से आग लगने पर ईवेंट को फायरिंग से रोकें
उत्तर
एक टिप्पणी में, आप ने कहा,
मैं 300 एमएस (एक ध्यान देने योग्य और कष्टप्रद देरी) और यहां तक कि ...
तो यह आप क्या चाहते हैं की तरह लगता है द्वारा क्लिक हैंडलर में देरी यह है कि जब आप क्लिक करते हैं तो डीओएम को तुरंत एक क्लिक इवेंट जेनरेट करना चाहिए, सिवाय इसके कि क्लिक डबल-क्लिक का पहला क्लिक है या नहीं।
इस सुविधा को लागू करने के लिए, जब आप क्लिक करते हैं, तो डोम को यह अनुमान लगाने में सक्षम होना चाहिए कि यह अंतिम क्लिक है या फिर यह डबल-क्लिक का पहला है (हालांकि मुझे लगता है कि सामान्य रूप से संभव नहीं है डीओएम भविष्यवाणी करने के लिए कि उपयोगकर्ता फिर से क्लिक करने वाला है या नहीं)।
क्लिक करने और दो बार क्लिक करने के लिए आप दो अलग-अलग कार्रवाइयां क्या कर रहे हैं? आईएमओ, एक सामान्य अनुप्रयोग में आप दोनों घटनाओं को चाहते हैं: उदा। किसी तत्व पर फ़ोकस करने के लिए एकल-क्लिक करें और फिर इसे सक्रिय करने के लिए डबल-क्लिक करें।
जब आपको ईवेंट को अलग करना होगा, तो कुछ एप्लिकेशन डबल-क्लिक के अलावा कुछ और उपयोग करते हैं: उदाहरण के लिए, वे राइट-क्लिक या नियंत्रण-क्लिक का उपयोग करते हैं।
इस मामले में, एकल क्लिक ईवेंट के निष्पादन में देरी करना सबसे अच्छा है। अपने डबल क्लिक हैंडलर को एक वेरिएबल सेट करें जो एकल क्लिक ईवेंट चेक करेगा। यदि उस चर के पास एक विशेष मान है, तो boolDoubleClick == true
हो सकता है, तो एक क्लिक पर fire/handle
न करें।
असल में, मैं अब कर रहा हूं, लेकिन ऐसा लगता है कि यह एक बदमाश समाधान है। मैं क्लिक हैंडलर को 300 एमएस (एक ध्यान देने योग्य और कष्टप्रद देरी) में देरी करता हूं और इसके साथ ही आप दोनों को आग लगने के लिए पर्याप्त धीमी गति से क्लिक कर सकते हैं (उदाहरण के लिए 350 एमएस)। – David
दिलचस्प। यह मानना अनुचित नहीं है कि यदि वे दूसरे क्लिक के लिए बहुत देर तक देरी करते हैं तो वांछित प्रभाव 2 सिंगल क्लिक होगा। –
दुर्भाग्य से डबल-क्लिक समय अंत उपयोगकर्ता (जैसे नियंत्रण कक्ष/माउस का उपयोग करके) द्वारा कॉन्फ़िगर करने योग्य है, और मुझे लगता है कि ब्राउज़र में जावास्क्रिप्ट यह निर्धारित नहीं कर सकता कि उस समय देरी के रूप में कॉन्फ़िगर किया गया है। – ChrisW
AFAIK डोम स्तर 2 घटनाक्रम डबल-क्लिक के लिए कोई विनिर्देश नहीं बनाता है। यह आईई 7 पर मेरे लिए काम नहीं करता है (वहां एक झटका है), लेकिन एफएफ और ओपेरा को spec के प्रबंधन में कोई समस्या नहीं है, जहां मैं क्लिक ईवेंट पर सभी क्रियाएं संलग्न कर सकता हूं, लेकिन डबल-क्लिक के लिए बस "विवरण" तक प्रतीक्षा करें ईवेंट ऑब्जेक्ट की विशेषता 2 है। दस्तावेज़ों से: "यदि एक ही स्क्रीन स्थान पर एकाधिक क्लिक होते हैं, तो अनुक्रम प्रत्येक पुनरावृत्ति के साथ विस्तारित विशेषता विशेषता के साथ दोहराता है।"
यह वास्तव में समस्या का एक बहुत ही सुरुचिपूर्ण समाधान है। इसे अभी भी पहले क्लिक के लिए सेटटाइमआउट/क्लीयरटाइमआउट कॉम्बो की आवश्यकता है, लेकिन यह दोनों के बीच समन्वय को सरल बनाता है और ट्रिपल-क्लिक आदि के दरवाजे को भी खोलता है। धन्यवाद! – mckamey
अन्य सभी जवाब यहां के लिए धन्यवाद उनमें से संयोजन जब बातचीत दोनों की आवश्यकता है मेरे लिए एक उचित समाधान प्रदान करने के लिए लगता है, लेकिन परस्पर अनन्य रूप:
var pendingClick = 0;
function xorClick(e) {
// kill any pending single clicks
if (pendingClick) {
clearTimeout(pendingClick);
pendingClick = 0;
}
switch (e.detail) {
case 1:
pendingClick = setTimeout(function() {
console.log('single click action here');
}, 500);// should match OS multi-click speed
break;
case 2:
console.log('double click action here');
break;
default:
console.log('higher multi-click actions can be added as needed');
break;
}
}
myElem.addEventListener('click', xorClick, false);
अद्यतन: मैं एक सामान्यीकृत संस्करण जोड़ा एक क्लिक के उदाहरण के साथ इस Github रेपो के लिए टच डिवाइस के लिए polyfill के साथ-साथ इस दृष्टिकोण का:
यहाँ है कि मैं क्या disting के लिए क्या किया है
$node.on('click',function(e){
if(e.originalEvent.detail > 1){
return;
/* if you are returning a value from this
function then return false or cancel
the event some other way */
}
});
: (मैंने किया था के रूप में) एक मॉड्यूल
node.on('click', function(e) {
//Prepare for double click, continue to clickHandler doesn't come soon enough
console.log("cleared timeout in click",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
_this.clickTimeout = setTimeout(function(){
console.log("handling click");
_this.onClick(e);
},200);
console.log(_this.clickTimeout);
});
node.on('dblclick', function (e) {
console.log("cleared timeout in dblclick",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
// Rest of the handler function
इस पर मामला किसी और stumbles में भीतर uish एक जवाब की तलाश में, पूर्ण सबसे अच्छा समाधान है कि मैं के साथ आ सकता है निम्नलिखित है किया हुआ।यदि एक से अधिक बार वापस क्लिक करें, दूसरा, तीसरा, आदि। आग नहीं होगी मैं निश्चित रूप से किसी भी प्रकार के टाइमर का उपयोग करने के लिए इसे पसंद करता हूं।
मैंने this पढ़कर खुद को इस दिशा में इंगित किया।
संयोग: मैं पहली बार इस समस्या पर शोध किया गया था क्योंकि मैंने गलती से डबल एक पृष्ठवार लिंक पर क्लिक किया, और घटना निकाल दिया और दो बार समाप्त होने से पहले कॉलबैक भी हो सकता है।
कोड के साथ ऊपर आ रहा से पहले, मैं
if e.originalEvent.detail === 2 //return
हालांकि, मैं लिंक पर क्लिक करने के लिए 3 बार (एक ट्रिपल क्लिक करें) कर रहा था था, और हालांकि दूसरे क्लिक नहीं था ' टी आग, तीसरा
यह फायरिंग से दूसरे क्लिक को रोक देगा और फिर भी पहली क्लिक आग को चलेगा। यदि मैं सही ढंग से समझता हूं तो ओपी दूसरे क्लिक को अक्षम करना चाहता था। मुझे लगता है कि सबसे अच्छी शर्त एक छोटी देरी का उपयोग कर रही है (मैं 200ms का उपयोग कर रहा हूं, लेकिन उम्मीद कर रहा था कि एक बेहतर समाधान था जिसे मैं अभी नहीं देख सका)। – ClarkeyBoy
@ClarkeyBoy - आप गलत हैं। यदि कोई दूसरा है तो यह पहला क्लिक अक्षम कर देगा। कोशिश करो। – user1167442
IE 11 x64 (Win8.1) में काम नहीं करता है: event.detail = 0 हमेशा, या तो एकल क्लिक या डबल – robert4
मुझे पता है कि यह बिल्ली के रूप में पुराना है, लेकिन सोचा कि मैं किसी भी तरह से पोस्ट करूंगा क्योंकि मैं अभी भी एक ही समस्या में भाग गया था। यहां बताया गया है कि मैंने इसे कैसे हल किया।
$('#alerts-display, #object-display').on('click', ['.item-data-summary', '.item-marker'], function(e) {
e.preventDefault();
var id;
id = setTimeout(() => {
// code to run here
return false;
}, 150);
timeoutIDForDoubleClick.push(id);
});
$('.panel-items-set-marker-view').on('dblclick', ['.summary', '.marker'], function(e) {
for (let i = 0; i < timeoutIDForDoubleClick.length; i++) {
clearTimeout(timeoutIDForDoubleClick[i]);
}
// code to run on double click
e.preventDefault();
});
- 1. बच्चे फायरिंग पेरेंट से क्लिक को रोकें ईवेंट
- 2. फायरिंग MouseLeftButtonDown घटना प्रोग्रामेटिक रूप से
- 3. .NET: घटना हर बार एक अच्छा अभ्यास आग लगने पर नया EventArgs बना रहा है?
- 4. क्रोम पर एक कीबोर्ड ईवेंट फायरिंग
- 5. डीओएम विशेषता परिवर्तन पर फायरिंग घटना
- 6. इकाई एक थ्रेड से एक घटना फायरिंग का परीक्षण
- 7. स्क्रॉल ईवेंट को कॉल करने से स्क्रॉलटॉप को रोकें
- 8. एक्स्टजेस में, अचानक आग लगने पर अचानक कैसे बाध्य करें?
- 9. एक node.js फ़ंक्शन कैसे लिखें जो 'वापसी' से पहले किसी ईवेंट को आग लगने की प्रतीक्षा करता है?
- 10. सी #, कंटेनर की आग घटना
- 11. viewDidAppear कभी भी फिर से फायरिंग नहीं करने पर ऐप
- 12. ListBox.SelectedIndexChanged ईवेंट को कैसे रोकें?
- 13. क्या बच्चे के तत्व पर आग लगने पर ब्राउजर को लिंक का पालन करना बंद करना संभव है?
- 14. NStimer ईवेंट को कैसे रोकें?
- 15. केवल एक बार एक घटना आग?
- 16. jQuery बच्चे की घटना ट्रिगर होने पर माता-पिता की घटना को ट्रिगर करने से रोकें
- 17. मास्टर पेज के 'पेज_लोड' ईवेंट से पहले एएसपी.नेट पेज 'पेज_लोड' फायरिंग?
- 18. ModalPopupExtender ठीक बटन घटना पर क्लिक नहीं फायरिंग?
- 19. MouseListener फायरिंग नहीं है काफी तेजी से
- 20. जावास्क्रिप्ट मैन्युअल रूप से फायरिंग .ऑनचेंज() इवेंट
- 21. ट्विटर बूटस्ट्रैप मॉडल एकाधिक घटना फायरिंग
- 22. एंड्रॉइड: स्क्रीन कुंजीपटल पर कौन सा ईवेंट आग लगती है?
- 23. फायरिंग को कैसे रोकें चेक किए गए चेंज किए गए ईवेंट को प्रोग्रामेटिक रूप से नियंत्रित करते समय?
- 24. दस्तावेज़ से जुड़ी घटना श्रोताओं पर क्लिक करें। आईओएस 6 में आग नहीं है?
- 25. क्या जेड-इंडेक्स को अनदेखा करने वाली घटनाओं पर आग लगने का कोई तरीका है?
- 26. विलंब के बाद आग लगने वाले चयनकर्ता को कैसे मारें (आईफोन पर)?
- 27. टीएसक्यूएल ट्रिगर को केवल उन स्तंभों पर आग लगने की आवश्यकता है जिनके मूल्य
- 28. DOMContentLoaded ईवेंट एक पृष्ठ लोड के लिए दो बार फायरिंग
- 29. विंडोज़.फॉर्म आग नहीं हैडाउन घटना
- 30. क्रोम एक्सटेंशन: तत्व बनाते समय एक घटना को आग लगाना?
अद्यतन उत्तर के लिए धन्यवाद। मुझे लगता है कि यह वास्तव में इस तथ्य के लिए आता है कि मुझे अपने यूआई पर पुनर्विचार करने की जरूरत है। जो मैं वास्तव में पूरा करना चाहता हूं वह संभव नहीं होगा। मुझे बस दो कार्यों के लिए दो नियंत्रणों का उपयोग करना चाहिए, या डबल-क्लिक के बजाय एक संशोधक कुंजी का उपयोग करना चाहिए। धन्यवाद! – David