2011-05-04 6 views
10

मैं स्पर्श घटनाओं से ब्राउज़र के व्यूपोर्ट के संबंध में स्पर्श निर्देशांक प्राप्त करने का प्रयास कर रहा हूं (जैसे टचस्टार्ट)। मैंने उन्हें क्लाइंटएक्स/वाई गुणों से प्राप्त करने का प्रयास किया, लेकिन वास्तव में स्क्रॉलिंग सहित मूल्यों को वापस कर दिया।टच घटनाक्रम क्लाइंटएक्स/वाई स्क्रॉलिंग शामिल है या नहीं?

यह स्पेक के खिलाफ है, क्योंकि यह कहता है कि क्लाइंटएक्स/वाई को स्क्रॉल किए बिना निर्देशांक वापस करना चाहिए।

  • मैंने सफलता के बिना मेटा व्यूपोर्ट टैग जोड़ने/हटाने का प्रयास किया।
  • मैंने आईफोन पर आईओएस 4.3 और रात में फेनेक में इसका परीक्षण किया - स्क्रॉलिंग के साथ दोनों रिटर्न मूल्य।

मैं क्या गलत कर रहा हूं?

धन्यवाद

उत्तर

7

यह हमेशा event.touches है कि भले ही आप इस (jQuery यहाँ का प्रयोग करके) की तरह अपने घटना

$("body").bind('touchmove', function(e){ 
//stops normal scrolling with touch 
e.preventDefault(); 

console.log(event.touches[0].pageX) 

}) 

परिभाषित प्रयास करें इस

event.touches[0].pageX 

नोट;

Safari guide अधिक विस्तार

+0

हां, मैं इसे event.touches [0] .clientX द्वारा पुनर्प्राप्त कर रहा हूं ... लेकिन मुझे अभी भी पता नहीं है कि क्यों (कम से कम आईओएस) पेजएक्स और क्लाइंटएक्स को रिपोर्ट करता है (वास्तव में उन्हें व्यूपोर्ट ऑफ़सेट से अलग होना चाहिए) – kuvik

+1

आप सही हैं, एक बग की तरह लगता है। आप पृष्ठ के स्क्रॉल को ऑफ़सेट करके इसके आसपास हैक कर सकते हैं '(event.targetTouches [0] .screenY - $ (विंडो) .scrollTop()) ' –

+0

e.originalEvent.touches [0] .clientY मेरे लिए काम कर रहा है –

14

आप कुछ भी गलत नहीं कर रहे हैं प्रदान करता है। यह वेबकिट के पुराने संस्करणों में एक बग है जो पृष्ठ स्क्रॉल होने पर होता है। मैंने आईओएस 4 में यह बग देखा है और एंड्रॉइड 4.0 में एक अलग बग देखा है।

मुझे बग का पता लगाने और सही मूल्यों की गणना करने का एक तरीका मिला है। उम्मीद है कि यह दूसरों के लिए उपयोगी हो सकता है:

function fixTouch (touch) { 
    var winPageX = window.pageXOffset, 
     winPageY = window.pageYOffset, 
     x = touch.clientX, 
     y = touch.clientY; 

    if (touch.pageY === 0 && Math.floor(y) > Math.floor(touch.pageY) || 
     touch.pageX === 0 && Math.floor(x) > Math.floor(touch.pageX)) { 
     // iOS4 clientX/clientY have the value that should have been 
     // in pageX/pageY. While pageX/page/ have the value 0 
     x = x - winPageX; 
     y = y - winPageY; 
    } else if (y < (touch.pageY - winPageY) || x < (touch.pageX - winPageX)) { 
     // Some Android browsers have totally bogus values for clientX/Y 
     // when scrolling/zooming a page. Detectable since clientX/clientY 
     // should never be smaller than pageX/pageY minus page scroll 
     x = touch.pageX - winPageX; 
     y = touch.pageY - winPageY; 
    } 

    return { 
     clientX: x, 
     clientY: y 
    }; 
} 

इस फ़ंक्शन को event.touches सरणी में प्रत्येक स्पर्श के लिए बुलाया जाना है।

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