2013-06-24 12 views
7

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

एक स्पर्श प्रक्रिया के दौरान, touchstart और touchmove घटनाओं को अपेक्षित कहा जाता है। हालांकि, touchmove हैंडलर द्वारा किए गए कार्यों में से एक कार्यकाल touchcancel ईवेंट को समय-समय पर ट्रिगर करने लगता है। (मुझे यकीन नहीं है कि यह महत्वपूर्ण है, लेकिन touchcancel को ट्रिगर करने वाली क्रिया एक एसवीजी ऑब्जेक्ट की viewBox विशेषता का संशोधन है।) यदि मैं इस क्रिया को टिप्पणी करता हूं, तो स्पर्श प्रक्रिया सामान्य रूप से प्राप्त होती है (यानी touchmove से touchend तक)।

मेरे सभी स्पर्श हैंडलर preventDefault() फ़ंक्शन को कॉल करते हैं, इसलिए समस्या इस बग में वर्णित नहीं है: https://code.google.com/p/android/issues/detail?id=19827

मैंने पढ़ा है कि बहुत सारे inconsistency among browsers हैं जब touchcancel कहा जाता है। स्टॉक एंड्रॉइड ब्राउजर एकमात्र ऐसा है जो मेरे लिए समस्याग्रस्त है।

क्या वहां कोई कामकाज है? उदाहरण के लिए, क्या मैं दूर touchcancel ईवेंट को पूरी तरह अक्षम कर सकता हूं? एक और विचार था कि touchcancel हैंडलर प्रोग्रामेटिक रूप से touchstart/touchmove ईवेंट ट्रिगर करना था, लेकिन मुझे इससे बहुत दूर नहीं मिला। किसी भी सुझाव की सराहना की जाएगी।

+3

Argh! मुझे लगता है कि यह समस्या अब क्रोम ब्राउज़र में माइग्रेट हो गई है! यह संस्करण 28 में दिखाई दिया। Https://code.google.com/p/chromium/issues/detail?id=260732 देखें। –

+0

यह पोस्ट भी देखें, जो संबंधित प्रतीत होता है: http://stackoverflow.com/questions/15944197/android-browser-touchcancel-being-fired-althought-touchmove-has-preventdefault –

+2

मुझे क्रोम में इस समस्या का सामना करना पड़ रहा है अब ब्राउज़र, Hammer.js का उपयोग करने में हस्तक्षेप। किसी को पता है कि इस के आसपास कैसे जाना है? – acjay

उत्तर

0

मुझे लगता है कि टचकंसेल एक विशेष घटना है जो ट्रिगर करता है जब उपयोगकर्ता विशिष्ट व्यवहार में बटन को स्पर्श करता है।

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

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

$ ('चयनकर्ता') बंद। ('स्पर्श करके रद्द'), की अगर यह $ delefated है। ('माता-पिता') undelegate ('स्पर्श करके रद्द', 'चयनकर्ता')

मुझे नहीं लगता कि यह है कि e.preventDefault() के साथ समस्या है। केवल तभी हो सकता है जब आप किसी लिंक पर क्लिक करते हैं, और पृष्ठ पुनः लोड करना शुरू होता है। जब आप बटन पर क्लिक करते हैं तो पृष्ठ को फिर से लोड किया जा सकता है? और पेज रीलोड होने के बाद आप कुछ कार्रवाइयों की प्रतीक्षा करते हैं, आप वास्तव में समझ नहीं सकते हैं, यह खुशी है।

+0

[टचकैंकेल] (https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel) अनिवार्य रूप से ब्राउज़र द्वारा निकाल दिया जाएगा, और इसे रद्द करने या रोकने की कोशिश कर रहा है इसके अंदर डीफॉल्ट काम नहीं करेगा इरादा है। – andreszs

0

मैं जानता हूँ कि यह थोड़ा देर हो चुकी है, लेकिन अगर someonee और ने इस मुद्दे को, here's a small jQuery extension कि pointercancel और touchcancel घटनाओं से निपटने का तरीका बताता है का सामना करना पड़ रहा है।

मूल रूप से, आप सूचक घटनाओं आप के रूप में ब्राउज़र है दोनों सही ढंग से लागू सुविधाओं बस none के एक मूल्य के साथ touch-action सीएसएस संपत्ति का उपयोग करके pointercancel को रोकने के लिए, जब तक सक्षम हो जाएगा करने के लिए स्विच है। (एंड्रॉयड 5 +, क्रोम 55+, IE11, एज, आदि)

तुम सच बजाय विरासत स्पर्श इवेंट का उपयोग करना चाहिए, तो आप अपने touchmove घटनाओं में event.preventDefault() को लागू करना होगा और इस फायरिंग से touchcancel पाएगा , लेकिन यह पैन या क्लिक जैसी किसी भी डिफ़ॉल्ट कार्रवाई के ब्राउज़र हैंडलिंग को पूरी तरह अक्षम कर देगा।

एक अंतिम नोट के रूप में, मैं स्पर्श इवेंट + स्पर्श कार्रवाई सीएसएस नियम क्योंकि touch-action हाल ही में एक ही है कि सूचक घटनाक्रम पर भी जुड़ गया, का उपयोग नहीं होता। तो जब यह संयोजन नए ब्राउज़र में काम कर सकता है, तो यह निश्चित रूप से पुराने लोगों में विफल हो जाएगा (touchcancel ईवेंट अप्रत्याशित रूप से ट्रिगर करके)।

मेरे द्वारा पोस्ट किए गए jQuery एक्सटेंशन से README की जांच करें क्योंकि यह टचवेन्ट और पॉइंटरइवेंट इंटरफेस का उपयोग करने के प्रभावों को बताता है।

2

आप Hammer.js उपयोग कर रहे हैं, तो आप को जोड़कर सूचक-घटनाओं (जो इस तरह समस्याओं के कारण), निष्क्रिय कर सकते हैं: लोड हो रहा है Hammer.js करने से पहले अपने index.html में delete window.PointerEvent; , और यह उन घटनाओं पर ध्यान नहीं देगा ।
आप SUPPORT_POINTER_EVENTS = झूठी भी सेट कर सकते हैं; (v2.0.8 की लाइन 384) एक ही काम करने के लिए। आदर्श रूप से देव इसे बंद करने की क्षमता जोड़ देंगे, लेकिन इसलिए ओपन सोर्स दुविधाएं ...

+0

बहुत बढ़िया! धन्यवाद! मैं दिनों से क्रोम (एंड्रॉइड) टचकैंकल व्यवहार से लड़ रहा हूं और यह पहला समाधान है जिसने वास्तव में hammer.js के साथ अपने मुद्दों को हल किया है। – horace

+0

क्या आप मुझसे मजाक कर रहे हैं !? मैं इस काम पर विश्वास नहीं कर सकता। पागल कैसे! मैंने तीन दिनों तक समस्या निवारण करने की कोशिश की है कि मेरा यूआई क्यों घुमाया गया था और यह सरल k̶l̶u̶d̶g̶e̶ ठीक हल हो गया है? वाह सिर्फ वाह.... – Michael

संबंधित मुद्दे