स्पर्श घटनाओं को समझना


80

मैं अपने कुछ पुस्तकालयों को स्पर्श उपकरणों के साथ बनाने की कोशिश कर रहा हूं, लेकिन मुझे यह जानने में कठिन समय है कि वे कैसे समर्थित हैं और वे कैसे काम करते हैं।

मूल रूप से, 5 स्पर्श कार्यक्रम हैं , लेकिन ऐसा लगता है कि केवल touchstartघटना (duh) पर मोबाइल ब्राउज़रों के बीच आम सहमति है । मैंने परीक्षण के मामले के रूप में एक फिडेल बनाया है ।

मैंने इसे अपने गैलेक्सी नोट पर एंड्रॉइड 4 के साथ बोर्ड पर परीक्षण किया है, लेकिन आप डेस्कटॉप ब्राउज़र से भी लिंक की जांच कर सकते हैं।

लक्ष्य यह पता लगाने की कोशिश करना है कि नल, डबल नल और लंबे नल को कैसे संभालना है। कुछ भी आकर्षक नहीं।

असल में, यही होता है:

एंड्रॉयड स्टॉक ब्राउज़र नहीं आग स्पर्श इवेंट करता है। यह सिर्फ नल, फायरिंग के साथ माउस क्लिक का अनुकरण करने की कोशिश करता है mousedown, mouseupऔर clickलगातार घटनाओं, लेकिन डबल नल बस में और था पेज ज़ूम आउट करें।

एंड्रॉइड के लिए क्रोम टच स्क्रीन पर उंगली से टच होने पर टचस्टार्ट इवेंट को फायर करता है। यह जल्द ही जारी किया गया है, तो यह तो आग mousedown, mouseup, touchendऔर अंत में clickघटनाओं।

के मामले में लंबे समय से नल , के बाद आधे सेकंड यह आग के बारे में mousedownऔर mouseup, और touchendजब उंगली कोई साथ, उठाया है clickअंत में घटना।

यदि आप अपनी उंगली घुमाते हैं , तो यह एक touchmoveघटना को एक-दो बार फायर करता है, तो यह एक touchcancelघटना को आग लगा देता है , और बाद में कुछ भी नहीं होता है, touchendउंगली उठाते समय भी घटना नहीं होती है ।

एक डबल टैप ज़ूम इन / आउट फीचर्स को ट्रिगर करता है, लेकिन इवेंट-वार यह कॉम्बो फायर करता है touchstart- toucheventदो बार, जिसमें कोई माउस इवेंट नहीं होता है।

फ़ायरफ़ॉक्स Android के लिए सही ढंग से आग touchstartघटना, और कम नल आग के मामले में mousedown, mouseup, touchendऔर clickबाद में।

लंबे नल के मामले में , यह आग लगाता है mousedown, mouseupऔर अंत में touchendघटना। यह इन चीजों के लिए Chrome की ही तरह है।

लेकिन अगर आप अपनी उंगली हिलाते हैं , अगर touchmoveलगातार आग लग जाती है (जैसा कि कोई उम्मीद कर सकता है) लेकिन यह घटना को आग नहींtouchleave देता है जब उंगली तत्व को श्रोता के साथ छोड़ देती है, और touchcancelजब उंगली ब्राउज़र व्यूपोर्ट से बाहर निकल जाती है तो वह आग नहीं लगाती है ।

के लिए डबल नल , यह सिर्फ क्रोम की तरह व्यवहार करता है।

ओपेरा मोबाइल क्रोम और फ़ायरफ़ॉक्स का एक ही काम करता है एक छोटे से नल के लिए, लेकिन लंबे प्रेस के मामले में कुछ प्रकार की साझाकरण सुविधा को सक्रिय करता है जिसे मैं वास्तव में अक्षम करना चाहता हूं। यदि आप अपनी उंगली, या डबल टैप करते हैं, तो यह फ़ायरफ़ॉक्स की तरह ही व्यवहार करता है।

क्रोम बीटा सामान्य रूप से छोटे नल के लिए करता है, लेकिन लंबे समय तक नल के मामले में यह mouseupघटना को आग नहीं देता है, बस touchstart, फिर mousedownआधे सेकंड के बाद, फिर touchendजब उंगली उठा ली जाती है। जब उंगली को हिलाया जाता है, तो अब यह फ़ायरफ़ॉक्स और ओपेरा मोबाइल की तरह व्यवहार करता है।

दोहरे नल के मामले में , यह ज़ूम आउट करते समय टच इवेंट्स को फायर नहीं करता है , लेकिन केवल ज़ूम इन करते समय।

क्रोम बीटा सबसे अजीब व्यवहार दिखाता है, लेकिन मैं वास्तव में शिकायत नहीं कर सकता क्योंकि यह बीटा है।

सवाल यह है : स्पर्श उपकरणों के सबसे आम ब्राउज़रों में छोटे नल, लंबे नल और डबल नल का पता लगाने की कोशिश करने का एक सरल और तरीका है?

बहुत बुरा मैं इसे आईओएस उपकरणों पर सफारी, या विंडोज फोन 7 / फोन 8 / आरटी के लिए IE के साथ परीक्षण नहीं कर सकता, लेकिन अगर आप में से कुछ कर सकते हैं, तो आपकी प्रतिक्रिया बहुत सराहना की जाएगी।


1
क्या आपने टोका.जेएस की कोशिश की है? gianlucaguarini.github.io/Tocca.js यह किसी भी तरह के उपकरण पर सभी लापता स्पर्श घटनाओं को सक्षम करता है और यह लगभग 1kb है
Gianluca Guarini

जवाबों:


26

यदि आप पहले से नहीं हैं, तो मैं Hammer.js के लिए स्रोत कोड पढ़ने का सुझाव दूंगा

https://github.com/hammerjs/hammer.js/blob/master/hammer.js

टिप्पणियों और कोड के बीच यह लगभग 1400 लाइनें हैं, महान प्रलेखन है और कोड को समझना आसान है।

आप देख सकते हैं कि लेखक ने बहुत सारी सामान्य स्पर्श घटनाओं को हल करने के लिए कैसे चुना है:

होल्ड, टैप, डबलटैप, ड्रैग, ड्रैगस्टार्ट, ड्रैगअप, ड्रैगअप, ड्रैगडेल, ड्रैगफेल, ड्रैग राइट, स्वाइप, स्वाइपडाउन, स्वाइपेलफ्ट, स्विपराइट, ट्रांसफॉर्म, ट्रांसफॉर्मर, ट्रांसफॉर्मेंड, रोटेट, पिंच, पिंच, टच (जेस्चर डिटेक्शन स्टार्ट) , रिलीज (इशारा पता लगाना समाप्त होता है)

मुझे लगता है कि स्रोत कोड को पढ़ने के बाद आपको इस बात की बेहतर समझ होगी कि टच ईवेंट कैसे काम करते हैं और यह कैसे पहचानते हैं कि कौन सा इवेंट ब्राउज़र को संभालने में सक्षम है।

http://eightmedia.github.io/hammer.js/


दिलचस्प कोड का टुकड़ा, काफी पूर्ण और व्यापक लगता है। मुझे इसका विश्लेषण करने में कुछ समय लग सकता है।
मैक्सआर्ट

9

वास्तव में एक उत्कृष्ट संसाधन है https://patrickhlauke.github.io/touch/tests/results/ जो ब्राउज़रों की एक चौंका देने वाली संख्या में घटनाओं के क्रम का विवरण देता है। यह नियमित रूप से अपडेट किया गया प्रतीत होता है (सितंबर 2016 में, इसे आखिरी बार अगस्त 2016 में अपडेट किया गया था)।

सार है, अनिवार्य रूप से सब कुछ ट्रिगर mouseoverऔर संबंधित घटनाओं; अधिकांश स्पर्श घटनाओं को भी ट्रिगर करते हैं, जो आमतौर परtouchend पहले (पहुंच ) पूरी हो जाती हैं mouseoverऔर तब तक जारी रहती हैं click(जब तक कि पृष्ठ सामग्री इसे रद्द नहीं करती)। उन अजीब अपवादों का शुक्र है कि वे अपेक्षाकृत दुर्लभ हैं (3rd पार्टी एंड्रॉइड ब्राउज़र और ब्लैकबेरी प्लेबुक)।

लिंक किया गया संसाधन विस्तार के एक प्रभावशाली स्तर पर जाता है, यहाँ पहले तीन में से कई का नमूना है, कई ऑपरेटिंग सिस्टम, डिवाइस और ब्राउज़र परीक्षण:

यहाँ छवि विवरण दर्ज करें

कुछ प्रमुख बिंदुओं को संक्षेप में प्रस्तुत करने के लिए:

मोबाइल ब्राउज़र

  • सभी सूचीबद्ध ब्राउज़र mouseoverपहले टैप पर ट्रिगर होते हैं। केवल कुछ विंडोज फोन ब्राउज़र इसे दूसरे टैप पर ट्रिगर करते हैं।
  • सभी ट्रिगर click। यह निर्दिष्ट नहीं करता है कि clickयदि mouseoverपेज बदलता है (मुझे सबसे अधिक विश्वास है)
  • अधिकतर ब्राउज़र को गति प्रदान mouseoverकरने के बाद touchstartऔर touchend। इसमें Android के लिए iOS7.1 सफारी, स्टॉक एंड्रॉइड, क्रोम, ओपेरा और फ़ायरफ़ॉक्स शामिल हैं, और कुछ (सभी विंडोज़ फोन ब्राउज़र नहीं)
  • कई विंडोज फोन ब्राउज़र (सभी विंडोज 8 / 8.1 और 10 के लिए एक संस्करण) और कई 3-पार्टी एंड्रॉइड ब्राउज़र (डॉल्फिन, मैक्सथॉन, यूसी) के mouseover बाद ट्रिगर touchstartऔर touchend
  • केवल ब्लैकबेरी Playbook के mouseoverबीच चलाता है touchstartऔरtouchend
  • केवल ओपेरा मिनी और पफिन (3 जी पार्टी एंड्रॉइड ब्राउज़र) की कमी है touchstartया touchend

डेस्कटॉप ब्राउज़र

  • उचित रूप से डेस्कटॉप क्रोम और ओपेरा के संस्करण अप करने के लिए अपने मोबाइल समकक्षों की तरह व्यवहार करते हैं, touchstartऔर touchendउसके बाद mouseover
  • फ़ायरफ़ॉक्स और माइक्रोसॉफ्ट ब्राउज़र (IE <= 11 और एज के कई संस्करण) किसी भी touchstartऔर touchendघटनाओं को ट्रिगर नहीं करते हैं।
  • मैक पर कोई डेटा नहीं है, लेकिन संभवतः कोई मा ब्राउज़र समर्थन नहीं करता है touchstartऔर touchendमैक टचस्क्रीन इंटरफेस की कमी को देखते हुए।

सहायक प्रौद्योगिकियों के साथ संयुक्त ब्राउज़र पर डेटा की एक अविश्वसनीय मात्रा भी है।


3

हां, आप एक टाइमर शुरू कर सकते हैं touchstartऔर इसे समाप्त touchendकर सकते हैं और वहां से अपनी पसंद बना सकते हैं।

इसके अलावा आप कर सकते हैं ... चलो कहते हैं स्वाइप, मेरी ट्रिगर touchmoveआप "उंगली" के निर्देशांक प्राप्त कर सकते हैं और देखें कि touchendट्रिगर होने से पहले मैंने कितनी यात्रा की ।

मुझे नहीं पता कि टच इवेंट्स लाइब्रेरी का उपयोग करने के बजाय कोई सरल तरीका है, लेकिन मुझे लगता है कि आप सरल 'टैप', 'डबल टैप', 'स्वाइप' घटनाओं को आसानी से लिख सकते हैं।


1
यदि आप इसके बारे में सोचते हैं, और उपरोक्त ब्राउज़रों के व्यवहार पर विचार करते हैं, तो आप स्वीकार करेंगे कि यह बिल्कुल आसान नहीं है। उदाहरण के लिए, यदि आप किसी तत्व को स्पर्श करते हैं, तो अपनी उंगली को तत्व से बाहर ले जाएं और फिर उंगली उठाएं, तो यह एक वैध "टैप" नहीं होगा, लेकिन आप इसका पता नहीं लगा सकते हैं क्योंकि touchleaveकभी भी निकाल नहीं दिया जाता है।
मैक्सआर्ट

आप एक अच्छी बात करते हैं, लेकिन; उचित कोडिंग के साथ, जैसे कि, हम तत्व को पकड़ते हैं e.target(मुझे विश्वास है) टचस्टार्ट पर, क्या यह स्पर्शक के तत्व के बराबर है? यदि नहीं, तो यह एक वैध नल नहीं है, यह एक जाल है। मैं यह नहीं कह रहा हूं कि एक पुस्तकालय को कोड करना आसान होगा, लेकिन यह वास्तव में "कठिन" नहीं है, मैं इसे "मध्यम" + के रूप में रैंक करूंगा, अगर यह चुनौतीपूर्ण नहीं है और स्टैकओवरफ्लो एक्सडी पर वापसी करने में क्या मजा है
एलेक्जेंड्रू कैलिन

लाइब्रेरी को कोड करना मेरे लिए कोई समस्या नहीं होगी, मुझे यह चुनौतीपूर्ण, संतोषजनक और कुछ मजेदार लगता है। लेकिन आपकी टिप्पणी सिर्फ एक समाधान पर संकेत देती है, लेकिन आप इसे कैसे बनाते हैं? आप touchstartघटना के बारे में जानकारी कहाँ रखते हैं ? यदि कोई दूसरी touchstartघटना इस बीच (मल्टीटच डिस्प्ले) निकाल दी जाए तो क्या होगा ? आप लंबे नल कैसे संभालते हैं? उपयोग करना setTimeout, लेकिन क्या होगा अगर उंगली इस बीच तत्व को छोड़ देती है? यदि कोई स्पर्श घटनाओं को निकाल नहीं दिया जाता है तो आप इसका पता कैसे लगाते हैं? और इसी तरह ... मैं निश्चित रूप से कोशिश करूँगा, लेकिन मैं स्पर्श घटनाओं के एक गहरे विश्लेषण को खोजने की उम्मीद कर रहा था।
मैक्सर्ट

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

यह गलत है, आपके पास पहले होने से पहले एक दूसरा हो सकता है। इसके अलावा, आपके उत्तर के बारे में सोचने से यह निष्कर्ष निकलता है कि यह मदद नहीं करेगा, क्योंकि घटना की संपत्ति हमेशा उस तत्व के बराबर होती है जिसमें स्पर्श शुरू हुआ था, तब भी जब उंगली को तत्व के बाहर ले जाया गया था! touchstarttouchendtargettouchend
मैक्सआर्ट

3

यहाँ Android 4.3 पर स्पर्श और माउस घटनाओं पर मेरा नवीनतम अवलोकन है

ओपेरा, फ़ायरफ़ॉक्स और क्रोम एक मानक व्यवहार है

  1. स्वाइप पर (टचस्टार्ट-टचमोव-टचेंड):

    1. कोई माउस इवेंट (माउसओवर को छोड़कर) आग नहीं।
    2. माउसओवर तभी फायर करता है जब टचस्टार्ट और टचेंड एक ही तत्व पर होते हैं। (टचस्टार्ट-टचमोव-टचेंड-माउसओवर)
    3. यदि डिफ़ॉल्ट को टचस्टार्ट पर रोका गया है: डिफ़ॉल्ट स्वाइप व्यवहार काम नहीं करता है। माउस ईवेंट फायरिंग के संबंध में कोई परिवर्तन नहीं होते हैं।
  2. टैप पर (टचस्टार्ट-टचेंड):

    1. सभी माउस ईवेंट्स माउसओवर-मूसमव-मूसडाउन-माउसअप-क्लिक फायर एक देरी के बाद
    2. यदि डिफ़ॉल्ट को टचस्टार्ट पर रोका गया है: केवल माउसओवर फायर होता है।

Android डिफ़ॉल्ट ब्राउज़र में कुछ गैर-मानक व्यवहार हैं :

  1. टचस्टार्ट से पहले माउसओवर फायर होता है जिसका मतलब है कि माउसओवर हमेशा फायर करता है।
  2. सभी माउस ईवेंट टैप पर आग लगाते हैं, भले ही डिफ़ॉल्ट को टचस्टार्ट पर रोका गया हो।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.