জাভাস্ক্রিপ্ট ব্যবহার করে কোনও 'টাচ স্ক্রিন' ডিভাইস সনাক্ত করার সেরা উপায় কী?


416

আমি একটি jQuery প্লাগ-ইন লিখেছি যা ডেস্কটপ এবং মোবাইল ডিভাইস উভয়ই ব্যবহারের জন্য। আমি ভাবলাম যে ডিভাইসে টাচ স্ক্রিনের ক্ষমতা আছে কিনা তা সনাক্ত করার জন্য জাভাস্ক্রিপ্টের কোনও উপায় আছে কিনা। আমি টাচ স্ক্রিন ইভেন্টগুলি সনাক্ত করতে jquery-mobile.js ব্যবহার করছি এবং এটি আইওএস, অ্যান্ড্রয়েড ইত্যাদিতে কাজ করে তবে আমি ব্যবহারকারীর ডিভাইসে টাচ স্ক্রিন আছে কিনা তার ভিত্তিতে শর্তাধীন বিবৃতিও লিখতে চাই।

এটা কি সম্ভব?


এটি ডকুমেন্ট.ডোকামেন্টএলিমেন্টে var x = 'টাচস্টার্ট' এর আরও ভাল উপায়; কনসোল.লগ (এক্স) // সমর্থিত হলে সত্য প্রত্যাবর্তন করুন // অন্যথায় মিথ্যা
ফিরুন

যদি এখনও নতুন কৌশল উদ্ভূত হয় তবে এই থ্রেডটি সুরক্ষিত কেন ?
অ্যান্ডি হফম্যান

উত্তর:


139

আপডেট: আপনার প্রকল্পে একটি সম্পূর্ণ বৈশিষ্ট্য সনাক্তকরণ লাইব্রেরি টানুন আগে নীচে blmstr এর উত্তর পড়ুন । প্রকৃত স্পর্শ সমর্থন সনাক্তকরণ আরও জটিল এবং মডার্নিজার কেবলমাত্র একটি বেসিক ব্যবহারের ক্ষেত্রে .েকে রাখে।

মডার্নিজার হ'ল একটি সাইটে যে কোনও সাইটে সমস্ত ধরণের বৈশিষ্ট্য সনাক্তকরণের একটি দুর্দান্ত ও হালকা ওজনের উপায়।

এটি প্রতিটি বৈশিষ্ট্যের জন্য এইচটিএমএল উপাদানগুলিতে কেবল ক্লাস যুক্ত করে।

তারপরে আপনি সেই বৈশিষ্ট্যগুলি সিএসএস এবং জেএসে সহজেই লক্ষ্যবস্তু করতে পারেন। উদাহরণ স্বরূপ:

html.touch div {
    width: 480px;
}

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

এবং জাভাস্ক্রিপ্ট (jQuery উদাহরণ):

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

88
মডার্নিজার টাচ স্ক্রিনগুলির জন্য পরীক্ষা করে না। এটি ব্রাউজারে স্পর্শ ইভেন্টগুলির অস্তিত্বের জন্য পরীক্ষা করে। দস্তাবেজগুলিতে "মিস টেস্ট" বিভাগটি দেখুন: আধুনিকizr.com/docs/#features-misc
হ্যারি লাভ

1
স্পর্শ ইভেন্টগুলির অস্তিত্বের জন্য আপনি একটি জেএস পরীক্ষাও করতে পারেন যদি (মডার্নিজার.টচ) {/ * টাচ স্টাফ করুন /} অন্যথায় {/ জরিমানা করবেন না, * /}
আনাতোলি জি

7
@ হ্যারিলিভের বক্তব্যটি, উইন্ডোজ 8 আসার পর থেকে মডার্নিজার ভুলভাবে আমার পিসির সমস্ত ব্রাউজারগুলি টাচ-সামঞ্জস্যপূর্ণ হিসাবে ফিরিয়ে দিচ্ছেন।
অ্যান্টন

3
আপডেট: blmstr এর উত্তর আরও ভাল, এবং এটি একটি খাঁটি জাভাস্ক্রিপ্ট সমাধান।
অ্যালান ক্রিস্টোফার থমাস

1
যদি Modernizr.touchঅপ্রত্যাশিতভাবে ফিরে আসে undefined, আপনার টাচ ইভেন্ট শনাক্তকরণের জন্য সমর্থন ছাড়াই একটি কাস্টমাইজড মডার্নিজার (আপনি বেছে নিতে এবং চয়ন করতে পারেন) থাকতে পারেন।
হেনরিক এন

679

আপনি কি এই ফাংশনটি ব্যবহার করার চেষ্টা করেছেন? (এটি ব্যবহার করার জন্য মডার্নিজার হিসাবে একই।)

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

console.log(is_touch_device());

আপডেট 1

document.createEvent("TouchEvent")trueসর্বশেষতম ক্রোমে ফিরে আসতে শুরু করেছে (বনাম 17)। মডার্নিজার কিছুক্ষণ আগে এটি আপডেট করেছে। মডার্নিজার পরীক্ষাটি এখানে দেখুন

এটি কার্যকর করতে আপনার ফাংশনটি আপডেট করুন:

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

console.log(is_touch_device1());

আপডেট 2

আমি দেখতে পেয়েছি যে উপরেরগুলি আইই 10 তে কাজ করে না (এমএস পৃষ্ঠায় মিথ্যা প্রত্যাবর্তন করে)। এখানে ঠিক আছে:

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());

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) এর সাথে কাজ করে না।
ডাবলজে

17
inঅপারেটরটি ইতিমধ্যে একটি বুলিয়ানকে মূল্যায়ন করায় ডাবল নট (!!) অতিরিক্ত অতিরিক্ত ।
স্টিভ

11
'onmsgesturechange'এমনকি অ-টাচ ডিভাইসগুলিতে (পিসি) সত্য মূল্যায়ন করছে। window.navigator.msMaxTouchPointsআরও সঠিক বলে মনে হচ্ছে এটি এখানে খুঁজে পেয়েছি
স্টিভ

6
এটি উইন্ডোজ 8-এ আইই 10 তে সত্য বলে মূল্যায়ন করছে যদিও আমার স্ক্রিনটির কোনও স্পর্শ সেন্সর নেই। আমি আমার পুরানো ল্যাপটপটি উইন্ডোজ 7 থেকে উইন্ডোজ 8
তে

120

মডার্নিজার উইন্ডোজ ফোন 8 / উইনআরটি-তে IE10 সনাক্ত করতে না পারায় একটি সহজ, ক্রস-ব্রাউজার সমাধান হ'ল:

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

আপনাকে কেবল একবার যাচাই করা দরকার যেহেতু ডিভাইসটি হঠাৎ স্পর্শকে সমর্থন করবে না বা সমর্থন করবে না, তাই এটি কেবল একটি ভেরিয়েবলে সংরক্ষণ করুন যাতে আপনি এটিকে একাধিকবার আরও দক্ষতার সাথে ব্যবহার করতে পারেন।


3
উইন্ডোতে 'onmsgesturechange' নন-টাচ ডিভাইসে "ডেস্কটপ" IE10 সনাক্ত করে, সুতরাং এটি স্পর্শ নির্ধারণের একটি নির্ভরযোগ্য পদ্ধতি নয়।
ম্যাট স্টো

6
এই উত্তরটি গ্রহণ করা উচিত ছিল, যেহেতু এটি সেরা এবং সবচেয়ে সাধারণ এবং সর্বশেষতম। একটি ফাংশনে আমি বিশ্বাস করি এটি আরও সামঞ্জস্যপূর্ণ হবে: return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);(উভয় উত্তর একত্রিত করার জন্য) আইই 10 তেও দুর্দান্ত কাজ করে!
ইয়েতি

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। 'onmsgesturechange' in windowস্পর্শ সম্ভব হলেও IE10 ডেস্কটপে সত্য প্রত্যাবর্তন করে
স্যাম থর্নটন

6
আপনার যা দরকার তা:function isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
জিফোলি 83

1
এমনকি জিএফোলিজ উইন্ডোতে 'অন্টচ স্টার্ট' এর পরামর্শ || !! (navigator.msMaxTouchPoints); ক্রোম 30 ই ফেব্রুয়ারী 2014 এ ফলগুলি ইতিবাচক প্রত্যাবর্তন করেছে
টম অ্যান্ডারসন

37

উপরের সমস্ত মন্তব্য ব্যবহার করে আমি নিম্নলিখিত কোডগুলি একত্র করেছি যা আমার প্রয়োজনের জন্য কাজ করছে:

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

আমি এটি আইপ্যাড, অ্যান্ড্রয়েড (ব্রাউজার এবং ক্রোম), ব্ল্যাকবেরি প্লেবুক, আইফোন 4 এস, উইন্ডোজ ফোন 8, আইই 10, আইই 8, আইই 10 (টাচস্ক্রিন সহ উইন্ডোজ 8), অপেরা, ক্রোম এবং ফায়ারফক্সে পরীক্ষা করেছি।

এটি বর্তমানে উইন্ডোজ ফোন 7 এ ব্যর্থ হয়েছে এবং আমি এখনও এই ব্রাউজারটির জন্য কোনও সমাধান খুঁজে পাইনি।

আশা করি কেউ এই কাজে লাগবে।


আপনি যেভাবে ব্যবহার করতে পারবেন না তার কোনও কারণ আছে: ফাংশনটি হ'ল_টচ_ডভাইস () {রিটার্ন !! (উইন্ডোতে 'অ্যান্টিস্টার্ট') || !! (নেভিগেটরে 'এমএসএমেক্সটচপয়েন্টস'); };
সিডোনাল্ডসন

ফাংশনটি ব্যবহার করে কাজ করবে তবে আমি সাধারণত উপরের চলক পদ্ধতিটি ব্যবহার করতে চাই তাই এটি কেবল একবার পরীক্ষা করা হয়ে যায় এবং আমি যখন আমার কোডটিতে পরে পরীক্ষা করি তখন দ্রুত হয়। এছাড়াও আমি জানতে পেরেছিলাম যে আমার এমএসম্যাক্স টাচপয়েন্টগুলি 0 এর চেয়ে বেশি ছিল কিনা উইন্ডোজ 8 এ টাচ স্ক্রিন ছাড়াই আইএস 10 10 এমএসম্যাক্স টাচপয়েন্ট হিসাবে ফিরে আসছিল কিনা তা পরীক্ষা করে দেখার দরকার ছিল।
ডেভিড

আয় trueজানালা আমার ফায়ারফক্স 32 7 :(
VSync

উইন্ডোজ 8-এ ফায়ারফক্স 33 এবং 33.1 উভয়ই আমার সিস্টেমে সঠিকভাবে মিথ্যা দেখায়। আপনি যদি আপনার ফায়ারফক্সকে সর্বশেষতম সংস্করণে আপগ্রেড করেন তবে কী এটি এখনও সত্য হয়? আপনার মেশিনে কি এমন কোনও ডিভাইস ইনস্টল করা আছে যা ফায়ারফক্সকে ভুলভাবে ভাবতে পারে যে আপনার মেশিনটির স্পর্শ রয়েছে?
ডেভিড

>>> উইন্ডোতে 'ontouchstart' >>> উবুন্টুতে সত্য এফএফ 51.0.1
রবি গধিয়া

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-ট্রিকস উপর
ফ্যাবিয়ান ভন এলার্টস

2
এটি আমি একমাত্র সমাধান যা পরীক্ষা করেছি যা প্রতিটি পরিস্থিতিতে কাজ করে। ধন্যবাদ!
কায়সারকিবি

20

আমার এটা ভাল লেগেছে:

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

alert(isTouchDevice());

12
বুলিয়ান ফেরত দেওয়ার জন্য কোনও ত্রৈমাসিক অভিব্যক্তি ব্যবহার করার দরকার নেই। বুলিয়ান ফিরিয়ে দিতে কেবল ভাবটি ব্যবহার করুন use function isTouchDevice(){ return (window.ontouchstart !== undefined); }
টিম ভার্মেলেন

1
আপনি কেবল ব্যবহার করতে পারেন: var isTouch = 'ontouchstart' in window;তবে এটি সর্বশেষ Chrome (v31) এর সাথে কাজ করে না, var isTouch = 'createTouch' in window.document;এখনও কাজ করছে working
অলিভিয়ার

2
পূর্বে গৃহীত প্রশ্নের মন্তব্যে ইতিমধ্যে উল্লেখ করা হয়েছে। "মডার্নিজার টাচ স্ক্রিনগুলির জন্য পরীক্ষা করে না It এটি ব্রাউজারে স্পর্শ ইভেন্টগুলির অস্তিত্বের জন্য পরীক্ষা করে"। আপনার ফাংশনটি টেকনিক্যালি হ'ল টাচএভেন্টস () টাচড্যাভিস () নয়
হেক্সালিস

নোট করুন যে অনুরূপ পদ্ধতিগুলির পরীক্ষা করা কেবলমাত্র touchstartপৃষ্ঠটিকে স্পর্শ ডিভাইস হিসাবে স্বীকৃতি দিতে ব্যর্থ হবে কারণ আই এর pointerপরিবর্তে ইভেন্ট ব্যবহার করে।
কুকিমনসটার

1
সম্ভবত @ নিস ঠিকই ছিল তবে ফায়ারফক্স 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.touch উপরের ফাংশনটি('ontouchstart' in document.documentElement)

এছাড়াও নোট করুন যে ব্যবহারকারী এজেন্টের পরীক্ষা করা iemobileআপনাকে সনাক্ত করা মাইক্রোসফ্ট মোবাইল ডিভাইসের বিস্তৃত পরিসর দেয়Windows Phone

এই এসও প্রশ্নটি দেখুন


8
"কিছু স্পর্শকর করুন" এবং "এটি স্পর্শ করতে পারে না"
লি

আপনি একই ডিভাইসগুলির জন্য একাধিকবার পরীক্ষা করছেন, এবং যখন আপনি কেবল একটি ব্যবহার করতে পারেন তখন একাধিক রেজিেক্সস করছেন। এছাড়াও, আপনি কেস-সংবেদনশীল রেজিেক্সগুলি করছেন তবে স্ট্রিংটি ইতিমধ্যে ছোট করা হয়েছে lower
সিজারসোল

1
এটি পর্যাপ্ত পরিমাণে হওয়া উচিত:/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
সিজারসোল

ছোট হাতের কোনও কারণ বা ম্যাচিং কেস-সংবেদনশীল তৈরি করার কোনও কারণ? "আইওএস", "অ্যান্ড্রয়েড" বা "আইইএমবাইল" কখন অন্য আবরণ ব্যবহার করবে?
হেনরিক এন

14

আমরা আধুনিকীকরণের বাস্তবায়ন চেষ্টা করেছি, তবে স্পর্শ ইভেন্টগুলি সনাক্ত করা আর সামঞ্জস্যপূর্ণ নয় (IE 10 এর উইন্ডোজ ডেস্কটপে স্পর্শ ইভেন্ট রয়েছে, আইই 11 কাজ করে, কারণ স্পর্শ ইভেন্টগুলি বাদ দিয়ে পয়েন্টার এপিআই যুক্ত করেছে)।

সুতরাং আমরা যতক্ষণ না ব্যবহারকারীরা কী ইনপুট টাইপ করে তা জানি না, ততক্ষণ আমরা কোনও টাচ সাইট হিসাবে ওয়েবসাইটটি অপ্টিমাইজ করার সিদ্ধান্ত নিয়েছি। এটি অন্য যে কোনও সমাধানের চেয়ে নির্ভরযোগ্য।

আমাদের গবেষণাগুলি বলছে, বেশিরভাগ ডেস্কটপ ব্যবহারকারীরা ক্লিক করার আগেই তাদের মাউসটি স্ক্রিনের উপরে নিয়ে যায়, তাই আমরা তাদের সনাক্ত করতে পারি এবং তারা কোনও কিছু ক্লিক করতে বা হোভার করতে সক্ষম হওয়ার আগে তাদের আচরণটি পরিবর্তন করতে পারি।

এটি আমাদের কোডের সরলীকৃত সংস্করণ:

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

কম্পিউটারে আজ স্পর্শ এবং মাউস উভয়ই রয়েছে ... আপনার অবশ্যই পার্থক্য করতে হবে। এটি কেবল স্পর্শ, মাউস বা উভয়ই কিনা তা জানা একেবারে অবশ্যই। 3 বিভিন্ন রাজ্য।
vsync

1
হ্যাঁ আপনি ঠিক বলেছেন, কিন্তু এটি খুব শক্ত। সর্বোত্তম ক্ষেত্রে আপনার অ্যাপ্লিকেশনটি কোনও ইনপুট নিয়ামক ব্যবহার করার জন্য ডিজাইন করা হয়েছে এবং ব্যবহারকারীর একটি টাচস্ক্রিন, মাউস, কীবোর্ড বা সমস্ত একসাথে আছে কিনা তা বিবেচ্য নয়।
মার্টিন ল্যান্টস্চ

1
ব্যবহারকারীর কী ধরণের ডিভাইস রয়েছে তার প্রকৃত তথ্যের চেয়ে ব্যবহারকারীর আচরণটি আরও মূল্যবান। যখন আপনি জানেন যে ব্যবহারকারীর মাউস, টাচস্ক্রিন এবং কীবোর্ড রয়েছে - তবে কী? আচরণটি পরিচালনা করুন (মাউসমোভ, টাচমোভ, কীডাউন ইত্যাদি)। ব্যবহারকারীরা "রানটাইম" এ তাদের ইনপুট ধরণের পরিবর্তন করতে সক্ষম হয়, আপনি যখন রিয়েললোড ছাড়াই 8 থেকে 5 ব্যবহার করা হয় এমন একটি আসল অ্যাপ্লিকেশন বিকাশ করেন, তখন এটি একটি আসল সুন্দর সমস্যা।
মার্টিন ল্যান্টস্চ

2
+1 বাস্তবিকভাবে এটি আমার পক্ষে সেরা উত্তর। উদাহরণস্বরূপ, আমার কাছে ডেটাগ্রিড রয়েছে। এই ডেটাগ্রিডগুলি সম্পাদনার জন্য স্পর্শ করতে "সম্পাদনা আইকন" বা আরও বিকল্পের জন্য একটি প্রসঙ্গ মেনু দেখাবে। যদি মাউস সরানো সনাক্ত হয়, তবে আমি আইকনটি সরিয়ে ফেলছি (গ্রিডে স্থান বাঁচায়) এবং ব্যবহারকারীরা ডাবল-ক্লিক বা ডান ক্লিক করতে পারেন।
প্রোগ্রাহামার

3
টাচ ডিভাইসগুলিতে ক্রোম মাঝেমধ্যে মাউস-মোভকে ট্রিগার করে
pstanton

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
}

উইন্ডোজের পৃষ্ঠের ট্যাবলেটটি সনাক্ত করে না
ড্যান

@ ডানবিউলিউ আপনি দয়া করে ডিভাইসের সাথে সুনির্দিষ্ট হতে পারেন, কারণ আমার কাছে উইন্ডোজ ফোন রয়েছে যার জন্য এটি ঠিক আছে, আমি আমার অ্যাপ্লিকেশনটিতে এটি ব্যবহার করেছি যা QA: ED, আমি এটি আবার পরীক্ষা করে দেখব এবং উত্তরটি আপডেট করব। অসুবিধার জন্য দুঃখিত
আমির শাহজাদ

কোন বছর নিশ্চিত নয়, এটি একটি উইন্ডোজ পৃষ্ঠের প্রো যা কোনও সহকর্মীর অন্তর্ভুক্ত। মডার্নিজার যুক্ত করার পরে আমরা এটি কাজে লাগিয়েছি।
ড্যান

এটি সঠিকভাবে আমার উইন্ডোজ 7 মেশিনে নন-টাচ প্রতিবেদন করেছে এবং একটি উইন্ডোজ 8 ল্যাপটপ ডাব্লু / টাচস্ক্রিন এবং একটি অ্যান্ড্রয়েড 4.4 মটোএক্স ফোনে স্পর্শ করে।
ক্লে নিকোলস

আমার ম্যাকে ক্রোম (46) এ একটি মিথ্যা ইতিবাচক উপহার দেয়
প্যাট্রিক ফ্যাব্রিজিয়াস

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

আমি স্পর্শ কিনা তা সনাক্ত করতে উপরের কোডের টুকরো ব্যবহার করেছি, সুতরাং আমার ফ্যান্সিবক্স আইফ্রেমগুলি স্পর্শে না ডেস্কটপ কম্পিউটারে প্রদর্শিত হবে। আমি লক্ষ্য করেছি যে অ্যান্ড্রয়েড for.০ এর জন্য অপেরা মিনি কেবলমাত্র ব্লমস্ট্র্রের কোড ব্যবহার করার সময় একটি অ-টাচ ডিভাইস হিসাবে নিবন্ধভুক্ত ছিল। (কোন এক কেন জানেন না?)

আমি ব্যবহার করে শেষ করেছি:

<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>

আপনি দয়া করে ব্যাখ্যা করতে পারেন, আপনি কেন একটি একক ম্যাজ কল একটি একক regexp সঙ্গে ব্যবহার করবেন না /iPhone|iPod|iPad|Android|BlackBerry/?
ব্যবহারকারী 907860

অপেরা মিনি অপেরার সার্ভারগুলিতে রেন্ডারিং করে না ডিভাইসে নিজেই, তাই এ রকমই অদ্ভুত।
bluesmoon

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

কোনও ডিভাইস টাচ ডিভাইস কিনা তা নির্ধারণ করতে আমি পর্দার প্রস্থ ব্যবহার করা এড়াতে চাই। উইন্ডোজ ৮ এর কথা চিন্তা করুন, 9৯৯px এর চেয়ে অনেক বড় স্পর্শ পর্দা রয়েছে false ন্যাভিগ্যাটিওর.উজার এজেন্ট ভুয়া পোস্টগুলি ওভাররাইড করা ভাল হতে পারে।

আমি এই সমস্যাটি পরীক্ষা করে দেখার সুপারিশ করব মডার্নিজারে ।

আপনি কি ডিভাইসটি স্পর্শ ইভেন্টগুলিকে সমর্থন করে বা কোনও স্পর্শ ডিভাইস কিনা তা পরীক্ষা করতে চান? দুর্ভাগ্যক্রমে, এটি একই জিনিস নয়।


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;}এটি আমার পক্ষে কাজ করেছিল, তাই আমি এই উত্তরে একটি অবদান যুক্ত করছি, যেহেতু গুগল আমাকে এখানে আনার সময় আমি ভ্যানিলা জেএস থ্রেডেরও প্রত্যাশা করছিলাম।
ড্যানিয়েল লাভেডনিও ডি লিমা

2

দেখে মনে হচ্ছে ক্রোম 24 এখন স্পর্শ ইভেন্টগুলিকে সমর্থন করে সম্ভবত উইন্ডোজ ৮ এর জন্য So সুতরাং এখানে পোস্ট করা কোডটি আর কাজ করে না। ব্রাউজার দ্বারা স্পর্শ সমর্থন করে কিনা তা সনাক্ত করার চেষ্টা করার পরিবর্তে, আমি এখন উভয় স্পর্শ এবং ক্লিক ইভেন্টগুলিকে আবদ্ধ করছি এবং কেবলমাত্র একজনকে বলা হয়েছে তা নিশ্চিত করে:

myCustomBind = function(controlName, callback) {

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

    callback.call();
  });
};

এবং তারপর এটি কল:

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

আশাকরি এটা সাহায্য করবে !


1
সম্পর্কিত থ্রেড, স্ট্যাকওভারফ্লো.com
এয়ার

2

ডেস্কটপ সবসময় জন্য ফায়ারফক্স ছাড়া সমর্থিত সমস্ত ব্রাউজার 'সত্য' বিকাশকারীর জন্য ডেস্কটপ সহায়তা প্রতিক্রিয়াশীল নকশা জন্য 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-the-how /

কোডটি এখানে ...

$(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

জাভাস্ক্রিপ্টে কীভাবে সনাক্ত করতে হবে তা পৃষ্ঠাটি টাচ স্ক্রিন ডিভাইসে প্রদর্শিত হবে কিনা তা নিয়েও আমি বিভিন্ন বিকল্পের সাথে অনেক লড়াই করেছি। আইএমও, এখন পর্যন্ত, বিকল্পটি সঠিকভাবে সনাক্ত করার জন্য কোনও আসল বিকল্প উপস্থিত নেই। ব্রাউজারগুলি হয় ডেস্কটপ মেশিনে স্পর্শ ইভেন্টগুলি প্রতিবেদন করে (কারণ ওএস সম্ভবত স্পর্শ-প্রস্তুত) বা কিছু সমাধান সমস্ত মোবাইল ডিভাইসে কার্যকর হয় না।

শেষ পর্যন্ত, আমি বুঝতে পেরেছিলাম যে আমি শুরু থেকেই ভুল পদ্ধতির অনুসরণ করছি: যদি আমার পৃষ্ঠাটি টাচ এবং নন-টাচ ডিভাইসগুলিতে একই রকম দেখতে পাওয়া যায়, তবে সম্ভবত সম্পত্তিটি সনাক্ত করার বিষয়ে আমাকে চিন্তা করতে হবে না: আমার পরিস্থিতিটি ছিল টাচ ডিভাইসে বোতামগুলির সাহায্যে টুলটিপগুলি নিষ্ক্রিয় করার জন্য তারা ডাবল-ট্যাপগুলিতে নিয়ে যায় যেখানে আমি বোতামটি সক্রিয় করতে একটি একক ট্যাপ চাইছিলাম।

আমার সমাধানটি ভিউ রিফ্যাক্টর ছিল যাতে কোনও বোতামের উপরে কোনও সরঞ্জামদণ্ডের প্রয়োজন হয় না এবং শেষ পর্যন্ত আমার কাছে জাভাস্ক্রিপ্ট থেকে টাচ ডিভাইসটি আবিষ্কার করার প্রয়োজন ছিল না এমন পদ্ধতিগুলির সাথে যেগুলির সমস্ত ত্রুটি রয়েছে


1

আপনি মডার্নাইজার ইনস্টল করতে পারেন এবং একটি সাধারণ স্পর্শ ইভেন্ট ব্যবহার করতে পারেন। এটি খুব কার্যকরী এবং উইন্ডোজ পৃষ্ঠ সহ এটিতে পরীক্ষিত প্রতিটি ডিভাইসে কাজ করে!

আমি একটি জেএসফিডাল তৈরি করেছি

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. দুটি মাউসচাঁচার ইভেন্টের গুলি ছোঁড়ার সময় যদি 20 মিমের চেয়ে কম হয় তবে ধরে নিন যে তারা কোনও মাউসটিকে ইনপুট হিসাবে ব্যবহার করছে। ইভেন্টটির আর প্রয়োজন নেই বলে ইভেন্টটি সরান এবং মাউস মভ মাউস ডিভাইসের জন্য ব্যয়বহুল ইভেন্ট।
  5. টাচস্টার্টটি আবার ফায়ার হওয়ার সাথে সাথেই (ব্যবহারকারী স্পর্শটি ব্যবহার করে ফিরে গেল), ভেরিয়েবলটি সত্যতে ফিরে আসল। প্রক্রিয়াটি পুনরাবৃত্তি করুন যাতে এটি গতিশীল ফ্যাশনে নির্ধারিত হয়। যদি কোনও অলৌকিক চিহ্নের মাধ্যমে মাউসমোভ স্পর্শে অযৌক্তিকভাবে দ্রুত দু'বার বরখাস্ত হয়ে যায় (আমার পরীক্ষায় এটি 20 মিমের মধ্যে এটি করা কার্যত অসম্ভব), পরবর্তী টাচস্টার্ট এটিকে আবার সত্যে সেট করবে।

Android এর জন্য সাফারি আইওএস এবং ক্রোমে পরীক্ষিত on

দ্রষ্টব্য: এমএস সারফেস ইত্যাদির জন্য পয়েন্টার ইভেন্টগুলিতে 100% নিশ্চিত নয় etc.

কোডপেন ডেমো


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% বলতে চাই) দিয়ে ধরে নেওয়া যেতে পারে যে ব্যবহারকারী পৃষ্ঠার প্রস্তুত হওয়ার পরে মাউসকে কমপক্ষে একটি ছোট দূরত্ব সরিয়ে নিয়ে যায় - কোনও ক্লিক ছাড়াই। নীচের প্রক্রিয়াটি এটি সনাক্ত করে। যদি সনাক্ত করা হয়, আমি এটিকে অনুপস্থিত স্পর্শ সমর্থনের চিহ্ন হিসাবে বিবেচনা করি বা যদি সমর্থিত হয়, যখন কোনও মাউস ব্যবহার করা হয় তখন তা গুরুত্বপূর্ন। সনাক্ত না হলে টাচ-ডিভাইস ধরে নেওয়া হয়।

সম্পাদনা করুন এই পদ্ধতিটি সমস্ত উদ্দেশ্যে ফিট করে না। এটি লোড হওয়া পৃষ্ঠায় ব্যবহারকারীর মিথস্ক্রিয়ার ভিত্তিতে সক্রিয় হওয়া কার্যকারিতা নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ কোনও চিত্র দর্শক er নীচের কোডটি মাউস মোভ ইভেন্টটিকে মাউস ছাড়াই ডিভাইসগুলিতে আবদ্ধ রাখবে যেমনটি এখন দেখা যাচ্ছে। অন্যান্য পদ্ধতির ভাল হতে পারে।

মোটামুটি, এটি এর মতো হয় (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;
}));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.