ตรวจจับเบราว์เซอร์มือถือ


888

ฉันกำลังมองหาฟังก์ชั่นที่คืนค่าบูลีนหากผู้ใช้มีเบราว์เซอร์มือถือหรือไม่

ฉันรู้ว่าฉันสามารถใช้navigator.userAgentและเขียนฟังก์ชั่นนั้นโดยใช้ regex แต่ตัวแทนผู้ใช้นั้นมีความหลากหลายเกินไปสำหรับแพลตฟอร์มที่แตกต่างกัน ฉันสงสัยว่าการจับคู่อุปกรณ์ที่เป็นไปได้ทั้งหมดจะเป็นเรื่องง่ายและฉันคิดว่าปัญหานี้ได้รับการแก้ไขก่อนหลายครั้งดังนั้นควรมีวิธีแก้ปัญหาที่สมบูรณ์สำหรับงานดังกล่าว

ฉันดูที่เว็บไซต์นี้แต่น่าเศร้าที่สคริปต์นั้นเป็นความลับที่ฉันไม่รู้ว่าจะใช้เพื่อจุดประสงค์ของฉันได้อย่างไรซึ่งก็คือการสร้างฟังก์ชั่นที่คืนค่าจริง / เท็จ


6
ที่เกี่ยวข้อง: stackoverflow.com/questions/3514784/… .
Frédéric Hamidi

2
ลองอ่านสิ่งนี้ stackoverflow.com/questions/743129/…
KyelJmD

5
@Thrustmaster: ไม่จริงหรอก การให้บริการ JS ที่แตกต่างกันไปยังเบราว์เซอร์ที่แตกต่างกันหมายความว่าคุณต้องเพิ่มVary: User-Agentการตอบกลับของคุณมิฉะนั้นการแคชพร็อกซีจะจัดเก็บหนึ่งเวอร์ชันและส่งไปยังเบราว์เซอร์ชนิดอื่น แต่Vary: User-Agentทำให้การตอบสนองไม่สามารถเข้าถึงได้ใน IE
bobince

16
@ บันทึก: คุณพยายามทำอะไรโดยตรวจหาเบราว์เซอร์ "มือถือ" ความแตกต่างนั้นสามารถพิสูจน์ได้สูงในโลกปัจจุบันของแท็บเล็ตและอุปกรณ์คอมพิวเตอร์ไฮบริด คุณต้องการตรวจจับหน้าจอขนาดเล็กและนำเสนอ UI ที่แตกต่างกันในกรณีนั้นหรือไม่? คุณต้องการตรวจจับการเชื่อมต่อที่มีแบนด์วิดท์ต่ำหรือไม่? คุณกำลังค้นหาอินเทอร์เฟซระบบสัมผัสอยู่หรือไม่?
bobince

2
ดังนั้นฉันได้อัปเดตคำตอบของฉันเพื่อใช้วิธี javascript detectmobilebrowsers.comแต่คืนค่าบูลีนหากใครยังต้องการสิ่งนี้ (ในกรณี) มีความสุขในการตรวจจับ :)
Michael Zaporozhets

คำตอบ:


1317

ใช้ Regex (จากdetectmobilebrowsers.com ):

นี่คือฟังก์ชั่นที่ใช้ regex ที่ยาวและครอบคลุมซึ่งจะคืนค่าtrueหรือfalseขึ้นอยู่กับว่าผู้ใช้เรียกดูด้วยมือถือหรือไม่

window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

สำหรับผู้ที่ต้องการรวมแท็บเล็ตในการทดสอบนี้ (แม้ว่าคุณไม่ควรเนื้อหา) คุณสามารถใช้ฟังก์ชั่นต่อไปนี้:

window.mobileAndTabletCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

คำตอบเดิม

คุณสามารถทำได้โดยเพียงแค่เรียกใช้รายการอุปกรณ์และตรวจสอบว่าuseragentสิ่งที่ตรงกับที่ต้องการ:

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];

    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

อย่างไรก็ตามเนื่องจากคุณเชื่อว่าวิธีนี้ไม่น่าเชื่อถือคุณสามารถสันนิษฐานได้ว่าอุปกรณ์ใด ๆ ที่มีความละเอียด800x600หรือน้อยกว่านั้นเป็นอุปกรณ์มือถือเช่นกันทำให้เป้าหมายของคุณแคบลงยิ่งกว่าเดิม

กล่าวคือ

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

อ้างอิง:


25
สวัสดีฉันเพิ่งเยี่ยมชมลิงค์detectmobilebrowsers.comบน iPad 3, iOS 6.1.2 ของฉันและมีข้อความระบุว่า "ไม่พบเบราว์เซอร์มือถือ"
Richard Lovejoy

49
@RichardLove สนุกเมื่อสร้างเว็บไซต์ iPad โดยทั่วไปไม่ถือว่าเป็นมือถือ
Michael Zaporozhets

42
จากหน้าเกี่ยวกับ : ไม่พบแท็บเล็ต Android, iPads, Kindle Fires และ PlayBooks ในการเพิ่มการรองรับแท็บเล็ตให้เพิ่ม|android|ipad|playbook|silkใน regex แรก
Gras Double

13
Google TV ก็เป็น Android เช่นกัน มือถือคืออะไร ขนาดหน้าจอ ? แตะไหม DeviceOrientation เมื่อฉันออกแบบมันเป็นคำถามของการเลื่อนเม้าส์หรือไม่ลิงก์ขนาดใหญ่หรือลิงก์ขนาดเล็ก ดังนั้นสำหรับตอนนี้ฉันทำงานด้วย "if (Modernizr.touch)" :)
molokoloco

31
อืมความคิดทั้งหมดของตัวแทนผู้ใช้น่ากลัวและจริง ๆ ต้องหยุดจริงๆ เราจำเป็นต้องหยุดการอนุญาตให้ลูกค้าต่อสู้กับกระแสน้ำและเพียงแค่ยึดคำสั่งสื่อ หากพวกเขาต้องการที่จะทำตามการเปลี่ยนเส้นทางโยสำหรับหน้าโดยเฉพาะอย่างยิ่งจากนั้นเพียงแค่ตรวจสอบช่วงของสื่อโดยเฉพาะอย่างยิ่งการสอบถามผ่าน JS คือtylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

เกี่ยวกับ:

if (typeof window.orientation !== 'undefined') { ... }

... เนื่องจากสมาร์ทโฟนมักจะสนับสนุนคุณสมบัตินี้และเบราว์เซอร์เดสก์ท็อปไม่

แก้ไข:ตามที่ @Gajus ชี้ให้เห็นแล้วการแก้ปัญหานี้เลิกใช้แล้วและไม่ควรใช้ ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
อันนี้จริง ๆ แล้วไม่เหมือนใครและยอดเยี่ยมจริงๆคุณรังเกียจไหมถ้าฉันเพิ่มลงในคำตอบ?
Michael Zaporozhets

77
นี่อาจจะไม่ทำงานเป็นเวลานาน 1) แท็บเล็ตสามารถมีขนาดหน้าจอที่เหมาะสมคุณต้องการให้แสดงเว็บไซต์เดสก์ท็อปเต็มรูปแบบ แต่พวกเขาจะมีคุณสมบัตินี้ 2) Windows 8 มาถึงแล้วพร้อมกับแล็ปท็อปที่มีหน้าจอสัมผัสและหน้าจอหมุนได้
Dave Hilditch

10
สำหรับจุดแรกของคุณเกี่ยวกับแท็บเล็ตที่มีขนาดหน้าจอที่เหมาะสม - ฉันคิดว่าคุณสามารถสร้างข้อโต้แย้งเดียวกันสำหรับโซลูชันอื่น ๆ ทั้งหมดได้เช่นกัน (แท็บเล็ตที่มีหน้าจอขนาดใหญ่ที่ถูกติดตามเป็นหน้าจอขนาดเล็ก) ต่อไปแนวคิดที่นี่คือการค้นหาคุณสมบัติที่ใช้ร่วมกันโดยอุปกรณ์ขนาดเล็กแทนการรักษารหัสยาวยาวและเพิ่ม regex กับอุปกรณ์ใหม่ทุกรุ่น / รุ่น / รุ่น ฉันคิดว่าการตรวจจับอุปกรณ์เป็นของอดีตและวันนี้เราต้องมุ่งเน้นไปที่การตรวจจับคุณสมบัติ อีกครั้งฉันยินดีที่จะให้สถานที่ให้บริการเกี่ยวกับที่นี่มากขึ้นเหมาะสำหรับเรื่องที่ ...
บารเนีย Yoav

2
รักและทำงานอย่างสมบูรณ์ขอบคุณ สำหรับวิธีการแก้ปัญหาของฉันฉันเพียงหลังจากง่าย
Bojangles

40
window.orientationเป็นคุณสมบัติที่เลิกใช้งานแล้ว ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ) ซึ่งเบราว์เซอร์มือถือบางตัวเลือกที่จะสนับสนุนด้วยเหตุผลที่ไม่ทราบสาเหตุ . เบราว์เซอร์เดียวกันใช้window.screen.orientation(ซึ่งกำหนดไว้ในเบราว์เซอร์เดสก์ทอปเกินไป) ฉันสามารถสันนิษฐานได้ว่าสิ่งนั้นwindow.orientationอยู่ที่นั่นด้วยเหตุผลดั้งเดิมเท่านั้นดังนั้นจึงไม่ควรใช้ในแอปพลิเคชันใหม่
Gajus

115
var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

วิธีใช้

if( isMobile.any() ) alert('Mobile');

วิธีตรวจสอบว่าผู้ใช้อยู่ในอุปกรณ์พกพาที่ระบุหรือไม่:

if( isMobile.iOS() ) alert('iOS');

Ref: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

รุ่นที่ปรับปรุงแล้วบน github: https://github.com/smali-kazmi/detect-mobile-browser


ทำไมไม่ทำany()เพื่อ ... ในลูปของisMobileสมาชิกORed ?
SomeShinyObject

@ChristopherW ฉันได้สร้างปลั๊กอินและแก้ไขโค้ดที่คุณให้คำแนะนำ
Mudaser อาลี

2
อาจย้าย iOS ไปข้างหน้าของ BlackBerry () เพียงแค่ใส่เคสที่พบบ่อยขึ้นก่อน
Rob_vH

2
@Rob_vH ฉันได้ใส่รหัสนี้ใน github ( github.com/smali-kazmi/detect-mobile-browser ) ด้วยคุณสมบัติขั้นสูงบางอย่าง; คุณเปิดให้ส่งคำแนะนำได้เช่นกัน
Mudaser Ali

1
@AkarshSatija ประสิทธิภาพที่ลดลงจากการตรวจสอบ regex ทั้ง 5 รายการนั้นส่งผลกระทบต่อแอปพลิเคชันของคุณหรือไม่? ฉันจะแปลกใจมากถ้ามันทำ การเพิ่มประสิทธิภาพก่อนวัยอันควรอาจเป็นการเสียเวลา ...
trusktr

68

นี่เป็นวิธีง่ายๆจากแหล่งที่มาของslingshot ของ Facebook

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}

ดี มีประโยชน์มากในบางสถานการณ์
Chuck Le Butt

มีประโยชน์สำหรับกรณีของการตรวจจับอุปกรณ์ที่สามารถติดตั้งแอพมือถือ คุณไม่สนใจเกี่ยวกับเบราว์เซอร์ เพียงแค่อุปกรณ์ / ระบบปฏิบัติการ
Charlie Reitzel

30

มาที่นี่เพื่อหาวิธีที่ง่ายและสะอาดในการตรวจหา "อุปกรณ์หน้าจอสัมผัส" ซึ่งฉันจัดว่าเป็นอุปกรณ์พกพาและแท็บเล็ต ไม่พบตัวเลือกที่ดีในคำตอบปัจจุบัน แต่ได้ผลดังนี้ซึ่งอาจช่วยใครซักคน

var touchDevice = ('ontouchstart' in document.documentElement);

แก้ไข : เพื่อสนับสนุนเดสก์ท็อปที่มีหน้าจอสัมผัสและโทรศัพท์มือถือในเวลาเดียวกันคุณสามารถใช้สิ่งต่อไปนี้:

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);

9
จะเกิดอะไรขึ้นถ้าจอภาพเดสก์ท็อปรองรับการสัมผัส
Anton Kuzmin

@ HappyCoder ฉันเชื่อว่ามันขึ้นอยู่กับระบบปฏิบัติการที่จะบอกเบราว์เซอร์เมื่อหน้าจอสัมผัสบนเดสก์ท็อปเปิดใช้งาน ดังนั้นใช่การตรวจสอบนี้ควรจะยังคงถูกต้อง
Tigger

(+1) touchstart|end|etcอย่างไรก็ตามเดสก์ทอปของฉันฉันใช้ตอนนี้มีหน้าจอสัมผัสและมันไม่สอดคล้องเสมอ
โคดี้

1
Bootstrap datepicker ใช้สิ่งต่อไปนี้: if (window.navigator.msMaxTouchPoints || 'ontouchstart' ในเอกสาร) {this.input.blur (); }
JT Taylor

1
@JTTaylor ดูเหมือนว่า Microsoft กำลังแนะนำ navigator.maxTouchPoints (ไม่มีmsคำนำหน้า) นอกจากนี้ยังมีบทความ MDNเพื่อตรวจสอบ
Tigger

20

ตามที่หลายคนกล่าวไว้การพึ่งพาเป้าหมายการย้ายข้อมูลตัวแทนผู้ใช้เป็นปัญหา สามารถพูดเช่นเดียวกันเพื่อนับขนาดหน้าจอ

วิธีการของฉันยืมมาจากเทคนิค CSSเพื่อตรวจสอบว่าส่วนต่อประสานนั้นสัมผัสหรือไม่:

โดยใช้เพียงจาวาสคริปต์ (สนับสนุนโดยเบราว์เซอร์ที่ทันสมัย) ซึ่งเป็นสื่อแบบสอบถามการแข่งขันได้อย่างง่ายดายสามารถอนุมานได้ว่าอุปกรณ์ที่มีโทรศัพท์มือถือ

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}

6
แลปท็อปที่ใช้ระบบสัมผัสเปิดหน้าจอได้
Maxim

6
ฉันจะตรวจสอบ! matchMedia ("(any-pointer: fine)"). จับคู่ตัวเอง ("ไม่มีการเสียบเมาส์" แทนที่จะเป็น "มีหน้าจอสัมผัส"
Sora2455

การทำงานนี้ในขณะที่สคริปต์สุดท้ายของฉันจะถูกหลอกโดยผู้ใช้คุณลักษณะการซูมของเบราว์เซอร์ (เช่นผู้ชายที่ฉันคุยด้วยบนหน้าจอ 13 "กับ 4K ที่ลดลงถึง 1080p และยังต้องใช้การซูม) ทำงานบน iPhone ของฉัน (Safari / Firefox) และ Android (Waterfox / Chrome / "เบราว์เซอร์") แน่นอน. มากเชื่อถือได้มากขึ้นกว่าทุกที่สูงขึ้นได้รับการโหวตคำตอบ.
จอห์น

ตรวจไม่พบ FireFox fennec บน Android ที่ฉันเสริมด้วย navigator.userAgent.toLowerCase (). indexOf ('fennec')> -1 (อาจไม่ใช่อาหารเสริมที่ดีที่สุด .. )
StayCool

2
นอกจากนี้คุณสามารถทดสอบคุณสมบัติโฮเวอร์: สำหรับสมาร์ทโฟนและ touchscreens @media (โฮเวอร์: ไม่มี) และ (ตัวชี้: หยาบ)
Batailley

16

จากบทความของ MDN เรื่องการตรวจจับเบราว์เซอร์โดยใช้ตัวแทนผู้ใช้เราขอแนะนำให้หลีกเลี่ยงวิธีการนี้หากเป็นไปได้และแนะนำช่องทางอื่น ๆ เช่นการตรวจจับคุณสมบัติ

อย่างไรก็ตามหากต้องใช้ตัวแทนผู้ใช้เป็นวิธีการตรวจสอบว่าอุปกรณ์เป็นมือถือพวกเขาแนะนำ:

โดยสรุปเราขอแนะนำให้ค้นหาสตริง“ Mobi” ที่ใดก็ได้ในตัวแทนผู้ใช้เพื่อตรวจหาอุปกรณ์มือถือ

ดังนั้นหนึ่งซับนี้จะพอเพียง:

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

[อัปเดต]:

ตามที่ @ zenw0lf แนะนำในความคิดเห็นการใช้นิพจน์ปกติน่าจะดีกว่า:

const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)


.includesไม่สนับสนุนโดย IE-11
Pasha Oleynik

1
@PashaOleynik polyfill สามารถแก้ไขได้
Maxim

แท็บเล็ต Nexus 7 ที่ใช้ Android ไม่มีMobileในสตริงตัวแทนผู้ใช้
Alex Sorokoletov

@AlexSorokoletov นอกจากนี้สำหรับบทความ MDNIf the device is large enough that it's not marked with “Mobi”, you should serve your desktop site (which, as a best practice, should support touch input anyway, as more desktop machines are appearing with touchscreens).
TheDarkIn1978

1
ฉันคิดว่านี่จะทำงานได้ทุกที่โดยไม่มี polyfills: const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

ไม่มีโซลูชันที่สมบูรณ์แบบสำหรับการตรวจสอบว่ามีการเรียกใช้รหัส JS บนเบราว์เซอร์มือถือหรือไม่ แต่ตัวเลือกสองตัวต่อไปนี้ควรใช้งานได้ในกรณีส่วนใหญ่

ตัวเลือกที่ 1: การดมเบราว์เซอร์

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');

เบราว์เซอร์นี้โดยเฉพาะรหัสการดมกลิ่นเป็นที่ของห้องสมุดที่เรียกว่า isMobile


ตัวเลือก 2: window.orientation

ทดสอบว่าwindow.orientationมีการกำหนด:

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');


บันทึก

ไม่ใช่อุปกรณ์หน้าจอสัมผัสทั้งหมดที่เป็นอุปกรณ์มือถือและในทางกลับกัน ดังนั้นหากคุณต้องการนำบางสิ่งมาใช้กับหน้าจอสัมผัสโดยเฉพาะคุณไม่ควรทดสอบว่าเบราว์เซอร์ของคุณทำงานบนอุปกรณ์พกพาหรือไม่ แต่อุปกรณ์นั้นรองรับหน้าจอสัมผัสหรือไม่:

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');


วิธีการปฐมนิเทศนั้นดีจริงๆ! ))
Maxim

1
ฉันชอบwindow.orientationโซลูชันของคุณแต่เอกสารบอกว่ามันเลิกใช้แล้ว! developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth

3
วิธีการวางแนวไม่ดีเพราะ Windows 8 ขึ้นไปสามารถเปลี่ยนการวางแนวได้
Heitor

Windows 8 และรุ่นใหม่กว่านั้นมุ่งเน้นที่การเพิ่มการรองรับโทรศัพท์มือถือ แต่ยังไฮบริด (แล็ปท็อปที่สามารถแปลงเป็นแผ่นใหญ่) ซึ่งเป็นสาเหตุที่การวางแนวล้มเหลวเป็นวิธีการตรวจจับแม้ว่า moz ไม่ได้อ้างถึงว่าเลิกใช้แล้ว
Jeff Clayton

มาจาก Win 7 ที่ติดตั้งซอฟต์แวร์แบบกราฟิกสามารถเปลี่ยนการวางแนวได้ แต่ถามคำถามกับตัวคุณเองว่าใครบนเดสก์ท็อป / แล็ปท็อปสามารถใช้การวางแนวหน้าจออื่นเช่นแนวตั้งแทนแนวนอนและใช้ i เป็นเวลานานกว่า 1 นาที ไม่มีใคร !!! การเปลี่ยนการวางแนวบนเดสก์ท็อปหมายความว่าคุณจะเริ่มอ่านตัวอักษรบนหน้าจอจากล่างขึ้นบน
GirlCode

11

นี่คือโซลูชัน userAgent ที่มีประสิทธิภาพมากกว่าการจับคู่ ...

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}

7
วิธีการทดสอบไม่คำนึงถึงขนาดตัวพิมพ์ แต่ regex ของคุณคือ คุณสามารถตั้งค่าสถานะสำหรับกรณีที่ไม่รู้สึกตัว regex ด้วย "i" ในตอนท้ายและทำ/iphone|etc/i.test(navigator.userAgent)
xec

11

ในการเพิ่มชั้นควบคุมพิเศษฉันใช้ที่เก็บข้อมูล HTML5 เพื่อตรวจสอบว่าใช้หน่วยเก็บข้อมูลมือถือหรือพื้นที่เก็บข้อมูลเดสก์ท็อปหรือไม่ หากเบราว์เซอร์ไม่รองรับที่เก็บข้อมูลฉันมีอาร์เรย์ชื่อเบราว์เซอร์มือถือและฉันเปรียบเทียบตัวแทนผู้ใช้กับเบราว์เซอร์ในอาร์เรย์

มันค่อนข้างง่าย นี่คือฟังก์ชั่น:

// Used to detect whether the users browser is an mobile browser
function isMobile() {
    ///<summary>Detecting whether the browser is a mobile browser or desktop browser</summary>
    ///<returns>A boolean value indicating whether the browser is a mobile browser or not</returns>

    if (sessionStorage.desktop) // desktop storage 
        return false;
    else if (localStorage.mobile) // mobile storage
        return true;

    // alternative
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}

3
ฉันยังไม่ได้ทดสอบบนอุปกรณ์พกพา แต่ยังsessionStorage.desktopไม่มีใน Safari, Chrome หรือ Firefox (เวอร์ชันใหม่ล่าสุดทั้งหมด ณ เวลาที่ทำการโพสต์) คุณจะได้คะแนนมากขึ้นเนื่องจากวิธีการแก้ปัญหาของคุณไปในทิศทางที่ดีกว่าคนอื่น ๆ แต่ไม่ลืมที่จะใช้แทนvar mobile = mobile =
shuckster

3
นอกจากนี้ยังเป็นความคิดที่ดีที่จะไม่ใช้ indexOf กับเบราว์เซอร์รุ่นเก่าที่ยังอยู่ซึ่งไม่สนับสนุนวิธีการนี้หรือใช้โพลีฟิล ไม่จำเป็นต้องใช้ toLowerCase ในรายการค่าตัวพิมพ์เล็กและไม่จำเป็นต้องทำเช่นนั้นหากคุณใช้งาน
Jeffrey Gilbert

10

การตรวจจับคุณสมบัตินั้นดีกว่าการลองคิดดูว่าคุณใช้อุปกรณ์ใดอยู่และยากที่จะติดตามอุปกรณ์ใหม่ที่ออกมาตลอดเวลาห้องสมุดอย่างModernizr จะช่วยให้คุณรู้ว่าคุณลักษณะเฉพาะนั้นมีอยู่หรือไม่


18
คุณได้ตอบคำถามอื่นนอกเหนือจากที่ถาม แทนที่จะเป็น "ฉันจะตรวจจับมือถือได้อย่างไร" คุณตอบว่า "ฉันจะตรวจจับคุณสมบัติบางอย่างได้อย่างไร" ไม่ใช่การตรวจจับอุปกรณ์ทั้งหมดที่ใช้สำหรับการตรวจจับคุณสมบัติ ถ้าเราต้องการรับสถิติเกี่ยวกับอุปกรณ์ ถ้าอย่างนั้นไม่ใช่ "การตรวจจับคุณสมบัติ" ไม่ใช่ "ดีกว่า [การหาอุปกรณ์]"
Jonathan Allard

1
นี่ไม่ใช่คำตอบ แต่มันสมควรได้รับมากกว่าความคิดเห็น คำถามคือ: ทำไมคุณต้องการตรวจสอบเบราว์เซอร์แล้วคุณอาจจะต้องการที่จะรู้ว่ามันเพราะการสัมผัส (ขาด) เท่านั้น การออกแบบเว็บที่ตอบสนองได้พอเพียงในกรณีส่วนใหญ่
ครั้งใน

8

แล้วเรื่องแบบนี้ล่ะ?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}

ทำไมไม่ใช้เพียงscreen.widthแทน window.matchMediaมันดูเหมือนว่าฉันที่มีความน่าเชื่อถือมากกว่า
John Slegers

จุดดีจอห์นฉันจำไม่ได้ว่าสิ่งที่ฉันคิดในเวลานั้นดูเหมือนว่าไม่น่า (ดูตอนนี้) ว่าประโยคที่สองจะกลับมาจริงถ้าแรกเป็นเท็จ ต้องมีเหตุผลบางอย่างที่ฉันเพิ่มเข้าไป
stujo

โปรแกรมเมอร์ที่ดีที่สุดรู้สึกละอายใจเมื่อเห็นโค้ดที่เขียนด้วยตัวเองเมื่อปีก่อน ผู้ที่ไม่เพียง แต่ยังไม่ได้เติบโตขึ้นในฐานะโปรแกรมเมอร์ ;-)
John Slegers

4
ความละเอียดหน้าต่างไม่เกี่ยวกับว่าเบราว์เซอร์อยู่บนอุปกรณ์มือถือหรือไม่ ตัวอย่างเช่นเบราว์เซอร์เดสก์ท็อปจำนวนมากทำงานในหน้าต่างที่ไม่ใช่แบบเต็มหน้าจอ หากคุณนำเสนอ UI ที่ออกแบบมาสำหรับหน้าจอมือถือให้กับเบราว์เซอร์เหล่านั้นผู้ใช้จะมีประสบการณ์ที่น่าผิดหวัง
ʇsәɹoɈ

1
@JohnSlegers - ฉันละอายใจเป็นส่วนใหญ่กับ Googling คำถามและค้นหาคำตอบของฉันเองใน stackoverflow ครั้งแล้วครั้งเล่า. ฉันอยู่ในกองซ้อนอย่างต่อเนื่อง
vsync

7

เมื่อองค์ประกอบได้รับการโฟกัสคุณจะเบลอทันที Bootstrap-datepicker ซึ่งเป็นองค์ประกอบที่ได้รับความนิยมและได้รับการดูแลเป็นอย่างดีด้วยเกือบ 10,000 ดาวใน GitHub ใช้วิธีการนี้:

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}

https://github.com/uxsolutions/bootstrap-datepicker

ขอบคุณTiggerสำหรับความช่วยเหลือ


7

วิธีที่ดีในการตรวจจับอุปกรณ์มือถือหรือแท็บเล็ตคือการดูว่าเบราว์เซอร์สามารถสร้างกิจกรรมการสัมผัสได้หรือไม่

รหัส JavaScript ธรรมดา:

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

if (isMobile()) {
   # do whatever you wanna do!
}

มันใช้งานได้ดีสำหรับฉันจริงๆ แต่อาจมีปัญหากับอุปกรณ์แล็ปท็อปซึ่งรวมถึงหน้าจอสัมผัส

ฉันไม่แน่ใจว่าแล็ปท็อปหน้าจอสัมผัสจะถูกตรวจพบว่าเป็นอุปกรณ์มือถือหรือไม่เพราะฉันยังไม่ได้ทดสอบ


5
แล็ปท็อปหน้าจอสัมผัสจะถูกตรวจจับเป็นอุปกรณ์มือถือ รวมถึงหน้าจอสัมผัสสำหรับเดสก์ท็อป เชื่อหรือไม่ว่าคุณจะพบปัญหาหากคุณใช้อุปกรณ์หน้าจอสัมผัสเพื่อ RDP ในอุปกรณ์อื่นที่ไม่มีหน้าจอสัมผัส
blissfool

@blissfool ฉันเดาว่านี่จะไม่ใช่วิธีที่ถูกต้องในการตรวจจับอุปกรณ์มือถือ
Neo Morina

น่าเสียดายที่ไม่มี แต่อาจเป็นตัวเลือกที่ใช้งานได้สำหรับกรณีการใช้งานที่ จำกัด มาก
blissfool

ไม่เคยเขียนโค้ดที่อยู่บนพื้นฐานของข้อยกเว้นว่าจะ throwen เพื่อตรวจสอบว่าในกรณีใด ๆ ...
ปาโบล

@Sivic จะถูกโยนทิ้งเมื่อไม่มี TouchEvent อยู่และโค้ดด้านบนจับได้และส่งคืนค่าเท็จ นี่ไม่ใช่กรณีบนมือถือหรือแท็บเล็ตหรืออุปกรณ์หน้าจอสัมผัสอื่น ๆ
Neo Morina

5

นี่คือวิธีคิดใหม่ของฉันสำหรับปัญหา ยังไม่สมบูรณ์ ทางออกที่แท้จริงเพียงอย่างเดียวคือหากผู้ผลิตอุปกรณ์เริ่มจริงจังกับสตริงตัวแทนผู้ใช้ "มือถือ" และ "แท็บเล็ต"

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}

จะเกิดอะไรขึ้นเมื่อแท็บเล็ต Nexus 7 มีสตริง Android UA เท่านั้น ครั้งแรกมือถือกลายเป็นจริงมากกว่าบนแท็บเล็ตก็กลายเป็นจริง แต่แท็บเล็ตจะลบสตริง Mobile UA ออกจากแท็กเนื้อหา

CSS:

body.tablet { background-color: green; }
body.mobile { background-color: red; }

alertสายที่เพิ่มเข้ามาเพื่อการพัฒนา คอนโซล Chrome สามารถจำลองอุปกรณ์มือถือจำนวนมากได้ ทดสอบที่นั่น

แก้ไข:

อย่าใช้สิ่งนี้ใช้การตรวจจับคุณสมบัติแทน มีอุปกรณ์และแบรนด์มากมายที่ตั้งเป้าหมายว่าแบรนด์จะไม่เป็นทางออกที่เหมาะสม


4

ฉันแนะนำให้คุณตรวจสอบhttp://wurfl.io/

สรุปถ้าคุณนำเข้าไฟล์ JS เล็ก ๆ :

<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>

คุณจะเหลือวัตถุ JSON ที่มีลักษณะดังนี้:

{
 "complete_device_name":"Google Nexus 7",
 "is_mobile":true,
 "form_factor":"Tablet"
}

(สมมติว่าคุณใช้ Nexus 7 แน่นอน) และคุณจะสามารถทำสิ่งต่าง ๆ เช่น:

if(WURFL.form_factor == "Tablet"){
    //dostuff();
}

นี่คือสิ่งที่คุณกำลังมองหา

คำเตือน: ฉันทำงานให้ บริษัท ที่ให้บริการฟรีนี้ ขอบคุณ


1
และ howcome นี้ไม่รู้จักซาฟารีบน iPhone?
Amyth

คุณสามารถขยายเบราว์เซอร์ที่คุณใช้ (สตริง UA ที่แน่นอนจะสมบูรณ์แบบ) ข้อมูลที่คุณได้รับและสิ่งที่คุณคาดหวัง
Luca Passani

ฉันก็ลอง wurfl ฉันอยู่บน iPhone 5C ที่ใช้ IOS 11.2 มันไม่รู้จัก Safari เป็นเบราว์เซอร์มือถือ ฉันคาดหวังว่าจะใช้ "is_mobile": จริงแล้ว "form_factor": สมาร์ทโฟนและไม่กลับมาเหมือนกัน
Mike Wells

ฉันต้องหันไปหาผู้เชี่ยวชาญด้านข้อมูลมือถือใน บริษัท และพวกเขาบอกฉันว่าระบบปฏิบัติการ 11.2 ไม่ทำงานบน 5C อุปกรณ์ต่ำสุดคือ 5S ดังนั้นสิ่งที่ไม่ถูกต้องในสิ่งที่คุณเขียน รู้สึกอิสระที่จะติดต่อ ScientiaMobile ออฟไลน์เพื่อตรวจสอบว่าการเชื่อมต่ออาจจะอยู่ที่ไหน ขอบคุณ
Luca Passani


3

ขึ้นอยู่กับกรณีการใช้งาน อุปกรณ์พกพาทั้งหมดต้องใช้แบตเตอรี่ หากสิ่งที่คุณกำลังคำนวณพลังงานโดยไม่ต้องใช้แบตเตอรี่ใช้สถานะแบตเตอรี่ API :

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});

หากสิ่งที่คุณกำลังมองหาคือการใช้งานในmatchMediaปัจจุบันซึ่งจะส่งคืนค่าบูลีน:

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

หรือรวมเข้าด้วยกันเพื่อประสบการณ์การใช้งานที่ดียิ่งขึ้นบนอุปกรณ์แท็บเล็ต


โปรดทราบว่า API สถานะแบตเตอรี่กำลังถูกลบออกจากเบราว์เซอร์
Sora2455

Battery Status API ถูกลบออกจาก Firefox แต่ยังคงเป็นคำแนะนำผู้สมัคร W3C ตั้งแต่เดือนกรกฎาคม 2559ยังคงทำงานในเบราว์เซอร์ยอดนิยมและมีประโยชน์ในการสร้างประสบการณ์
Josh Habdas

2

นี่คือโซลูชัน ECMAScript 6 (พร้อม TypeScript)

public isMobile(): boolean {
  let check = false;
  ((a => {
      if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
      }))(navigator.userAgent || navigator.vendor);
  return check;
 }

ทำไมไม่ส่งคืนifเงื่อนไขแทนการใช้checkตัวแปรทั้งหมดนี้
Vic

2

มีเคล็ดลับง่ายๆในการตรวจสอบว่าเป็นอุปกรณ์มือถือหรือไม่ เพียงตรวจสอบว่ามีเหตุการณ์ontouchstartอยู่:

function isMobile()
{
    return "ontouchstart" in window;
}

3
จะไม่ทำงานกับแล็ปท็อปและ dekstops ด้วยหน้าจอสัมผัส นอกจากนี้ยังจะมีปัญหากับพีซีแบบไฮบริดเช่น Surface มีปัญหาน้อยลงเกี่ยวกับเดสก์ท็อป แต่วันนี้มีแล็ปท็อปหน้าจอสัมผัสจำนวนมากวางจำหน่าย
blissfool

2

ฉันได้เผชิญกับสถานการณ์บางอย่างที่คำตอบข้างต้นทำงานให้ฉัน ดังนั้นฉันมากับสิ่งนี้ อาจเป็นประโยชน์กับใครบางคน

if(/iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent)
 || screen.availWidth < 480){
//code for mobile
}

มันขึ้นอยู่กับกรณีการใช้งานของคุณ หากคุณมุ่งเน้นที่การใช้หน้าจอscreen.availWidthหรือคุณสามารถใช้document.body.clientWidthหากคุณต้องการแสดงผลตามเอกสาร


1

สิ่งที่ดีที่สุดจะต้อง:

var isMobile = (/Mobile/i.test(navigator.userAgent));

แต่เหมือนที่ Yoav Barnea พูดว่า ...

// Seem legit
var isMobile = ('DeviceOrientationEvent' in window || 'orientation' in window);
// But with my Chrome on windows, DeviceOrientationEvent == fct()
if (/Windows NT|Macintosh|Mac OS X|Linux/i.test(navigator.userAgent)) isMobile = false;
// My android have "linux" too
if (/Mobile/i.test(navigator.userAgent)) isMobile = true;

หลังจากการทดสอบ 3 ครั้งนี้ฉันหวังว่า var isMobile คือ ... ตกลง


> Firefox มือถือบน Android ดูเหมือนจะไม่มี "'การวางแนว' ในหน้าต่าง"
molokoloco

1
ขอโทษ .. โอเคสำหรับฉันมันใช้ได้ดีเหมือนตอนนี้ "if (Modernizr.touch) / * ... * /" และไป ...
molokoloco

เพียงแค่สงสัยว่า Modernizr.touch จะทำงานอย่างไรเมื่ออยู่บนอุปกรณ์เดสก์ท็อปหน้าจอสัมผัส
B2K

เพื่อให้มันดูสง่างามยิ่งขึ้นคุณควรสร้างรหัส te ทั้งหมดในหนึ่ง if-else if-else ถ้า block
Heitor

1

ที่นี่เขามีฟังก์ชั่นเต็มรูปแบบ

function isMobile(){
    return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(navigator.userAgent||navigator.vendor||window.opera)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test((navigator.userAgent||navigator.vendor||window.opera).substr(0,4)))
}

jQuery.noConflict();
jQuery(document).ready(function(){
    if(isMobile()) alert("Mobile"); else alert("Not Mobile");
});

.substr (0,4) ส่งคืน 4 ตัวอักษรแรก มันตรวจจับ "android. + mobile" ได้อย่างไร?
แข่ง

1
@raacer มีจริงสอง regexes ในคำตอบ (ทั้งในบรรทัดเดียวกัน) - คนแรกตรวจสอบกับสตริง UA ทั้งหมดและมองหา android มือถือ ฯลฯ ในขณะที่คนที่สองเท่านั้นที่ตรวจสอบกับตัวละคร 4 ตัวแรกของ UA .
JackW

1
//true / false
function isMobile()
{
   return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ); 
}

นอกจากนี้คุณสามารถทำตามบทช่วยสอนนี้เพื่อตรวจจับมือถือที่เฉพาะเจาะจง คลิกที่นี่


โปรดเพิ่มMobileRX ของคุณ
oriadam

1

สิ่งที่เกี่ยวกับการใช้ "window.screen.width"?

if (window.screen.width < 800) {
// do something
}

หรือ

if($(window).width() < 800) {
//do something
}

ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดเพราะมีอุปกรณ์มือถือใหม่ทุกวัน!

(แม้ว่าฉันคิดว่ามันไม่รองรับเบราว์เซอร์รุ่นเก่า แต่ให้ลองทำ :))


1
ภูมิทัศน์เป็นอย่างไร?
Erick Voodoo

1
สิ่งนี้ไม่มีประโยชน์มากสำหรับบางสถานการณ์ หากเบราว์เซอร์สก์ท็อปมีการปรับขนาดมันอาจจะตรวจพบไม่ถูกต้องเป็นเบราว์เซอร์มือถือ
toing_toing

พีซีแตกต่างจากอุปกรณ์พกพาที่ใช้งานได้จริงคำตอบที่น่ากลัว !!
Heitor

1

โปรดทราบว่าขณะนี้อุปกรณ์มือถือรุ่นใหม่ส่วนใหญ่มีความละเอียดมากกว่า 600x400 เช่น iPhone 6 ....

หลักฐานการทดสอบ: เรียกใช้การโพสต์ล่าสุดและโพสต์ล่าสุดที่นี่พร้อมการตรวจสอบเพิ่มเติมเมื่อทำงานเช่นนั้น:

(function(a){
    window.isMobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
})(navigator.userAgent||navigator.vendor||window.opera);

alert("This browser was found to be a % browser.", window.isMobile ? 'mobile' : 'desktop');

อย่างไรก็ตามผลลัพธ์ต่อไปนี้จะถูกส่งคืนในเบราว์เซอร์แอปต่อไปนี้ รายละเอียด: iPhone 6S, iOS 10.3.1

Safari (ล่าสุด): ตรวจพบว่าเป็นมือถือ

Chrome (ล่าสุด): ตรวจไม่พบว่าเป็นมือถือ

ดังนั้นฉันจึงทดสอบข้อเสนอแนะจากLanti ( https://stackoverflow.com/a/31864119/7183483 ) และได้ผลลัพธ์ที่เหมาะสม (มือถือสำหรับอุปกรณ์ iOS ทั้งหมดและเดสก์ท็อปสำหรับ Mac ของฉัน) ดังนั้นฉันจึงดำเนินการแก้ไขเล็กน้อยเนื่องจากจะเริ่มทำงานสองครั้ง (สำหรับทั้งมือถือและแท็บเล็ต) จากนั้นฉันก็สังเกตเห็นเมื่อทำการทดสอบบน iPad ว่ามันกลับมาเป็นมือถือซึ่งสมเหตุสมผลเนื่องจากพารามิเตอร์ที่Lantiใช้การตรวจสอบระบบปฏิบัติการมากกว่าสิ่งใด ดังนั้นฉันเพิ่งย้ายแท็บเล็ตคำสั่ง IF ในการตรวจสอบมือถือซึ่งจะคืนมือถือคือการตรวจสอบแท็บเล็ตเป็นเชิงลบและแท็บเล็ตเป็นอย่างอื่น ฉันเพิ่มส่วนคำสั่งอื่นสำหรับการตรวจสอบมือถือเพื่อส่งคืนเป็นเดสก์ท็อป / แล็ปท็อปเนื่องจากทั้งคู่มีคุณสมบัติ แต่สังเกตว่าเบราว์เซอร์ตรวจพบแบรนด์ CPU และ OS ดังนั้นฉันจึงเพิ่มสิ่งที่ส่งคืนในนั้นเป็นส่วนหนึ่งของคำสั่งอื่นแทน เพื่อเพิ่มมันฉันเพิ่มคำเตือนอย่างอื่นในกรณีที่ตรวจไม่พบสิ่งใด ดูตะโกนจะอัปเดตพร้อมทดสอบบนพีซี Windows 10 เร็ว ๆ นี้

โอ้และฉันยังเพิ่มตัวแปร 'debugMode' เพื่อสลับระหว่างการดีบักและการคอมไพล์ปกติได้อย่างง่ายดาย

การปฏิเสธความรับผิดชอบ: เครดิตเต็มรูปแบบถึงLantiและนี่ไม่ใช่การทดสอบบนแท็บเล็ต Windows ... ซึ่งอาจส่งคืนเดสก์ท็อป / แล็ปท็อปเนื่องจากระบบปฏิบัติการเป็น Windows บริสุทธิ์ จะตรวจสอบเมื่อฉันพบเพื่อนที่ใช้งานอยู่

function userAgentDetect() {
    let debugMode = true;
    if(window.navigator.userAgent.match(/Mobile/i)
        || window.navigator.userAgent.match(/iPhone/i)
        || window.navigator.userAgent.match(/iPod/i)
        || window.navigator.userAgent.match(/IEMobile/i)
        || window.navigator.userAgent.match(/Windows Phone/i)
        || window.navigator.userAgent.match(/Android/i)
        || window.navigator.userAgent.match(/BlackBerry/i)
        || window.navigator.userAgent.match(/webOS/i)) {
        if (window.navigator.userAgent.match(/Tablet/i)
            || window.navigator.userAgent.match(/iPad/i)
            || window.navigator.userAgent.match(/Nexus 7/i)
            || window.navigator.userAgent.match(/Nexus 10/i)
            || window.navigator.userAgent.match(/KFAPWI/i)) {
            window.deviceTypeVar = 'tablet';
            if (debugMode === true) {
                alert('Device is a tablet - ' + navigator.userAgent);
            }
        } else {
            if (debugMode === true) {
                alert('Device is a smartphone - ' + navigator.userAgent);
            };
            window.deviceTypeVar = 'smartphone';
        }
    } else if (window.navigator.userAgent.match(/Intel Mac/i)) {
        if (debugMode === true) {
            alert('Device is a desktop or laptop- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'desktop_or_laptop';
    } else if (window.navigator.userAgent.match(/Nexus 7/i)
        || window.navigator.userAgent.match(/Nexus 10/i)
        || window.navigator.userAgent.match(/KFAPWI/i)) {
        window.deviceTypeVar = 'tablet';
        if (debugMode === true) {
            alert('Device is a tablet - ' + navigator.userAgent);
        }
    } else {
        if (debugMode === true) {
            alert('Device is unknown- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'Unknown';
    }
}

1

นี่เป็นเพียงพอร์ต es6 ของคำตอบที่ยอมรับว่าฉันใช้ในโครงการของฉัน โปรดทราบว่านี่รวมถึงแท็บเล็ต

export const isMobile = () => {
  const vendor = navigator.userAgent || navigator.vendor || window.opera;

  return !!(
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
      vendor
    ) ||
    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(
      vendor.substr(0, 4)
    )
  );
};


1

ใช้ Regex (จากdetectmobilebrowsers.com ):

/* eslint-disable */
export const IS_MOBILE = (function (a) {
  return (
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
      .test(
        a.substr(0,4)
      )
  )
  // @ts-ignore
})(navigator.userAgent || navigator.vendor || window.opera)
/* eslint-enable */

0

นี่อาจเป็นวิธีแก้ปัญหา

var isMobile = false; //initiate as false

  // device detection
  if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
  || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;

  console.log('Mobile device:'+isMobile);

  var doc_h = $(document).height(); // returns height of HTML document
  var doc_w = $(document).width(); // returns width of HTML document
  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  var iPadVertical = window.matchMedia("(width: 768px) and (height: 1024px) and (orientation: portrait)");
  var iPadHoricontal = window.matchMedia("(width: 1024px) and (height: 767px) and (orientation: landscape)");

  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  if (iPadVertical.matches) {
      console.log('Ipad vertical detected');
  }else if (iPadHoricontal.matches){
      console.log('Ipad horicontal detected');
  }else {
      console.log('No Ipad');
  }

หากคุณใช้ทั้งสองวิธีคุณจะได้รับวิธีที่สมบูรณ์แบบในการตรวจจับอุปกรณ์ต่าง ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.