मैं स्पर्श घटनाओं को पकड़ने के लिए जावास्क्रिप्ट और jQuery का उपयोग करने की कोशिश कर रहा हूं। लेकिन मैं एंड्रॉयड 2.3.2 पर वेब ब्राउज़र में कुछ बहुत ही अजीब व्यवहार दिखाई दे रही है: जब भी मैं स्क्रीन, ब्राउज़र टैप करें और फिर जल्दी से स्क्रीन पर कहीं और नल:एंड्रॉइड ब्राउज़र त्वरित उत्तराधिकार में दो नल के लिए घटनाओं को घुमाता है
- क्षण भर के एक नारंगी सीमा पता चलता है और पूरी स्क्रीन पर हाइलाइट करें, और
- मुझे गलत घटनाएं भेजता है।
नारंगी सीमा सिर्फ एक ही मूल समस्या के संबंधित लक्षण प्रतीत हो रहा है, तो मैं इसके बारे में बहुत चिंतित नहीं हूँ - यह वास्तव में बताने के लिए जब ब्राउज़र बातें पंगा लेना है सक्षम होने के लिए सुविधाजनक है। मैं वास्तव में क्या जानना चाहता हूं, मैं लगातार दो त्वरित नल के लिए सही स्पर्श घटना कैसे प्राप्त कर सकता हूं? मेरा मानना है कि जब उस समस्या को हल किया जाता है, तो नारंगी सीमा भी चली जाएगी।
अब तक किए गए सभी दर्दनाक विवरण क्या हैं।
Here's a page that shows the problem और प्राप्त होने वाली प्रत्येक घटना के विवरण और समय के बारे में बहुत सारी नैदानिक जानकारी प्रदर्शित करता है। यदि आप नीले आयताकार के अंदर टैप करते हैं, तो आप नारंगी फ्लैश/बुरी घटनाओं को प्राप्त करना सुनिश्चित कर लें, फिर जल्दी से काले आयताकार के अंदर टैप करें।
मेरा jQuery कोड सुंदर मानक है। log
फ़ंक्शन का कार्यान्वयन महत्वपूर्ण नहीं है; समस्या यह है कि ब्राउजर इसे कॉल नहीं करता है जब इसे करना चाहिए। घटना मैं शुरू में वर्णित पर
el = $('#battle');
el.on('touchstart', function(event) {
log(event);
return event.preventDefault();
});
el.on('touchend', function(event) {
return log(event);
});
el.on('touchcancel', function(event) {
return log(event);
});
el.mousedown(function(event) {
log(event);
return event.preventDefault();
});
return el.mouseup(function(event) {
return log(event);
});
अधिक विवरण:
ऑरेंज सीमा और आकर्षण: यह वही नारंगी सीमा है और प्रकाश डाला है कि ब्राउज़र जब आप इसे क्लिक करें हाइपरलिंक चारों ओर खींचता है। लेकिन पृष्ठ पर कोई हाइपरलिंक्स नहीं है, और ब्राउजर पूरे स्क्रीन के चारों ओर इस नारंगी सीमा को खींचता है - या अधिक विशेष रूप से, बाहरी <div id="battle">
के आस-पास जो मैं jQuery के माध्यम से ईवेंट को हुक कर रहा हूं।
गलत घटनाओं: मेरी touchstart
ईवेंट हैंडलर में, मैं event.preventDefault()
फोन कर रहा हूँ,, स्क्रॉल करने के लिए नहीं ब्राउज़र को बताने के लिए, माउस घटनाओं के संश्लेषण के लिए नहीं आदि इसलिए, मैं केवल touchstart
और touchend
घटनाओं प्राप्त करने की उम्मीद। और मैं करता हूं, पहली टैप के लिए। लेकिन दूसरे टैप के लिए touchstart
/touchend
के बजाय, मुझे दूसरी टैप के लिए टच इवेंट्स, संश्लेषित माउस इवेंट्स और कभी-कभी touchcancel
के संयोजनों की संख्या, या पहले टैप के लिए भी दोहराई गई घटनाएं मिलती हैं। नीचे दिए गए विवरण। (~ 200 मि.से से कम)
- पहले नल कम होना चाहिए:
यह व्यवहार भी बहुत ही विशेष परिस्थितियों में होता है।
- दूसरी टैप उसके तुरंत बाद आनी चाहिए (पहले टैप के
touchstart
के बाद ~ 450ms से कम)। - दूसरा टैप पहले टैप से कम से कम 150 पिक्सेल दूर होना चाहिए (पहले टैप के
touchstart
के निर्देशांक से विकर्ण के साथ मापा गया)। - यदि मैं अपना कोड हटा देता हूं जो
mousedown
औरmouseup
को हुक करता है, तो नारंगी आयताकार अब प्रकट नहीं होते हैं।हालांकि, स्पर्श घटनाओं को कभी-कभी अभी भी खराब किया जाता है।
जहां तक मुझे घटनाओं से गड़बड़ होने का मतलब है, वही है जो मैं देखता हूं। जब मैं "1:" लिखता हूं, इसका मतलब है कि घटनाएं पहले टैप के निर्देशांक के लिए हैं; "2:" का मतलब दूसरे टैप के निर्देशांक हैं। मैंने देखा की घटनाओं के निम्नलिखित पैटर्न (प्रतिशत से संकेत मिलता है कि कितनी बार हर एक 100 परीक्षणों के बाद आया था):
- (50%) 1: touchstart 1: touchend 1: mousedown 1: mouseup (कम देरी) 2: mousedown 2: mouseup
- (35%) 1: touchstart 1: touchend 2: touchstart 1: mousedown 1: mouseup 2: touchend
- (10%) 1: touchstart 1: touchend 2: touchstart 1: mousedown 1: mouseup 2: स्पर्श करके रद्द (कम देरी) 2: mousedown 2: mouseup
- (3%) 1: touchstart 1: touchend 2: touchstart 2: touchend (कम देरी) 1: mousedown 1: mouseup
- (2%) 1: touchstart 1: touchend 1: mousedown 1: mouseup (और कुछ भी नहीं दूसरे टैप के लिए बिल्कुल)
ईवेंट के कुछ संयोजन अधिक बार पर निर्भर करता है कितनी जल्दी आने के लिए लग रहा टैप करें, लेकिन मैंने पैटर्न को काफी कम नहीं किया है। (दो त्वरित, कुरकुरा नलियां ऊपर की दूसरी वस्तु के नीचे आने की संभावना अधिक होती हैं, जबकि कुरकुरापन पर कम जोर देने के साथ एक और तेजी से आग दृष्टिकोण पहली वस्तु होने की संभावना है। लेकिन मैंने विशिष्ट समय संख्या की पहचान नहीं की है प्रत्येक के लिए।) इसी प्रकार, उपरोक्त संकेतित "छोटी देरी" ~ 150ms से ~ 400ms तक कहीं भी हो सकती है; मैंने वहां या तो पूरे पैटर्न को रिवर्स-इंजीनियर नहीं किया है।
- (40%): 1: touchstart 1: touchend 2: touchstart 2: स्पर्श करके रद्द
- (35%) 1
मैं
mousedown
औरmouseup
हुक नहीं है, तो वितरण मोटे तौर पर यह है : touchstart 1: touchend 2: touchstart 2: touchend (वास्तविक वांछित व्यवहार) - (25%) 1: touchstart 1: touchend (और कुछ भी नहीं सब पर दूसरे टैप के लिए)
तो यदि मैं माउस की घटनाओं को हुक नहीं करता हूं, तो यह समय का एक तिहाई काम करता है; और अगर मैं touchcancel
का नाटक करने के लिए तैयार था तो touchend
जैसा ही था, मैं इसे 75% तक प्राप्त कर सकता था। लेकिन यह अभी भी बहुत चूसने वाला है।
वैकल्पिक मैं पहले से ही की कोशिश की है:
- मैं jQuery Mobile के
vmousedown
andvmouseup
events का उपयोग कर की कोशिश की है, लेकिन वे हमेशा दूसरे टैप के लिए शुरू हो रहा नहीं कर रहे हैं, मैं इस एक ही अंतर्निहित घटना weirdness की वजह से संदेह है। - मैं केवल स्पर्श घटनाओं को पूरी तरह से भूल सकता हूं और केवल संश्लेषित माउस ईवेंट का उपयोग कर सकता हूं, लेकिन आमतौर पर भौतिक टैप और संश्लेषित माउस ईवेंट के वितरण के बीच लगभग आधा सेकंड देरी होती है, जबकि स्पर्श घटनाएं तत्काल होती हैं अधिक उत्तरदायी हो। मैं स्क्रॉलिंग को भी रोकना चाहता हूं - यह एक पूर्णस्क्रीन गेम के लिए है, और मैं उपयोगकर्ता को गलती से पता बार को वापस देखने और गेम के हिस्से को अवरुद्ध करने की आवश्यकता नहीं रखता - और
touchstart
पर आमतौर पर प्राप्त करता है (हालांकि कभी-कभी दूसरी टैप वास्तव में मेरेpreventDefault
के बावजूद स्क्रीन स्क्रॉल करने में सक्षम है ... एक और कारण है कि मैं इस पूरे घटना गड़बड़ी को हल करना चाहता हूं)। - मैंने किसी तृतीय-पक्ष वेब ब्राउज़र (Dolphin) को आजमाया है, लेकिन इसमें ईवेंट के साथ समान समस्याएं हैं। तो मैं अनुमान लगा रहा हूं कि अंतर्निहित वेबव्यू स्क्रिप्ट पर ईवेंट वितरित करने के तरीके के साथ शायद यह एक समस्या है।
कोई भी उत्तराधिकार में दो त्वरित नल के लिए विश्वसनीय रूप से स्पर्श घटनाओं को प्राप्त करने के लिए मेरे एचटीएमएल, मेरे इवेंट हैंडलर या किसी और चीज को बदलने का तरीका सुझा सकता है?
यह मेरी गैलेक्सी टैबलेट (3.0) पर ठीक काम कर रहा है। मुझे छोटे जिंजरब्रेड फोन (2.3.4) पर यह समस्या है। मुझे लगता है कि मैं अपने स्वयं के वेब व्यू का उपयोग करके इसे हल करने में सक्षम था लेकिन समस्या यह है कि मैं टेबल नहीं पढ़ सकता क्योंकि फोन छोटा है; लेकिन निश्चित रूप से, नारंगी अब और नहीं दिख रहा है। क्या आप वेबव्यू का उपयोग करना चाहते हैं या यह कोई विकल्प नहीं है। –
@ शेरिफ, वर्तमान में मैं सिर्फ वेब सर्वर पर फाइल डाल रहा हूं, लेकिन मुझे कुछ बिंदुओं पर फोनगैप ऐप में लाने की कोशिश करने के लिए कुछ अस्पष्ट योजनाएं हैं। क्या यह वेबव्यू के बारे में आपके प्रश्न का उत्तर देता है? (मुझे इस बिंदु पर एंड्रॉइड विकास के बारे में मूल रूप से कुछ भी पता नहीं है - मैं इसे ब्राउज़र में काम करने की कोशिश कर रहा था। लेकिन मैं हमेशा सीख सकता हूं।) –