मैं कुछ जावास्क्रिप्ट यूआई पर काम कर रहा हूं, और स्पर्श उपकरणों पर बेहतर प्रतिक्रिया के लिए 'टचचेन्ड' जैसी कई स्पर्श घटनाओं का उपयोग कर रहा हूं। हालांकि, कुछ तार्किक मुद्दे हैं जो मुझे परेशान कर रहे हैं ...जावास्क्रिप्ट टचेंडा बनाम क्लिक करें दुविधा
मैंने देखा है कि कई डेवलपर्स एक ही घटना में 'टचचेन्ड' और 'क्लिक' को जोड़ते हैं। कई मामलों में यह चोट नहीं है, लेकिन अनिवार्य रूप से समारोह टच डिवाइस पर दो बार से निकाल देते थे:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
यह सुझाव दिया गया है कि एक स्पर्श क्षमता का पता लगा सकता है, और उदाहरण के लिए उचित रूप से घटना सेट:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
उपरोक्त के साथ समस्या यह है कि यह उन डिवाइसों पर तोड़ देगा जो स्पर्श और माउस दोनों का समर्थन करते हैं। यदि उपयोगकर्ता वर्तमान में दोहरी इनपुट डिवाइस पर माउस का उपयोग कर रहा है, तो 'क्लिक' आग नहीं लगेगी क्योंकि बटन पर केवल 'touchend' असाइन किया गया है।
डिवाइस का पता लगाने का एक और समाधान है (उदा। "आईओएस") और उस पर आधारित एक ईवेंट असाइन करें: Click event called twice on touchend in iPad। बेशक, उपरोक्त लिंक में समाधान केवल आईओएस (एंड्रॉइड या अन्य डिवाइस नहीं) के लिए है, और कुछ काफी प्राथमिक हल करने के लिए "हैक" जैसा लगता है।
एक और समाधान माउस-गति का पता लगाने के लिए होगा, और यह पता लगाने के लिए स्पर्श करें कि उपयोगकर्ता माउस या स्पर्श पर है या नहीं। निश्चित रूप से समस्या यह है कि जब आप इसे पहचानना चाहते हैं तो उपयोगकर्ता माउस को नहीं ले जा रहा है ...
सबसे विश्वसनीय समाधान मैं सोच सकता हूं, सरल debounce फ़ंक्शन का उपयोग केवल यह सुनिश्चित करने के लिए है कि केवल फ़ंक्शन (उदाहरण के लिए 100ms) एक छोटे अंतराल के भीतर एक बार चलाता है:
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
मैं कुछ याद आ रही हूँ, या किसी को भी किसी भी बेहतर सुझाव हैं?
संपादित करें: मैं अपनी पोस्ट है, जो ऊपर के रूप में एक ऐसी ही समाधान का सुझाव के बाद यह लिंक मिल गया: How to bind 'touchstart' and 'click' events but not respond to both?
जो कुछ हल नहीं करता है ... Modernizr बस 'स्पर्श' का पता लगाता है। घटना अभी भी स्पर्श उपकरणों पर दो बार आग लग जाएगी। या यदि आप टच डिवाइस (आधुनिकता के माध्यम से) के लिए 'स्पर्श' ईवेंट असाइन करते हैं, तो यह माउस के उपयोग से उपयोगकर्ताओं को दोहरी-इनपुट डिवाइस जैसे कई विंडोज 8 उपकरणों पर काम करना बंद कर देगा। – suncat100