जावास्क्रिप्ट का उपयोग करके 'टच स्क्रीन' डिवाइस का पता लगाने का सबसे अच्छा तरीका क्या है?


416

मैंने एक jQuery प्लग-इन लिखा है जो डेस्कटॉप और मोबाइल डिवाइस दोनों पर उपयोग के लिए है। अगर डिवाइस में टच स्क्रीन क्षमता है, तो यह पता लगाने के लिए कि जावास्क्रिप्ट के साथ एक तरीका है, तो मुझे आश्चर्य हुआ। मैं टच स्क्रीन घटनाओं का पता लगाने के लिए jquery-mobile.js का उपयोग कर रहा हूं और यह आईओएस, एंड्रॉइड आदि पर काम करता है, लेकिन मैं यह भी सशर्त बयान लिखना चाहूंगा कि क्या उपयोगकर्ता के डिवाइस में टच स्क्रीन है।

क्या यह संभव है?


यह बेहतर तरीका है var x = 'touchstart' में document.documentElement; कंसोल.लॉग (x) // यदि सही है तो वापस लौटें // अन्यथा झूठे
Risa__B

यदि नई तकनीकें अभी भी उभर रही हैं तो इस धागे को संरक्षित क्यों किया गया है ?
एंडी हॉफमैन

जवाबों:


139

अद्यतन: कृपया अपने प्रोजेक्ट में संपूर्ण फीचर डिटेक्शन लाइब्रेरी को खींचने से पहले ब्लमस्ट्रस का उत्तर पढ़ें । वास्तविक स्पर्श समर्थन का पता लगाना अधिक जटिल है, और माडर्निज़र केवल एक मूल उपयोग के मामले को कवर करता है।

किसी भी साइट पर सभी प्रकार की सुविधा का पता लगाने के लिए मॉडर्निज़र एक शानदार, हल्का तरीका है।

यह बस प्रत्येक सुविधा के लिए HTML तत्व में कक्षाएं जोड़ता है।

फिर आप सीएसएस और जेएस में उन सुविधाओं को आसानी से लक्षित कर सकते हैं। उदाहरण के लिए:

html.touch div {
    width: 480px;
}

html.no-touch div {
    width: auto;
}

और जावास्क्रिप्ट (jQuery उदाहरण):

$('html.touch #popup').hide();

88
मॉर्डनिज्र टच स्क्रीन के लिए परीक्षण नहीं करता है। यह ब्राउज़र में स्पर्श घटनाओं के अस्तित्व के लिए परीक्षण करता है। डॉक्स में "विविध टेस्ट" अनुभाग देखें: modernizr.com/docs/#features-misc
हैरी लव

1
यदि आप (Modernizr.touch) {/ * स्पर्श सामान /} स्पर्श सामान के अस्तित्व के लिए एक JS परीक्षण भी कर सकते हैं / { ठीक है, नहीं * /}
Anatoly G

7
@ Harrylove की बात के बाद, जब से विंडोज 8 बाहर आया है, मॉर्डनिजर गलत तरीके से मेरे सभी पीसी के ब्राउज़रों को स्पर्श-संगत के रूप में वापस कर रहा है।
एंटोन

3
अपडेट: ब्लमस्ट का उत्तर बेहतर है, और एक शुद्ध जावास्क्रिप्ट समाधान है।
एलन क्रिस्टोफर थॉमस

1
यदि Modernizr.touchअनपेक्षित रूप से लौटता है undefined, तो आपके पास टच इवेंट डिटेक्शन के समर्थन के बिना एक कस्टमाइज़्ड मॉर्डनिज़र (आपको लेने और चुनने के लिए) हो सकता है।
हेनरिक एन

679

क्या आपने इस फ़ंक्शन का उपयोग करने का प्रयास किया है? (यह वही है जो मॉडर्निज़्र ने इस्तेमाल किया था।)

function is_touch_device() {  
  try {  
    document.createEvent("TouchEvent");  
    return true;  
  } catch (e) {  
    return false;  
  }  
}

console.log(is_touch_device());

अद्यतन १

document.createEvent("TouchEvent")trueनवीनतम क्रोम में वापस लौटना शुरू कर दिया है (v। 17)। कुछ समय पहले मॉडर्निज़र ने इसे अपडेट किया था। यहां से मॉडर्निज़र टेस्ट देखें

इसे काम करने के लिए अपने फ़ंक्शन को इस तरह अपडेट करें:

function is_touch_device1() {
  return 'ontouchstart' in window;
}

console.log(is_touch_device1());

अद्यतन २

मैंने पाया कि उपरोक्त IE10 पर काम नहीं कर रहा था (एमएस सर्फेस पर गलत लौट रहा है)। यहाँ तय है:

function is_touch_device2() {
  return 'ontouchstart' in window        // works on most browsers 
  || 'onmsgesturechange' in window;  // works on IE10 with some false positives
};

console.log(is_touch_device2());

अद्यतन 3

'onmsgesturechange' in windowकुछ IE डेस्कटॉप संस्करणों में सच वापस आ जाएगा ताकि विश्वसनीय न हो। यह थोड़ा और मज़बूती से काम करता है:

function is_touch_device3() {
  return !!('ontouchstart' in window        // works on most browsers 
  || navigator.maxTouchPoints);       // works on IE10/11 and Surface
};

console.log(is_touch_device3());

UPDATE 2018

समय बीतता जाता है और इसको परखने के नए और बेहतर तरीके होते हैं। मैंने मूल रूप से मॉडर्निज़र को इसे जाँचने का तरीका निकाला और सरल बनाया है:

function is_touch_device4() {
    
    var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
    
    var mq = function (query) {
        return window.matchMedia(query).matches;
    }

    if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
        return true;
    }

    // include the 'heartz' as a way to have a non matching MQ to help terminate the join
    // https://git.io/vznFH
    var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
    return mq(query);
}

console.log(is_touch_device4());

यहां वे गैर-मानक touch-enabledमीडिया क्वेरी सुविधा का उपयोग कर रहे हैं , जो मुझे लगता है कि थोड़े अजीब और बुरे व्यवहार हैं। लेकिन हे, असली दुनिया में मुझे लगता है कि यह काम करता है। भविष्य में (जब वे सभी द्वारा समर्थित हैं) उन मीडिया क्वेरी सुविधाओं से आपको एक ही परिणाम मिल सकता है: pointerऔर hover

मॉडर्निज़्रर इसे कैसे कर रहे हैं, इसका स्रोत देखें ।

टच का पता लगाने के साथ मुद्दों को समझाने वाले एक अच्छे लेख के लिए, देखें: स्टू कॉक्स: आप एक टचस्क्रीन का पता नहीं लगा सकते


20
डबल बैंग एक बूलियन को एक मूल्य देता है, जिससे फ़ंक्शन trueया तो वापस आ जाता है false। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: stackoverflow.com/questions/4686583/…
रोब फ्लेहरटी

2
यह ओपेरा मोबाइल 10 या इंटरनेट एक्सप्लोरर मोबाइल 6 (विंडोज मोबाइल 6.5) के साथ काम नहीं करता है।
19

17
डबल नॉट (!!) बहुत inही अच्छा है क्योंकि ऑपरेटर पहले से ही एक बूलियन का मूल्यांकन करता है।
स्टीव

11
'onmsgesturechange'गैर-स्पर्श उपकरणों (पीसी) में भी सही मूल्यांकन कर रहा है। window.navigator.msMaxTouchPointsअधिक सटीक लगता है। यहां मिला
स्टीव

6
यह विंडोज 8 पर IE10 पर सच का मूल्यांकन कर रहा है, भले ही मेरी स्क्रीन में कोई स्पर्श सेंसर नहीं है। मैंने अपने पुराने लैपटॉप को विंडोज 7 से विंडोज 8 में अपग्रेड किया।
23

120

जैसा कि Modernizr IE10 का विंडोज फोन 8 / WinRT पर पता नहीं लगाता है, एक सरल, क्रॉस-ब्राउज़र समाधान है:

var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;

आपको केवल एक बार जांचने की आवश्यकता है क्योंकि डिवाइस अचानक समर्थन का समर्थन नहीं करेगा या स्पर्श का समर्थन नहीं करेगा, इसलिए बस इसे एक चर में संग्रहीत करें ताकि आप इसे कई बार अधिक कुशलता से उपयोग कर सकें।


3
विंडो में 'onmsgesturechange ’नॉन-टच डिवाइस पर" डेस्कटॉप "IE10 का भी पता लगाता है, इसलिए यह टच को निर्धारित करने का एक विश्वसनीय तरीका नहीं है।
मैट स्टो

6
यह उत्तर स्वीकार किया जाना चाहिए था, क्योंकि यह सबसे अच्छा और सबसे सरल और एक तारीख तक है। एक समारोह में मेरा मानना ​​है कि यह अधिक सुसंगत होगा: return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);(दोनों उत्तरों को संयोजित करने के लिए) IE10 में ठीक काम करता है!
यति

यह स्वीकृत उत्तर होना चाहिए। 'onmsgesturechange' in windowजब टच संभव हो तब भी IE10 डेस्कटॉप पर सही रिटर्न
सैम थॉर्नटन

6
आप सभी की जरूरत है:function isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
GFoley83

1
यहां तक ​​कि विंडो में 'ओनटुचस्टार्ट' का सुझाव जीओपोलिस !! (navigator.msMaxTouchPoints); क्रोम 30 देव फ़रवरी 2014 में सकारात्मक रिटर्न देता है।
टॉम एंडरसन

37

उपरोक्त सभी टिप्पणियों का उपयोग करके मैंने निम्नलिखित कोड इकट्ठे किए हैं जो मेरी आवश्यकताओं के लिए काम कर रहे हैं:

var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0));

मैंने आईपैड, एंड्रॉइड (ब्राउज़र और क्रोम), ब्लैकबेरी प्लेबुक, आईफोन 4 जी, विंडोज फोन 8, आईई 10, आईई 8, आईई 10 (टचस्क्रीन के साथ विंडोज 8), ओपेरा, क्रोम और फ़ायरफ़ॉक्स पर यह परीक्षण किया है।

यह वर्तमान में विंडोज फोन 7 पर विफल रहता है और मैं अभी तक उस ब्राउज़र के लिए कोई समाधान नहीं खोज पाया हूं।

आशा है कि किसी को यह उपयोगी लगता है।


क्या कोई कारण है जिसका आप उपयोग नहीं कर सकते: फ़ंक्शन is_touch_device () {वापसी !! ('विंडो में' ontouchstart ') || !! (नाविक में 'msmaxtouchpoint'); };
साइडलॉसन

फ़ंक्शन का उपयोग करना काम करेगा, लेकिन मैं आमतौर पर उपरोक्त चर विधि का उपयोग करना पसंद करता हूं, इसलिए यह केवल एक बार परीक्षण किया जाता है और जब मैं अपने कोड में बाद में जांच करता हूं तो यह तेज होता है। इसके अलावा मुझे पता चला कि मुझे यह देखने के लिए परीक्षण करने की आवश्यकता है कि क्या msMaxTouchPoints 0 से अधिक था IE 8 के रूप में विंडोज 8 पर एक टच स्क्रीन के बिना 0 msMaxTouchPoints के रूप में वापस आ रहा था।
डेविड

trueविंडोज 7 पर मेरे फ़ायरफ़ॉक्स 32 पर रिटर्न 7 :(
vsync

विंडोज 8 पर फ़ायरफ़ॉक्स 33 और 33.1 दोनों मेरे सिस्टम पर सही ढंग से गलत दिखाते हैं। यदि आप अपने फ़ायरफ़ॉक्स को नवीनतम संस्करण में अपग्रेड करते हैं तो क्या यह अभी भी सही है? क्या आपके पास शायद आपकी मशीन पर एक उपकरण स्थापित है जो फ़ायरफ़ॉक्स को गलत तरीके से सोच सकता है कि आपकी मशीन स्पर्श कर चुकी है?
डेविड

>>> 'ontouchstart' विंडो में >>> सच FF 51.0.1 ubuntu पर
रवि गढ़िया

25

बातचीत मीडिया सुविधाओं की शुरूआत के बाद से आप बस कर सकते हैं:

if(window.matchMedia("(pointer: coarse)").matches) {
    // touchscreen
}

https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer

अद्यतन (टिप्पणियों के कारण): उपरोक्त समाधान यह पता लगाने के लिए है कि क्या "मोटे सूचक" - आमतौर पर एक टच स्क्रीन - प्राथमिक इनपुट डिवाइस है। यदि आप एक माउस के साथ एक डिवाइस भी टच स्क्रीन है जिसके any-pointer: coarseबजाय आप का उपयोग कर सकते हैं के साथ चाहते हैं।

अधिक जानकारी के लिए यहां एक नज़र डालें: यह पता लगाना कि ब्राउज़र में कोई माउस नहीं है और केवल स्पर्श है


3
यह अब तक का सबसे अच्छा उपाय है, धन्यवाद! यद्यपि मैं (pointer: coarse)आपको उपयोग करने की सलाह दूंगा क्योंकि आप केवल प्राथमिक इनपुट को लक्षित कर रहे हैं। उत्पादन में इस्तेमाल किया जा सकता है, क्योंकि कुछ असमर्थित ब्राउज़र केवल डेस्कटॉप हैं। Css-tricks पर इसके बारे में एक बढ़िया लेख है ।
फेबियन वॉन एलर्ट्स

2
यह एकमात्र उपाय है जिसका मैंने परीक्षण किया है जो हर स्थिति में काम करता है। धन्यवाद!
kaiserkiwi

20

मैं यह पसंद है:

function isTouchDevice(){
    return typeof window.ontouchstart !== 'undefined';
}

alert(isTouchDevice());

12
एक बूलियन को वापस करने के लिए एक टर्नरी अभिव्यक्ति का उपयोग करने की आवश्यकता नहीं है। बस बूलियन को वापस करने के लिए अभिव्यक्ति का उपयोग करें। function isTouchDevice(){ return (window.ontouchstart !== undefined); }
टिम वर्मालेन

1
आप अभी भी उपयोग कर सकते हैं: var isTouch = 'ontouchstart' in window;हालांकि यह नवीनतम क्रोम (v31) के साथ काम नहीं करता है, फिर var isTouch = 'createTouch' in window.document;भी काम कर रहा है।
ओलिवियर

2
जैसा कि पहले से स्वीकार किए गए प्रश्न की टिप्पणियों में पहले ही उल्लेख किया गया है। "मॉर्डनिज़र टच स्क्रीन के लिए परीक्षण नहीं करता है। यह ब्राउज़र में स्पर्श घटनाओं के अस्तित्व के लिए परीक्षण करता है"। आपका कार्य तकनीकी रूप से hasTouchEvents () isTouchDevice () नहीं है
hexalys

ध्यान दें कि इसी तरह के परीक्षण केवल touchstartसरफेस को एक टच डिवाइस के रूप में पहचानने में विफल होंगे क्योंकि IE pointerइसके बजाय घटनाओं का उपयोग करता है।
कुकीमॉन्स्टर

1
शायद @Nis सही था, लेकिन फ़ायरफ़ॉक्स 39 में, यह सही ढंग से गलत है।
डेन डैस्कलेस्क्यू

17

यदि आप मॉडर्निज़्र का उपयोग करते हैं , तो Modernizr.touchपहले बताए अनुसार उपयोग करना बहुत आसान है ।

हालांकि, मैं Modernizr.touchसुरक्षित होने के लिए और उपयोगकर्ता एजेंट परीक्षण के संयोजन का उपयोग करना पसंद करता हूं ।

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/ipod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

यदि आप Modernizr का उपयोग नहीं करते हैं, तो आप बस Modernizr.touchऊपर दिए गए फ़ंक्शन को बदल सकते हैं('ontouchstart' in document.documentElement)

यह भी ध्यान दें कि उपयोगकर्ता एजेंट का परीक्षण करने से iemobileआपको पता चला Microsoft मोबाइल उपकरणों की व्यापक रेंज मिल जाएगी Windows Phone

इस SO प्रश्न को भी देखें


8
"कुछ छूने" और "यह छू नहीं सकते" के लिए बहुत सारे बोनस अंक
ली सैक्सन

आप एक ही डिवाइस के लिए कई बार जाँच कर रहे हैं, और जब आप सिर्फ एक का उपयोग कर सकते हैं तो कई Regexes कर रहे हैं। प्लस, आप केस-असंवेदनशील रेगेक्स कर रहे हैं लेकिन स्ट्रिंग पहले से ही नीची है।
कैसरसोल

1
यह पर्याप्त होना चाहिए:/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
कैसरसोल

मिलान के मामले को असंवेदनशील बनाने या कम करने का कोई कारण? "IOS", "एंड्रॉइड" या "IEMobile" अन्य आवरण का उपयोग कब करेंगे?
हेनरिक एन

14

हमने आधुनिकीकरण को लागू करने की कोशिश की, लेकिन स्पर्श घटनाओं का पता लगाना अब संगत नहीं है (IE 10 में विंडोज़ डेस्कटॉप पर टच इवेंट्स हैं, IE 11 काम करता है, क्योंकि हैव ने टच इवेंट्स को हटा दिया है और पॉइंटर एपी जोड़ा है)।

इसलिए हमने वेबसाइट को एक टच साइट के रूप में तब तक ऑप्टिमाइज़ करने का फैसला किया, जब तक हम यह नहीं जानते कि उपयोगकर्ता के पास किस प्रकार का इनपुट है। यह किसी भी अन्य समाधान की तुलना में अधिक विश्वसनीय है।

हमारे शोध कहते हैं, कि ज्यादातर डेस्कटॉप उपयोगकर्ता क्लिक करने से पहले स्क्रीन पर अपने माउस के साथ चलते हैं, इसलिए हम उनका पता लगा सकते हैं और किसी भी चीज़ को क्लिक या मंडराने में सक्षम होने से पहले व्यवहार बदल सकते हैं।

यह हमारे कोड का एक सरलीकृत संस्करण है:

var isTouch = true;
window.addEventListener('mousemove', function mouseMoveDetector() {
    isTouch = false;
    window.removeEventListener('mousemove', mouseMoveDetector);
});

कंप्यूटर में आज स्पर्श और माउस दोनों हैं ... आपको अंतर करना होगा। यह पता होना चाहिए कि क्या यह केवल स्पर्श, माउस या दोनों है। 3 अलग-अलग राज्य।
vsync

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

1
उपयोगकर्ता का व्यवहार एक वास्तविक जानकारी से अधिक मूल्य का है कि उपयोगकर्ता के पास किस प्रकार का उपकरण है। जब आप जानते हैं कि उपयोगकर्ता के पास माउस, टचस्क्रीन और कीबोर्ड है - तब क्या? व्यवहार को संभालें (मूसमोव, टचमोव, कीडाउन, आदि)। उपयोगकर्ता "रनटाइम" पर अपने इनपुट प्रकार को बदलने में सक्षम हैं, यह एक वास्तविक जानवर की समस्या है, जब आप एक वास्तविक अनुप्रयोग विकसित कर रहे हैं जो बिना लोड के 8 से 5 का उपयोग किया जाता है।
मार्टिन लैंटज़श

2
+1 व्यावहारिक रूप से यह मेरे लिए सबसे अच्छा जवाब है। उदाहरण के लिए, मेरे पास डेटाग्रिड्स हैं। ये डेटाट्रेड्स संपादन के लिए या अधिक विकल्पों के लिए एक संदर्भ मेनू को छूने के लिए "संपादन आइकन" दिखाएंगे। यदि माउस चाल का पता चला है, तो मैं आइकन को हटा देता हूं (ग्रिड पर स्थान बचाता है) और उपयोगकर्ता डबल-क्लिक या राइट-क्लिक कर सकते हैं।
प्राग्रामर

3
स्पर्श उपकरणों पर क्रोम कभी
मूसमव को

9

वर्किंग फिडल

मैंने इसे इस तरह से हासिल किया है;

function isTouchDevice(){
    return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch);
}

if(isTouchDevice()===true) {
    alert('Touch Device'); //your logic for touch device
}
else {
    alert('Not a Touch Device'); //your logic for non touch device
}

विंडोज़ सरफेस टैबलेट का पता नहीं लगाता
डैन ब्यूलियू

@DanBeaulieu आप डिवाइस के लिए विशिष्ट हो सकते हैं, क्योंकि मेरे पास विंडोज़ फोन है, जिसके लिए इसका ठीक काम है, साथ ही मैंने अपने एप्लिकेशन में इसका उपयोग किया है जो कि QA: ED है, मैं इसे फिर से जांचूंगा और उत्तर को अपडेट करूंगा। असुविधा के लिए खेद है
आमिर शहजाद

निश्चित नहीं है कि किस वर्ष, यह एक विंडोज़ सतह प्रो है जो एक सहकर्मी का है। आधुनिकता को जोड़ने के बाद हमें यह काम करने के लिए मिला।
दान ब्यूलियू

यह मेरे विंडोज 7 मशीन पर गैर-टच की सूचना देता है और विंडोज 8 लैपटॉप डब्ल्यू / टचस्क्रीन और एक एंड्रॉइड 4.4 मोटोएक्स फोन पर स्पर्श करता है।
क्ले निकोल्स

एक झूठी अपने Mac पर क्रोम (46) में सकारात्मक देता है
पैट्रिक Fabrizius

9

अगर उनके पास टचस्क्रीन है, तो यह जाँचने से बेहतर है कि क्या वे इसका उपयोग कर रहे हैं, साथ ही यह जाँचना भी आसान है।

if (window.addEventListener) {
    var once = false;
    window.addEventListener('touchstart', function(){
        if (!once) {
            once = true;
            // Do what you need for touch-screens only
        }
    });
}

6

विंडोज सरफेस टैबलेट में भी यह अच्छा काम करता है !!!

function detectTouchSupport {
msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
touchSupport = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch &&     document instanceof DocumentTouch);
if(touchSupport) {
    $("html").addClass("ci_touch");
}
else {
    $("html").addClass("ci_no_touch");
}
}

4

मैं स्पर्श करने के लिए पता लगाने के लिए ऊपर दिए गए कोड के टुकड़ों का उपयोग करता हूं, इसलिए मेरे फैंसीबॉक्स iframes डेस्कटॉप कंप्यूटर पर दिखाई देंगे और स्पर्श पर नहीं। मैंने देखा कि एंड्रॉइड 4.0 के लिए ओपेरा मिनी अभी भी केवल ब्लमस्ट के कोड का उपयोग करते समय एक गैर-स्पर्श डिवाइस के रूप में पंजीकृत था। (क्या किसी को पता है क्यों?)

मैंने प्रयोग करके समाप्त किया:

<script>
$(document).ready(function() {
    var ua = navigator.userAgent;
    function is_touch_device() { 
        try {  
            document.createEvent("TouchEvent");  
            return true;  
        } catch (e) {  
            return false;  
        }  
    }

    if ((is_touch_device()) || ua.match(/(iPhone|iPod|iPad)/) 
    || ua.match(/BlackBerry/) || ua.match(/Android/)) {
        // Touch browser
    } else {
        // Lightbox code
    }
});
</script>

क्या आप बता सकते हैं, आप एक ही मैच कॉल का उपयोग एक रीजेक्सपी के साथ क्यों नहीं कर सकते हैं /iPhone|iPod|iPad|Android|BlackBerry/?
user907860

ओपेरा मिनी ओपेरा के सर्वर पर रेंडरिंग को अंजाम देता है न कि डिवाइस पर।
ब्लूसमून

4

स्पर्श का पता लगाने की कोशिश के साथ सबसे बड़ा "गोचा" हाइब्रिड उपकरणों पर है जो स्पर्श और ट्रैकपैड / माउस दोनों का समर्थन करते हैं। यहां तक ​​कि अगर आप सही तरीके से यह पता लगाने में सक्षम हैं कि उपयोगकर्ता का डिवाइस स्पर्श का समर्थन करता है, तो आपको वास्तव में यह पता लगाने की आवश्यकता है कि उपयोगकर्ता वर्तमान में किस इनपुट डिवाइस का उपयोग कर रहा है। इस चुनौती का विस्तृत विवरण और यहाँ एक संभावित समाधान है

मूल रूप से यह पता लगाने के लिए कि क्या उपयोगकर्ता ने केवल स्क्रीन को छुआ है या इसके बजाय माउस / ट्रैकपैड का उपयोग किया है , पृष्ठ पर एक touchstartऔर mouseoverघटना दोनों को पंजीकृत करने के लिए है :

document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"

एक स्पर्श कार्रवाई इन दोनों घटनाओं को ट्रिगर करेगी, हालांकि पूर्व ( touchstart) हमेशा अधिकांश उपकरणों पर पहले। इसलिए घटनाओं के इस पूर्वानुमेय अनुक्रम पर भरोसा करते हुए, आप can-touchदस्तावेज़ पर इस समय उपयोगकर्ता के वर्तमान इनपुट प्रकार को प्रतिबिंबित करने के लिए दस्तावेज़ रूट में एक वर्ग को गतिशील रूप से जोड़ते हैं या हटा सकते हैं :

;(function(){
    var isTouch = false //var to indicate current input type (is touch versus no touch) 
    var isTouchTimer 
    var curRootClass = '' //var indicating current document root class ("can-touch" or "")
     
    function addtouchclass(e){
        clearTimeout(isTouchTimer)
        isTouch = true
        if (curRootClass != 'can-touch'){ //add "can-touch' class if it's not already present
            curRootClass = 'can-touch'
            document.documentElement.classList.add(curRootClass)
        }
        isTouchTimer = setTimeout(function(){isTouch = false}, 500) //maintain "istouch" state for 500ms so removetouchclass doesn't get fired immediately following a touch event
    }
     
    function removetouchclass(e){
        if (!isTouch && curRootClass == 'can-touch'){ //remove 'can-touch' class if not triggered by a touch event and class is present
            isTouch = false
            curRootClass = ''
            document.documentElement.classList.remove('can-touch')
        }
    }
     
    document.addEventListener('touchstart', addtouchclass, false) //this event only gets called when input type is touch
    document.addEventListener('mouseover', removetouchclass, false) //this event gets called when input type is everything from touch to mouse/ trackpad
})();

अधिक जानकारी यहाँ


3

इस पोस्ट को देखें , यह वास्तव में एक अच्छा कोड स्निपेट देता है कि टच डिवाइस का पता लगाने पर क्या किया जाए या टचस्टार्ट इवेंट को क्या कहा जाए:

$(function(){
  if(window.Touch) {
    touch_detect.auto_detected();
  } else {
    document.ontouchstart = touch_detect.surface;
  }
}); // End loaded jQuery
var touch_detect = {
  auto_detected: function(event){
    /* add everything you want to do onLoad here (eg. activating hover controls) */
    alert('this was auto detected');
    activateTouchArea();
  },
  surface: function(event){
    /* add everything you want to do ontouchstart here (eg. drag & drop) - you can fire this in both places */
    alert('this was detected by touching');
    activateTouchArea();
  }
}; // touch_detect
function activateTouchArea(){
  /* make sure our screen doesn't scroll when we move the "touchable area" */
  var element = document.getElementById('element_id');
  element.addEventListener("touchstart", touchStart, false);
}
function touchStart(event) {
  /* modularize preventing the default behavior so we can use it again */
  event.preventDefault();
}

3

मैं यह निर्धारित करने के लिए स्क्रीन की चौड़ाई का उपयोग करने से बचूंगा कि क्या डिवाइस एक टच डिवाइस है। 699px की तुलना में टच स्क्रीन बहुत बड़ी हैं, विंडोज 8 के बारे में सोचें। नवगीतियोर.यूजरएन्जेंट झूठे शब्दों को ओवरराइड करने के लिए अच्छा हो सकता है।

मैं इस मुद्दे की जांच करने की सिफारिश करूंगा ।

क्या आप परीक्षण करना चाहते हैं कि क्या उपकरण स्पर्श घटनाओं का समर्थन करता है या एक स्पर्श उपकरण है। दुर्भाग्य से, यह वही बात नहीं है।


3

नहीं, यह संभव नहीं है। दिए गए उत्कृष्ट उत्तर कभी भी आंशिक होते हैं, क्योंकि किसी भी विधि से झूठी सकारात्मकता और झूठी नकारात्मकता उत्पन्न होगी। यहां तक ​​कि ब्राउज़र को हमेशा पता नहीं होता है कि ओएस एपीआई के कारण टचस्क्रीन मौजूद है या नहीं, और ब्राउज़र सत्र के दौरान तथ्य बदल सकता है, विशेष रूप से केवीएम-प्रकार की व्यवस्था के साथ।

इस उत्कृष्ट लेख में आगे का विवरण देखें:

http://www.stucox.com/blog/you-cant-detect-a-touchscreen/

लेख आपको उन मान्यताओं पर पुनर्विचार करने का सुझाव देता है जो आपको टचस्क्रीन का पता लगाना चाहते हैं, वे शायद गलत हैं। (मैंने अपने ऐप के लिए अपनी जाँच की, और मेरी धारणाएँ वास्तव में गलत थीं!)

लेख समाप्त होता है:

लेआउट के लिए, मान लें कि सभी के पास एक टचस्क्रीन है। माउस उपयोगकर्ता बड़े यूआई नियंत्रणों का उपयोग कर सकते हैं, स्पर्श उपयोगकर्ताओं की तुलना में अधिक आसानी से छोटे लोगों का उपयोग कर सकते हैं। एक ही होवर राज्यों के लिए जाता है।

घटनाओं और अंतःक्रियाओं के लिए, मान लें कि किसी के पास टचस्क्रीन हो सकती है। कीबोर्ड, माउस और टच इंटरैक्शन को एक-दूसरे के साथ लागू करें, यह सुनिश्चित करें कि एक-दूसरे को ब्लॉक न करें।


3

इनमें से कई काम करते हैं, लेकिन या तो jQuery की आवश्यकता होती है, या जावास्क्रिप्ट लिंटर को सिंटैक्स के बारे में शिकायत करते हैं। इसे हल करने के अपने शुरुआती प्रश्न को ध्यान में रखते हुए, एक "जावास्क्रिप्ट" (jQuery नहीं, मॉडर्निज़र) के लिए पूछता है, यहां एक सरल फ़ंक्शन है जो हर बार काम करता है। यह भी कम से कम के रूप में आप प्राप्त कर सकते हैं।

function isTouchDevice() {
    return !!window.ontouchstart;
}

console.log(isTouchDevice());

एक अंतिम लाभ जो मैं बताऊंगा वह यह है कि यह कोड फ्रेमवर्क और डिवाइस अज्ञेयवादी है। का आनंद लें!


function isTouchScreen() { return window.matchMedia('(hover: none)').matches;}यह मेरे लिए काम करता है, इसलिए मैं यहां इस जवाब में एक योगदान जोड़ रहा हूं, क्योंकि मैं भी एक वेनिला जेएस धागे की उम्मीद कर रहा था जब Google मुझे यहां लाया था।
डैनियल लावेदीनियो डे लीमा

2

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

myCustomBind = function(controlName, callback) {

  $(controlName).bind('touchend click', function(e) {
    e.stopPropagation();
    e.preventDefault();

    callback.call();
  });
};

और फिर इसे कॉल करना:

myCustomBind('#mnuRealtime', function () { ... });

उम्मीद है की यह मदद करेगा !


1
संबंधित सूत्र, stackoverflow.com/questions/12566306/…
वायु

2

डेस्कटॉप हमेशा के लिए Firefox को छोड़कर समर्थित सभी ब्राउज़र सही डेवलपर के लिए डेस्कटॉप समर्थन उत्तरदायी डिजाइन के लिए Firefox की वजह से भी आप क्लिक टच बटन या नहीं!

मुझे उम्मीद है कि मोज़िला अगले संस्करण में इसे ठीक कर देगा।

मैं फ़ायरफ़ॉक्स 28 डेस्कटॉप का उपयोग कर रहा हूँ।

function isTouch()
{
    return !!("ontouchstart" in window) || !!(navigator.msMaxTouchPoints);
}

यह अभी भी 32.0 संस्करण है और उन्होंने इसे अभी तक ठीक नहीं किया है! पागल। क्यों यह भीख नहीं हो सकता ?? यह हमेशा लौटता है true:(
vsync

2

jQuery v1.11.3

प्रदान किए गए उत्तरों में बहुत अच्छी जानकारी है। लेकिन, हाल ही में मैंने बहुत समय बिताया है कि वास्तव में दो चीजों को पूरा करने के लिए एक समाधान में एक साथ सब कुछ बाँधने की कोशिश कर रहा हूं:

  1. पता लगाएं कि उपयोग में आने वाला उपकरण टच स्क्रीन प्रकार का उपकरण है।
  2. पता लगाएं कि डिवाइस टैप किया गया था।

इस पोस्ट और जावास्क्रिप्ट के साथ टच स्क्रीन उपकरणों का पता लगाने के अलावा , मुझे यह पोस्ट पैट्रिक लॉउक ​​द्वारा बेहद उपयोगी लगी: https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-thehow /

यहाँ कोड है ...

$(document).ready(function() {
//The page is "ready" and the document can be manipulated.

    if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0))
    {
      //If the device is a touch capable device, then...
      $(document).on("touchstart", "a", function() {

        //Do something on tap.

      });
    }
    else
    {
      null;
    }
});

जरूरी! *.on( events [, selector ] [, data ], handler )विधि की जरूरत है एक चयनकर्ता, आम तौर पर एक तत्व है कि "touchstart" घटना, या स्पर्श के साथ जुड़े घटना की तरह किसी भी अन्य संभाल कर सकते हैं करने के लिए। इस मामले में, यह हाइपरलिंक तत्व "ए" है।

अब, आपको जावास्क्रिप्ट में नियमित रूप से माउस को क्लिक करने की आवश्यकता नहीं है, क्योंकि आप हाइपरलिंक के लिए चयनकर्ताओं का उपयोग करके इन घटनाओं को संभालने के लिए CSS का उपयोग कर सकते हैं "ऐसा" तत्व:

/* unvisited link */
a:link 
{

}

/* visited link */
a:visited 
{

}

/* mouse over link */
a:hover 
{

}

/* selected link */
a:active 
{

}

नोट: अन्य चयनकर्ता भी हैं ...


1
var isTouchScreen = 'createTouch' in document;

या

var isTouchScreen = 'createTouch' in document || screen.width <= 699 || 
    ua.match(/(iPhone|iPod|iPad)/) || ua.match(/BlackBerry/) || 
    ua.match(/Android/);

मुझे लगता है कि एक अधिक गहन जाँच होगी।


3
यह ध्यान देना अच्छा होगा कि इसका uaउल्लेख है navigator.userAgent। साथ ही स्क्रीन की चौड़ाई का पता लगाने से गलत परिणाम मिल सकता है अगर कोई पूर्ण स्क्रीन मोड में ब्राउज़र खोलता है।
HoLyVieR

1

मैं उपयोग करता हूं:

if(jQuery.support.touch){
    alert('Touch enabled');
}

jQuery के मोबाइल में 1.0.1


1

मैंने जावास्क्रिप्ट में पता लगाने के तरीके पर विभिन्न विकल्पों के साथ बहुत संघर्ष किया कि पृष्ठ को टच स्क्रीन डिवाइस पर प्रदर्शित किया गया है या नहीं। IMO, अब तक, विकल्प का ठीक से पता लगाने के लिए कोई वास्तविक विकल्प मौजूद नहीं है। ब्राउज़र या तो डेस्कटॉप मशीनों पर स्पर्श घटनाओं की रिपोर्ट करते हैं (क्योंकि OS शायद टच-रेडी), या कुछ समाधान सभी मोबाइल उपकरणों पर काम नहीं करते हैं।

अंत में, मुझे एहसास हुआ कि मैं शुरू से गलत दृष्टिकोण का पालन कर रहा था: यदि मेरा पृष्ठ स्पर्श और गैर-स्पर्श डिवाइस पर समान दिखना था, तो मुझे संपत्ति का पता लगाने के बारे में चिंता करने की आवश्यकता नहीं होनी चाहिए: मेरा परिदृश्य था टच डिवाइस पर बटन पर टूलटिप्स को निष्क्रिय करने के लिए, क्योंकि वे डबल-टैप करते हैं जहां मैं बटन को सक्रिय करने के लिए एक टैप चाहता था।

मेरा समाधान यह था कि इस दृश्य को रिफ्लेक्टर किया जाए ताकि एक बटन पर किसी टूलटिप की आवश्यकता न हो, और अंत में मुझे जावास्क्रिप्ट से टच डिवाइस का पता लगाने की आवश्यकता नहीं थी, जिसमें सभी तरीकों से कमियां हों


1

आप आधुनिकता स्थापित कर सकते हैं और एक साधारण स्पर्श घटना का उपयोग कर सकते हैं। यह बहुत प्रभावी है और हर डिवाइस पर काम करता है जिसे मैंने खिड़कियों की सतह सहित परीक्षण किया है!

मैंने jsFiddle बनाया है

function isTouchDevice(){
    if(Modernizr.hasEvent('touchstart') || navigator.userAgent.search(/Touch/i) != -1){
         alert("is touch");
            return true;
         }else{
            alert("is not touch");
            return false;
    }
}

3
एसओ में आपका स्वागत है! कोड अपने आप में (जैसे कि अप्रयुक्त कोड) शायद ही कभी एक उत्तर का गठन करता है। आप स्निपेट की व्याख्या जोड़कर इस उत्तर को बेहतर बना सकते हैं।
ईबर

1

व्यावहारिक उत्तर ऐसा लगता है जो संदर्भ पर विचार करता है:

1) सार्वजनिक साइट (कोई लॉगिन नहीं)
दोनों विकल्पों के साथ काम करने के लिए यूआई को कोड दें।

2) लॉगिन साइट
कैप्चर करें कि क्या लॉगिन फॉर्म पर माउस-मूव हुआ है, और इसे एक छिपे हुए इनपुट में सहेजें। मान लॉगिन क्रेडेंशियल के साथ पारित किया जाता है और उपयोगकर्ता के सत्र में जोड़ा जाता है , इसलिए इसका उपयोग सत्र की अवधि के लिए किया जा सकता है।

केवल लॉगिन पृष्ठ में जोड़ने के लिए Jquery:

$('#istouch').val(1); // <-- value will be submitted with login form

if (window.addEventListener) {
    window.addEventListener('mousemove', function mouseMoveListener(){
        // Update hidden input value to false, and stop listening
        $('#istouch').val(0); 
        window.removeEventListener('mousemove', mouseMoveListener);
    });
} 

(+1 से @ बर्ट और उनके उत्तरों पर @ मर्टिन लैंत्ज़ से +1 करें)


1

समस्या

हाइब्रिड डिवाइसों के कारण जो स्पर्श और माउस इनपुट के संयोजन का उपयोग करते हैं, आपको गतिशील रूप से राज्य / चर को बदलने में सक्षम होना चाहिए जो यह नियंत्रित करता है कि कोड का एक टुकड़ा चलना चाहिए यदि उपयोगकर्ता एक स्पर्श उपयोगकर्ता है या नहीं।

स्पर्श उपकरण mousemoveटैप पर भी आग लगाते हैं।

समाधान

  1. मान लें कि लोड पर झूठ गलत है।
  2. जब तक किसी touchstartघटना को निकाल दिया जाता है तब तक प्रतीक्षा करें , फिर इसे सच पर सेट करें।
  3. यदि टचस्टार्ट निकाल दिया गया था, तो एक मूसमोव हैंडलर जोड़ें।
  4. यदि दो मूसमव इवेंट के बीच फायरिंग का समय 20ms से कम था, तो मान लें कि वे माउस का प्रयोग इनपुट के रूप में कर रहे हैं। इवेंट को हटा दें क्योंकि अब इसकी आवश्यकता नहीं है और माउस डिवाइस के लिए माउसमोव एक महंगी घटना है।
  5. जैसे ही टचस्टार्ट को फिर से निकाल दिया जाता है (उपयोगकर्ता स्पर्श का उपयोग करके वापस चला गया), चर वापस सत्य पर सेट हो जाता है। और प्रक्रिया को दोहराएं ताकि यह एक गतिशील फैशन में निर्धारित हो। अगर कुछ चमत्कार के द्वारा मूसमव को दो बार स्पर्श पर बेतुका रूप से जल्दी से निकाल दिया जाता है (मेरे परीक्षण में यह 20ms के भीतर ऐसा करना लगभग असंभव है), अगला टचस्टार्ट इसे सही पर वापस सेट कर देगा।

एंड्रॉइड के लिए सफारी आईओएस और क्रोम पर परीक्षण किया गया।

नोट: MS सरफेस आदि के लिए पॉइंटर-ईवेंट पर 100% निश्चित नहीं

कोडपेन डेमो


const supportsTouch = 'ontouchstart' in window;
let isUsingTouch = false;

// `touchstart`, `pointerdown`
const touchHandler = () => {
  isUsingTouch = true;
  document.addEventListener('mousemove', mousemoveHandler);
};

// use a simple closure to store previous time as internal state
const mousemoveHandler = (() => {
  let time;

  return () => {
    const now = performance.now();

    if (now - time < 20) {
      isUsingTouch = false;
      document.removeEventListener('mousemove', mousemoveHandler);
    }

    time = now;
  }
})();

// add listeners
if (supportsTouch) {
  document.addEventListener('touchstart', touchHandler);
} else if (navigator.maxTouchPoints || navigator.msMaxTouchPoints) {
  document.addEventListener('pointerdown', touchHandler);
}

1

दरअसल, मैंने इस प्रश्न पर शोध किया और सभी स्थितियों पर विचार किया। क्योंकि यह मेरी परियोजना पर भी एक बड़ा मुद्दा है। इसलिए मैं नीचे दिए गए फ़ंक्शन तक पहुंचता हूं, यह सभी उपकरणों पर सभी ब्राउज़रों के सभी संस्करणों के लिए काम करता है:

const isTouchDevice = () => {
  const prefixes = ['', '-webkit-', '-moz-', '-o-', '-ms-', ''];
  const mq = query => window.matchMedia(query).matches;

  if (
    'ontouchstart' in window ||
    (window.DocumentTouch && document instanceof DocumentTouch)
  ) {
    return true;
  }
  return mq(['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join(''));
};

संकेत : निश्चित रूप से,isTouchDeviceबसbooleanमानलौटाताहै।


0

अत्यधिक jQuery supportऑब्जेक्ट:

jQuery.support.touch = 'ontouchend' in document;

और अब आप इसे इस तरह से कहीं भी देख सकते हैं:

if( jQuery.support.touch )
   // do touch stuff

0

यह मेरे लिए अब तक ठीक काम कर रहा है:

//Checks if a touch screen
is_touch_screen = 'ontouchstart' in document.documentElement;

if (is_touch_screen) {
  // Do something if a touch screen
}
else {
  // Not a touch screen (i.e. desktop)
}

0

जब एक माउस जुड़ा होता है, तो इसे काफी उच्च हिट्रेट के साथ माना जा सकता है (मैं व्यावहारिक रूप से 100% कहूंगा) कि उपयोगकर्ता पृष्ठ तैयार होने के बाद कम से कम एक छोटी दूरी तय करता है - बिना किसी क्लिक के। नीचे दिया गया तंत्र इस का पता लगाता है। यदि पता लगाया गया है, तो मैं इसे लापता स्पर्श समर्थन के संकेत के रूप में मानता हूं या यदि एक माउस उपयोग में है, तो मामूली महत्व का समर्थन किया जाता है। पता न चलने पर टच-डिवाइस को मान लिया गया है।

संपादित करें यह दृष्टिकोण सभी उद्देश्यों के लिए उपयुक्त नहीं हो सकता है। इसका उपयोग कार्यक्षमता को नियंत्रित करने के लिए किया जा सकता है जो लोड किए गए पृष्ठ पर उपयोगकर्ता इंटरैक्शन के आधार पर सक्रिय होता है, उदाहरण के लिए एक छवि दर्शक। नीचे दिया गया कोड माउस के बिना उपकरणों पर बंधे मूसमव इवेंट को भी छोड़ देगा क्योंकि यह अब बाहर खड़ा है। अन्य दृष्टिकोण बेहतर हो सकते हैं।

मोटे तौर पर, यह इस तरह से जाता है (jQuery के लिए खेद है, लेकिन शुद्ध जावास्क्रिप्ट में समान है):

var mousedown, first, second = false;
var ticks = 10;
$(document).on('mousemove', (function(e) {
    if(UI.mousechecked) return;
    if(!first) {
        first = e.pageX;
        return;
        }
    if(!second && ticks-- === 0) {
        second = e.pageX;
        $(document).off('mousemove'); // or bind it to somewhat else
        }
    if(first  && second  && first !== second && !mousedown){
        // set whatever flags you want
        UI.hasmouse = true;
        UI.touch = false;
        UI.mousechecked = true;
    }

    return;
}));
$(document).one('mousedown', (function(e) {
    mousedown = true;
    return;
}));
$(document).one('mouseup', (function(e) {
    mousedown = false;
    return;
}));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.