2011-03-18 16 views
14

प्रसंग: MobileSafari/iPad पर वेब एप्लिकेशन, दोनों पूर्ण-स्क्रीन और iframe में एम्बेडडिफ़ॉल्ट रोकें प्रेस लेकिन डिफ़ॉल्ट नहीं आईओएस मोबाइलसाफरी में खींचें?

लक्ष्य: तकनीक है कि प्रेसके लिए कस्टम ईवेंट हैंडलर्स प्रदान करता है और नल लेकिन नहींचुटकी (ज़ूम) या खींचें (स्क्रॉल/पैन)। हम प्रेस के लिए कस्टम व्यवहार प्रदान करना चाहते हैं, लेकिन सफारी को अभी भी स्क्रॉल/पैन/ज़ूम को संभालने दें।

समस्या: दो लक्ष्य पारस्परिक रूप से अनन्य प्रतीत होते हैं। प्रेस इशारा के लिए डिफ़ॉल्ट व्यवहार को रोकने के लिए, event.preventDefault को ontouchstart के तत्काल प्रतिक्रिया में बुलाया जाना चाहिए। हालांकि, डिफ़ॉल्ट व्यवहार को ड्रैग पर आगे बढ़ने के लिए, हमें प्रारंभिक ऑनटचस्टार्ट पर event event.preventDefault पर कॉल करना होगा। एक बार रोकथाम डीफॉल्ट कहलाता है, उस इशारा अनुक्रम के दौरान डिफ़ॉल्ट व्यवहार वापस पाने का कोई तरीका नहीं है (यानी जब तक सभी उंगलियां बंद नहीं होतीं)। खींचें तब तक पहचाना नहीं जाता जब तक कि कुछ आंदोलन न हो।

ड्रैग को सबसे सरल उदाहरण के रूप में चित्रित किया गया है, लेकिन हम पिंच और डबल-टैप के लिए भी डिफ़ॉल्ट व्यवहार प्राप्त करने की परवाह करते हैं। हम "छवि कॉपी करें" या टेक्स्ट का चयन करने के डिफ़ॉल्ट मोबाइलसाफरी प्रेस व्यवहार को कभी नहीं चाहते हैं।

प्रयास अब तक:

  • ontouchstart घटना सेव करें और, एक timeout के बाद, बाद में उस पर preventDefault फोन (बस से पहले प्रेस मान्यता प्राप्त हो जाएगा)। कोई प्रभाव नहीं।
  • 'oncontextmenu' के लिए सुनो। नहीं, डिफ़ॉल्ट घटना व्यवहार को इस घटना के माध्यम से संकेतित या रूट नहीं किया जा रहा है।
  • हमारे सभी ऑनचouch * हैंडलर में डिफ़ॉल्ट को रोकें, और फिर जब हम ड्रैग/पिंच इशारा पहचानते हैं, तो initTouchEvent और/या initGestureEvent का उपयोग करके नई घटनाओं का अनुकरण करें। प्रोग्रामेटिक रूप से बनाई गई घटनाओं ने को हमारे कॉलबैक पर हिट किया, लेकिन सफारी उन्हें कोई ध्यान नहीं दे रहा है, कोई डिफ़ॉल्ट व्यवहार ट्रिगर नहीं कर रहा है।
  • नकली चाल के साथ सफारी की प्रेस पहचान को तोड़ दें। सफारी थोड़ी सी चाल पर एक प्रेस रद्द कर देता है, लेकिन हम थोड़ी-थोड़ी ढलान की अनुमति देते हैं। ऑनटचस्टार्ट के बाद एक चाल घटना (ऊपर के रूप में) को सिम्युलेट करना सफारी को पहचानने में विफल होने का कारण नहीं बनता है, अगर उंगली "असली के लिए" नहीं ले जाती है।

हमारे पास एप्पल के native iOS gesture recognizers की शैली में लागू जेस्चर पहचानकर्ताओं (जावास्क्रिप्ट, ऑनटच * में) का एक पूर्ण रूप से प्रदर्शित सेट है। हमें किसी भी इशारे को पहचानने में कोई समस्या नहीं है, हम केवल ज़ूम/पैन/डबल-टैप व्यवहार को दोहराने के लिए एक अच्छा तरीका नहीं जानते हैं, जिसे सफारी मुफ्त में प्रदान करता है।

हमें कोड की आवश्यकता नहीं है; हम किसी भी सैद्धांतिक समाधान की तलाश में हैं ("पैन/ज़ूम खुद को भी लागू करें" से परे, हालांकि यदि आपके पास रुचि रखने का एक आसान तरीका है तो हम उचित सफलता प्राप्त करते हैं। हम ऐसा करने के अन्य समान प्रयासों के बारे में सीखने में भी रुचि रखते हैं - निश्चित रूप से हम इस को आजमाने वाले पहले व्यक्ति नहीं हो सकते हैं?

वैकल्पिक टीएल; डीआर: क्या टचस्टार्ट के अलावा डिफ़ॉल्ट प्रेस (जिसे टैप-एंड-होल्ड भी कहा जाता है) को रोकने के लिए कोई तरीका है?

उत्तर

19

सफलता: रोकथाम के बजाय पूरी तरह से सीएसएस के माध्यम से "डिफ़ॉल्ट प्रेस" व्यवहार को रोकें।

"हम कभी डिफ़ॉल्ट MobileSafari प्रेस चाहते हैं: यह जवाब here (आवश्यक पंजीकरण)

मैं अपने stackoverflow पोस्ट कि आप कहते हैं कि अपने अंतिम लक्ष्य है कि में देखते हैं अधिक सफारी टेक्नोलॉजीज इंजीलवादी Vicki Murley द्वारा प्रदान किया गया की "कॉपी छवि" या पाठ का चयन व्यवहार। "

ये व्यवहार सीएसएस में निष्क्रिय किया जा सकता (+ एक बोनस संपत्ति, के बाद से लोगों को अक्सर उजागर बंद करना चाहते हैं अगर वे इन अन्य व्यवहार बंद कर रहे हैं):

/* behavior */ 
-webkit-user-select: none;    /* disable cut copy paste */ 
-webkit-touch-callout: none;    /* disable callout, image save panel */ 
-webkit-tap-highlight-color: transparent; /* "turn off" link highlight */ 

टिप्पणी: हम मान लिया है कि सफारी प्रेस व्यवहार घटना आधारित, सीएसएस द्वारा संचालित नहीं था। preventDefault ontouchstart कॉलिंग प्रेस व्यवहार को रद्द (जो क्या हमें भटक का नेतृत्व किया, वास्तव में) करता है, लेकिन है कि एक अनपेक्षित पक्ष प्रभाव हो रहा है। असल में, मोबाइल सफारी "प्रेस इवेंट" को "प्रेस पर सीएसएस" के रूप में निष्पादित नहीं करता है।

सीएसएस के साथ प्रेस व्यवहार को अक्षम करने से हमें केवल एक बार फिर रोकथाम डीफॉल्ट को कॉल करने की इजाजत मिली है, जहां हमें वास्तव में इसकी आवश्यकता होती है।

0

बदसूरत संभावना: प्रेस को न रोकें - एक डिफ़ॉल्ट प्रेस कुछ भी नहीं करें। एक ग्लास-फलक div का उपयोग करने का प्रयास करें जो सभी स्पर्शों को पकड़ता है और टचस्टार्ट पर कुछ भी नहीं रोकता है।

डिव्स में डिफ़ॉल्ट व्यवहार व्यवहार (कुछ प्रकार का चयन) होता है, लेकिन शायद इसे रोक दिया जा सकता है, रोकथाम के माध्यम से नहीं, लेकिन <body style="-webkit-user-select:none"> के माध्यम से? ref

इसका मतलब यह होगा हम अपने ही हिट परीक्षण करने की निर्धारित करने के लिए क्या डोम के लिए हमारी मान्यता प्राप्त घटनाओं पारित करने के लिए नोड होगा, के बाद से हम सिर्फ घटनाओं बबल सामने जाने नहीं दे सकता डोम पूर्वज श्रृंखला।