2017-08-14 12 views
10

मुझे क्रोम पर टच स्क्रीन ओवरक्रॉलिंग में समस्याएं आ रही हैं।एसवीजी तत्वों के लिए गतिशील रूप से अक्षम-स्पर्श (ओवरक्रॉल)

मैं इसमें बजे एसवीजी तत्व है, जो कुछ आकार में शामिल है के साथ एक दस्तावेज़ है, का कहना है कि एक आयत:

enter image description here

अब, मैं आयत खींचने योग्य बनाने के लिए, जिसका अर्थ है कि मैं अक्षम करना चाहते चाहते हैं संबंधित <rect> तत्व पर सभी प्रकार की स्पर्श कार्रवाइयां, इसकी स्टाइल प्रॉपर्टी touch-action: none सेट करके।

यह क्रोम को छोड़कर, सभी डेस्कटॉप ब्राउज़रों पर ठीक काम करता है। क्रोम पर, जब मैं एक आयताकार को स्पर्श करता हूं और स्थानांतरित करता हूं, ब्राउज़र की ओवरस्क्रॉल सुविधा में प्रवेश होता है। इससे ब्राउजर विंडो अजीब तरह से आगे बढ़ती है, साथ ही साथ आयताकार पर सेट की गई सभी पॉइंटर घटनाएं रद्द होती हैं।

आईई। pointermove दूसरे के एक अंश के लिए पंजीकृत है, तो यह तब बंद हो जाता है जब overscroll kicks में pointerup को कभी भी स्पर्श नहीं किया जाता है।

enter image description here

अब, अगर मैं के बजाय किसी HTML तत्व एक एसवीजी तत्व, touch-action: none की स्थापना काम करना होता था। एक एसवीजी तत्व पर एक ही बात विफल रहता है।

तकनीकी तौर पर, यह या तो document.body पर स्थापित करने touch-action: none या touch-action: none सेट के साथ एक <div> तत्व में पूरी एसवीजी लपेटकर द्वारा हल किया जा सकता है।

दुर्भाग्यवश, यह मेरे लिए एक विकल्प नहीं है क्योंकि मुझे सीधे अपने आयत पर छोड़कर, इसके सभी मूल स्पर्श संकेतों को बनाए रखने के लिए दस्तावेज़ (और शेष आयत के आसपास के एसवीजी) की आवश्यकता होती है।

एक समाधान के रूप में, मैंने document: body पर गतिशील रूप से सेट करने का प्रयास किया था जब pointerdown घटना आयताकार पर होती है।

// Get element 
var o = document.getElementById("test"); 

// disable touch action on press of the SVG element 
o.addEventListener("pointerdown", function(e) { 
    document.body.style.touchAction = "none"; 
}); 

// re-enable touch action when released 
o.addEventListener("pointerup", function(e) { 
    document.body.style.touchAction = "auto"; 
}); 

दुर्भाग्यवश, इससे मदद नहीं मिलती है। शरीर पर शैली सेट हो जाती है और अगली बार जब मैं आयत खींचने की कोशिश करता हूं तो यह अपेक्षित काम करता है (क्योंकि pointerup घटना कभी निष्पादित नहीं होती है), बस इस बार नहीं।

ईवेंट हैंडलर को preventDefault() जोड़ना भी कोई प्रभाव नहीं पड़ता है।

मैं इस बात की सराहना करता हूं कि अगर कोई ऐसा अनुभव अनुभव करता है तो वह समाधान साझा कर सकता है।

यहां उपरोक्त का एक लाइव उदाहरण है।

// Get element 
 
var o = document.getElementById("test"); 
 

 
// disable touch action on press of the SVG element 
 
o.addEventListener("pointerdown", function(e) { 
 
    document.body.style.touchAction = "none"; 
 
}); 
 

 
// re-enable touch action when released 
 
o.addEventListener("pointerup", function(e) { 
 
    document.body.style.touchAction = "auto"; 
 
});
<svg id="test" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="width: 300px; height: 300px; border: 1px solid #eee;"> 
 
    <g transform="translate(50,50)"> 
 
    <rect fill="#00fff0" width="200" height="200" style="touch-action: none;"></rect> 
 
    </g> 
 
</svg>


अद्यतन: चाल एक touchstart घटना पर preventDefault() का उपयोग करता है की तरह लग रहा है।

हालांकि, यह एक ही समय में दोनों आधुनिक pointerdown और विरासत touchstart उपयोग करने के लिए गलत हो रहा है। यह क्रोम 60 में एक बग की तरह लगता है।अगर कोई इसकी पुष्टि कर सकता है, तो यह बहुत अच्छा होगा।

+0

उदाहरण टच स्क्रीन के साथ ही काम करने की अपेक्षा की है? मैं तुम्हारा आयताकार नहीं ले जा सकता। वैसे, क्या आपने आयत को दबाए जाने के दौरान पैन को ट्रिगर करने वाली घटना को रोकने के लिए प्रयास किया है? – lilezek

+0

हां, यह केवल टच स्क्रीन के लिए प्रासंगिक है। और, सादगी के लिए वास्तव में आयत को स्थानांतरित करने के लिए कोड वहां नहीं है, क्योंकि यह बिंदु से परे है। इसके अलावा, हां, मैंने कोशिश की 'रोकथाम() '- मुझे याद दिलाने के लिए धन्यवाद, मैं – martynasma

+0

प्रश्न अपडेट करूंगा जिसमें आपने किस कार्यक्रम को _prevented_ किया था? – lilezek

उत्तर

2

मुझे लगता है कि यह touchstart रोकने के द्वारा पर्याप्त होगा:

window.addEventListener("touchstart", function(e) { 
    // Determine wether or not you are panning from rectangle: 
    if (e.target ....) 
     e.preventDefault(); 
}); 
+0

ऐसी कोई घटना नहीं है 'या मुझे कुछ याद आ रही है? – martynasma

+0

मुझे खेद है, मैं गलत था। पांडाउन एक आयनिक घटना है आपको टचस्टार्ट का उपयोग करना होगा। – lilezek

+0

गोटा। मेरा प्रश्न अपडेट किया गया। ऐसा लगता है कि टचस्टार्ट चाल करता है। हालांकि, क्रोम की सुविधा के आसपास काम करने के लिए दोनों घटनाओं का उपयोग करना गलत लगता है, या यह एक बग है? – martynasma

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