Phát hiện trình duyệt di động


889

Tôi đang tìm kiếm một hàm trả về giá trị boolean nếu người dùng có trình duyệt di động hay không.

Tôi biết rằng tôi có thể sử dụng navigator.userAgentvà viết chức năng đó bằng cách sử dụng regex, nhưng tác nhân người dùng quá đa dạng cho các nền tảng khác nhau. Tôi nghi ngờ rằng việc kết hợp tất cả các thiết bị có thể sẽ dễ dàng và tôi nghĩ rằng vấn đề này đã được giải quyết trước đó nhiều lần nên cần có một giải pháp hoàn chỉnh cho nhiệm vụ đó.

Tôi đã xem trang web này , nhưng thật đáng buồn là kịch bản khó hiểu đến mức tôi không biết làm thế nào để sử dụng nó cho mục đích của mình, đó là tạo ra một hàm trả về true / false.



2
Hãy thử đọc nó. stackoverflow.com/questions/743129/
Mạnh

5
@Thrustmaster: Nó thực sự sẽ không. Việc cung cấp JS khác nhau cho các trình duyệt khác nhau có nghĩa là bạn phải thêm Vary: User-Agentvào phản hồi của mình, nếu không các proxy lưu trữ sẽ lưu trữ một phiên bản và gửi nó đến loại trình duyệt khác. Nhưng Vary: User-Agentlàm cho phản ứng không thể truy cập trong IE.
bobince

17
@ave: Bạn đang cố gắng làm gì bằng cách phát hiện trình duyệt "di động"? Sự khác biệt rất đáng tranh cãi trong thế giới máy tính bảng và thiết bị máy tính lai ngày nay. Bạn đang tìm cách phát hiện các màn hình nhỏ và trình bày một UI khác trong trường hợp đó? Bạn đang tìm kiếm để phát hiện kết nối băng thông thấp? Bạn đang tìm kiếm để phát hiện giao diện cảm ứng?
bobince

2
Vì vậy, tôi đã cập nhật câu trả lời của mình để sử dụng phương pháp javascript của Detmobilebrowsers.com nhưng trả về giá trị boolean nếu bất cứ ai vẫn cần điều này. (chỉ trong trường hợp). Chúc mừng phát hiện :)
Michael Zaporozhets

Câu trả lời:


1318

Sử dụng Regex (từ Detmobilebrowsers.com ):

Đây là một chức năng sử dụng một regex cực kỳ dài và toàn diện, trả về một truehoặc falsegiá trị tùy thuộc vào việc người dùng có duyệt qua điện thoại di động hay không.

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

Đối với những người muốn bao gồm máy tính bảng trong thử nghiệm này (mặc dù có thể cho rằng bạn không nên), bạn có thể sử dụng chức năng sau:

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

Câu trả lời gốc

Bạn có thể làm điều này bằng cách chỉ cần chạy qua danh sách các thiết bị và kiểm tra xem các thiết bị có useragentkhớp với nhau không:

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

Tuy nhiên, vì bạn tin rằng phương pháp này không đáng tin cậy, bạn có thể cho rằng bất kỳ thiết bị nào có độ phân giải 800x600 trở xuống cũng là một thiết bị di động, thu hẹp mục tiêu của bạn thậm chí nhiều hơn (mặc dù ngày nay nhiều thiết bị di động có độ phân giải lớn hơn nhiều so với điều này)

I E

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

Tài liệu tham khảo:


25
Xin chào, tôi vừa truy cập liên kết Detmobilebrowsers.com trên iPad 3, iOS 6.1.2 và thông báo "Không phát hiện trình duyệt di động".
Richard Lovejoy

49
@RichardLovejoy khi xây dựng trang web, ipad thường không được coi là điện thoại di động.
Michael Zaporozhets

42
Từ trang về : máy tính bảng Android, iPad, Kindle Fire và PlayBooks không được phát hiện theo thiết kế. Để thêm hỗ trợ cho máy tính bảng, hãy thêm |android|ipad|playbook|silkvào regex đầu tiên.
Gras Double

13
Google TV cũng là Android. Điều gì xác định một điện thoại di động? Kích thước màn hình ? Chạm ? Thiết bị? Khi tôi thiết kế, đó có phải là câu hỏi về việc di chuột hay không, bouton lớn hay liên kết nhỏ. Vì vậy, bây giờ, tôi chạy với "if (Modernizr.touch)" :)
molokoloco

31
Gawd, toàn bộ ý tưởng về các tác nhân người dùng này là khủng khiếp và thực sự, thực sự cần phải dừng lại. Chúng tôi thực sự cần phải ngừng cho phép khách hàng chiến đấu chống lại thủy triều và chỉ cần gắn bó với các truy vấn truyền thông. Nếu họ muốn thực hiện chuyển hướng dựa trên quy mô cho các trang cụ thể, thì chỉ cần kiểm tra phạm vi của một truy vấn phương tiện cụ thể thông qua JS tức là tylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

Làm thế nào về:

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

... vì điện thoại thông minh thường hỗ trợ tài sản này và trình duyệt máy tính để bàn không.

EDIT: Như @Gajus đã chỉ ra, giải pháp này hiện không được chấp nhận và không nên sử dụng ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
Điều này thực sự siêu độc đáo và tuyệt vời, bạn có phiền nếu tôi thêm nó vào câu trả lời của mình không?
Michael Zaporozhets

77
Điều này có lẽ sẽ không hoạt động lâu dài. 1) Máy tính bảng có thể có kích thước màn hình khá, bạn muốn chúng hiển thị trang web đầy đủ cho máy tính để bàn nhưng chúng sẽ có thuộc tính này 2) Windows 8 ở đây và cùng với đó là một loạt máy tính xách tay có màn hình cảm ứng và màn hình xoay.
Dave Hilditch

10
đối với điểm đầu tiên của bạn về Máy tính bảng có kích thước màn hình khá - Tôi nghĩ bạn cũng có thể đưa ra những lập luận tương tự cho tất cả các giải pháp khác (một máy tính bảng có màn hình lớn được theo dõi dưới dạng màn hình nhỏ). dù sao, ý tưởng ở đây là tìm kiếm tài sản được chia sẻ bởi các thiết bị nhỏ thay vì duy trì mã dài và thêm regex với mỗi thiết bị / vesion / model mới sắp ra mắt. Tôi nghĩ rằng phát hiện thiết bị thuộc về quá khứ và ngày nay chúng ta cần tập trung vào phát hiện tính năng. một lần nữa tôi sẽ vui mừng ở đây về tài sản phù hợp hơn cho vấn đề đó ...
yoav barnea

2
Yêu nó và làm việc hoàn hảo, thankyou. Đối với giải pháp của tôi, tôi chỉ sau khi đơn giản.
Bojangles

40
window.orientationlà một tài sản không dùng nữa ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ) mà một số trình duyệt di động chọn để hỗ trợ không rõ lý do . Cùng một trình duyệt thực hiện window.screen.orientation(cũng được xác định trong trình duyệt máy tính để bàn). Tôi chỉ có thể giả sử rằng window.orientationcòn lại ở đó vì lý do di sản và do đó không nên được sử dụng trong các ứng dụng mới.
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());
    }
};

Cách sử dụng

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

Để kiểm tra xem người dùng có sử dụng thiết bị di động cụ thể không:

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

Tham chiếu: http://www.abeautitablesite.net/blog/2011/11/detecting-mobile-devices-with-javascript

Phiên bản nâng cao trên github: https://github.com/smali-kazmi/detect-mobile-browser


Tại sao không tạo any()một ... trong vòng lặp của isMobilecác thành viên ORed ?
Một sốShinyObject

@ChristopherW tôi đã tạo plugin và mã sửa đổi như bạn đã khuyên
Mudaser Ali

2
Có thể di chuyển iOS lên trước BlackBerry () chỉ để đặt các trường hợp phổ biến hơn lên trước và để cho gói cứu trợ sớm tiết kiệm một số xử lý bổ sung?
Rob_vH

2
@Rob_vH tôi đã đặt mã này vào github ( github.com/smali-kazmi/detect-mobile-browser ) với một số tính năng nâng cao; bạn cũng sẵn sàng gửi đề xuất ở đó
Mudaser Ali

1
@AkarshSatija Hiệu suất giảm từ 5 kiểm tra regex đó có thực sự ảnh hưởng đến bất kỳ ứng dụng nào của bạn không? Tôi sẽ rất ngạc nhiên nếu nó đã làm. Tối ưu hóa sớm có thể là một sự lãng phí thời gian ...
trusktr

68

Đây là một giải pháp đơn giản từ nguồn súng cao su của facebook

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

Đẹp. Rất hữu ích trong một số tình huống
Chuck Le Mông

Hữu ích cho trường hợp phát hiện thiết bị có thể cài đặt ứng dụng di động. Bạn không quan tâm đến trình duyệt, mọi người ạ. Chỉ cần thiết bị / HĐH.
Charlie Reitzel

31

Đến đây để tìm kiếm một cách đơn giản, gọn gàng để phát hiện "thiết bị màn hình cảm ứng", mà tôi xếp là điện thoại di động và máy tính bảng. Không tìm thấy một lựa chọn rõ ràng trong các câu trả lời hiện tại nhưng đã tìm ra những điều sau đây cũng có thể giúp được ai đó.

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

Chỉnh sửa : Để hỗ trợ máy tính để bàn có màn hình cảm ứng và điện thoại di động cùng lúc, bạn có thể sử dụng các cách sau:

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

9
Điều gì nếu màn hình của máy tính để bàn hỗ trợ cảm ứng?
Anton Kuzmin

@HappyCoder Tôi tin rằng tùy thuộc vào hệ điều hành để báo cho trình duyệt biết khi màn hình cảm ứng trên máy tính để bàn đang hoạt động. Vì vậy, có kiểm tra này vẫn còn hiệu lực.
Kích hoạt

(+1), tuy nhiên, máy tính để bàn của tôi hiện đang sử dụng có màn hình cảm ứng và không phải lúc nào cũng phù hợp touchstart|end|etc.
Cody

1
Bootstrap datepicker sử dụng như sau: if (window.navigator.msMaxTouchPoints || 'ontouchstart' trong tài liệu) {this.input.blur (); }
JT Taylor

1
@JTTaylor Có vẻ như Microsoft đang khuyến nghị navigator.maxTouchPoints (không có mstiền tố). Ngoài ra còn có một bài viết MDN để kiểm tra.
Kích hoạt

20

Như nhiều người đã tuyên bố, việc dựa vào mục tiêu di động của dữ liệu tác nhân người dùng là có vấn đề. Điều tương tự có thể được nói cho việc tính vào kích thước màn hình.

Cách tiếp cận của tôi được mượn từ một kỹ thuật CSS để xác định xem giao diện có chạm không:

Chỉ sử dụng javascript (hỗ trợ bởi tất cả các trình duyệt hiện đại), kết quả truy vấn phương tiện có thể dễ dàng suy ra liệu thiết bị có di động hay không .

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

6
Còn máy tính xách tay có màn hình cảm ứng thì sao?
Tối đa

6
Tôi sẽ kiểm tra! MatchMedia ("(bất kỳ con trỏ: tốt)"). Phù hợp với chính tôi. ("Không cắm chuột", thay vì "có màn hình cảm ứng".
Sora2455

Điều này hoạt động trong khi tập lệnh cuối cùng của tôi sẽ bị lừa bởi những người sử dụng tính năng thu phóng của trình duyệt (ví dụ: một anh chàng tôi đang nói chuyện trên màn hình 13 "với 4K đã giảm xuống 1080p và vẫn phải sử dụng zoom). Làm việc trên iPhone của tôi (Safari / Firefox) và thiết bị Android (WATERFOX / Chrome / "Browser") Chắc chắn. nhiều hơn đáng tin cậy hơn so với tất cả các cấp cao hơn-bình chọn câu trả lời.
John

không phát hiện ra FireFox fennec trên Android mà tôi đã bổ sung navigator.userAgent.toLowerCase (). indexOf ('fennec')> -1 (có lẽ không phải là bổ sung tốt nhất ..)
StayCool

2
Ngoài ra, bạn có thể kiểm tra thuộc tính di chuột: cho điện thoại thông minh và màn hình cảm ứng @media (di chuột: không có) và (con trỏ: thô)
Batailley

16

Theo bài viết của MDN về phát hiện Trình duyệt bằng tác nhân người dùng , nên tránh cách tiếp cận này nếu có thể và đề xuất các con đường khác như phát hiện tính năng.

Tuy nhiên, nếu người ta phải sử dụng tác nhân người dùng làm phương tiện để phát hiện xem thiết bị có di động hay không, họ đề xuất:

Tóm lại, chúng tôi khuyên bạn nên tìm chuỗi Chuỗi Mobi Mobi bất cứ nơi nào trong Tác nhân người dùng để phát hiện thiết bị di động.

Do đó, lớp lót này sẽ đủ:

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

[CẬP NHẬT]:

Như @ zenw0lf gợi ý trong các nhận xét, sử dụng Biểu thức chính quy sẽ tốt hơn:

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


.includeskhông phải sopport bởi IE-11
Pasha Oleynik

1
@PashaOleynik một polyfill có thể khắc phục điều đó
Maxim

Máy tính bảng Nexus 7 với Android không có Mobiletrong chuỗi tác nhân người dùng
Alex Sorokoletov

@AlexSorokoletov Cũng cho bài viết 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
Tôi nghĩ rằng nó sẽ hoạt động ở bất cứ đâu mà không có polyfill: const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

Không có giải pháp hoàn hảo nào để phát hiện xem mã JS có được thực thi trên trình duyệt di động hay không, nhưng hai tùy chọn sau sẽ hoạt động trong hầu hết các trường hợp.

Tùy chọn 1: trình duyệt đánh hơi

!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');

Mã trình duyệt đặc biệt này là của một thư viện có tên isMobile .


Tùy chọn 2: window.orientation

Kiểm tra nếu window.orientationđược xác định:

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


Ghi chú

Không phải tất cả các thiết bị màn hình cảm ứng đều là điện thoại di động và ngược lại. Vì vậy, nếu bạn muốn triển khai một cái gì đó đặc biệt cho màn hình cảm ứng, bạn không nên kiểm tra xem trình duyệt của bạn có chạy trên thiết bị di động hay không mà là các thiết bị có hỗ trợ màn hình cảm ứng hay không:

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


Phương pháp định hướng là thực sự tốt đẹp! ))
Maxim

1
Tôi thích window.orientationgiải pháp của bạn , nhưng các tài liệu nói rằng nó không được chấp nhận! developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth

3
Phương pháp định hướng KHÔNG tốt vì Windows 8 trở lên có thể thay đổi hướng.
Heitor

Windows 8 và mới hơn tập trung vào việc hỗ trợ thêm cho điện thoại di động nhưng cũng có thể lai (máy tính xách tay có thể chuyển đổi thành miếng đệm lớn), đó là lý do tại sao định hướng thất bại như một phương pháp phát hiện ngay cả khi moz không coi đó là phản đối.
Jeff Clayton

Đó là từ Win 7 với Phần mềm đồ họa được cài đặt có thể thay đổi hướng nhưng hãy tự hỏi một câu hỏi, ai có thể trên Desktop / Laptop sử dụng một hướng màn hình khác như Portrait thay vì Cảnh và sử dụng i trong hơn 1 phút. Không một ai !!! Thay đổi hướng trên Máy tính để bàn có nghĩa là bạn sẽ bắt đầu đọc các ký tự trên màn hình từ dưới lên trên.
GirlCode

11

Đây là một giải pháp userAgent hiệu quả hơn so với ...

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
phương pháp kiểm tra không phân biệt chữ hoa chữ thường, nhưng biểu thức chính quy của bạn là. bạn chỉ có thể gắn cờ cho regex không phân biệt chữ hoa chữ thường bằng chữ "i" ở cuối và làm/iphone|etc/i.test(navigator.userAgent)
xec

11

Để thêm một lớp điều khiển bổ sung, tôi sử dụng bộ lưu trữ HTML5 để phát hiện xem nó đang sử dụng bộ nhớ di động hay bộ nhớ máy tính để bàn. Nếu trình duyệt không hỗ trợ lưu trữ, tôi có một mảng tên trình duyệt di động và tôi so sánh tác nhân người dùng với các trình duyệt trong mảng.

Nó khá đơn giản. Đây là chức năng:

// 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
Tôi chưa thử nghiệm trên thiết bị di động, nhưng sessionStorage.desktopkhông tồn tại trong Safari, Chrome hoặc Firefox (tất cả các phiên bản mới nhất tại thời điểm đăng bài). Mặc dù vậy, bạn nhận được một phiếu bầu, vì giải pháp của bạn đi theo hướng tốt hơn so với những người khác. Nhưng đừng quên sử dụng var mobile =thay vì mobile =.
shuckster

3
Ngoài ra, một ý tưởng tốt là không sử dụng indexOf với các trình duyệt cũ hơn vẫn không hỗ trợ phương pháp đó hoặc sử dụng polyfill. Không cần thiết phải sử dụng toLowerCase trong danh sách các giá trị chữ thường, cũng không cần thiết phải làm như vậy nếu bạn đang chạy /ipad|iphone|etc/i.test(navigator.userAgent) thay vì vòng lặp chậm bạn có trên đó.
Jeffrey Gilbert

10

Phát hiện tính năng tốt hơn nhiều so với việc cố gắng tìm ra thiết bị nào bạn đang sử dụng và rất khó theo kịp các thiết bị mới xuất hiện mọi lúc, một thư viện như Modernizr cho bạn biết liệu một tính năng cụ thể có khả dụng hay không.


18
Bạn đã trả lời một câu hỏi khác hơn những gì được hỏi. Thay vì "làm cách nào tôi có thể phát hiện điện thoại di động?", Bạn đã trả lời "làm cách nào tôi có thể phát hiện một số tính năng nhất định?". Không phải tất cả các phát hiện thiết bị là để phát hiện tính năng. Điều gì xảy ra nếu chúng ta đang tìm cách để có được số liệu thống kê về các thiết bị? Vậy thì không, "phát hiện tính năng" không "tốt hơn nhiều so với [tìm ra thiết bị]".
Jonathan Allard

1
Đây không phải là câu trả lời, nhưng nó xứng đáng nhiều hơn là một nhận xét. Câu hỏi là: tại sao bạn muốn phát hiện một trình duyệt và sau đó bạn có thể sẽ muốn biết nó chỉ vì cảm ứng (thiếu). Webdesign đáp ứng đủ trong hầu hết các trường hợp.
hai lần

8

Còn những thứ như thế này thì sao?

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

Tại sao không chỉ sử dụng screen.widththay thế? Dường như với tôi điều đó đáng tin cậy hơn window.matchMedia.
John Slegers

Xin chào John, tôi không thể nhớ chính xác những gì tôi đã nghĩ lúc đó, dường như không thể (nhìn vào nó bây giờ) rằng mệnh đề thứ hai sẽ trả về đúng nếu mệnh đề thứ nhất là sai. Có lẽ đã có một số lý do tôi thêm nó mặc dù.
stujo

Hầu hết các lập trình viên đàng hoàng đều cảm thấy xấu hổ khi họ nhìn thấy mã họ tự viết một năm trước đó. Những người không phát triển thành lập trình viên ;-)
John Slegers

4
Độ phân giải cửa sổ không liên quan gì đến việc trình duyệt có trên thiết bị di động hay không. Ví dụ: rất nhiều trình duyệt máy tính để bàn chạy trong các cửa sổ không toàn màn hình. Nếu bạn trình bày một UI được thiết kế cho màn hình cầm tay cho các trình duyệt đó, người dùng của họ sẽ có trải nghiệm khó chịu.
ʇsәɹoɈ

1
@ JohnSlegers - Tôi rất xấu hổ khi hỏi một câu hỏi và tìm câu trả lời của riêng tôi trên stackoverflow. lặp đi lặp lại. Bản thân tôi đang ở trong tình trạng chồng chéo liên tục
vsync

7

Khi yếu tố đạt được trọng tâm, bạn ngay lập tức làm mờ nó. Bootstrap-datepicker, một thành phần rất phổ biến và được duy trì tốt với gần 10.000 sao trong GitHub, sử dụng phương pháp này:

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

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

Cảm ơn Tigger đã hỗ trợ.


7

Một cách thực sự tốt để phát hiện các thiết bị di động hoặc máy tính bảng là bằng cách xem liệu trình duyệt có thể tạo sự kiện cảm ứng hay không.

Mã JavaScript đơn giản:

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

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

Điều này làm việc với tôi rất tốt, nhưng có thể có vấn đề với các thiết bị máy tính xách tay có màn hình cảm ứng.

Tôi không chắc máy tính xách tay màn hình cảm ứng có bị phát hiện là thiết bị di động hay không vì tôi chưa thử nghiệm.


5
Máy tính xách tay màn hình cảm ứng sẽ được phát hiện là thiết bị di động. Cũng như màn hình cảm ứng cho máy tính để bàn. Dù bạn có tin hay không, bạn cũng sẽ gặp vấn đề nếu bạn đang sử dụng thiết bị màn hình cảm ứng để RDP vào một thiết bị khác không có màn hình cảm ứng.
blissfool

@blissfool Tôi đoán đây sẽ không phải là cách đúng đắn để phát hiện thiết bị di động.
Neo Morina

Tiếc là không có. Nhưng, nó vẫn có thể là một lựa chọn khả thi cho trường hợp sử dụng rất hạn chế.
blissfool

không bao giờ viết mã, dựa trên một ngoại lệ, chắc chắn sẽ bị ném trong mọi trường hợp ...
Pablo

@Sivic nó chỉ bị ném khi TouchEvent không tồn tại và đoạn mã trên bắt được nó và trả về false. Đây không phải là trường hợp trên Điện thoại di động hoặc Máy tính bảng hoặc các thiết bị Màn hình cảm ứng khác.
Neo Morina

5

Đây là giải pháp suy nghĩ lại của tôi cho vấn đề. Vẫn chưa hoàn hảo. Giải pháp thực sự duy nhất là nếu các nhà sản xuất thiết bị bắt đầu thực hiện nghiêm túc chuỗi tác nhân người dùng "Di động" và "Máy tính bảng".

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

Điều gì xảy ra khi máy tính bảng Nexus 7 chỉ có chuỗi UA Android? Đầu tiên, Mobile trở thành sự thật, sau này trên Tablet cũng trở thành sự thật, nhưng Tablet sẽ xóa chuỗi UA di động khỏi thẻ body.

CSS:

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

alertdòng bổ sung để phát triển. Bảng điều khiển Chrome có thể mô phỏng nhiều thiết bị cầm tay. Kiểm tra ở đó.

BIÊN TẬP:

Chỉ không sử dụng cái này, sử dụng tính năng phát hiện thay thế. Có rất nhiều thiết bị và thương hiệu ngoài kia mà nhắm mục tiêu một thương hiệu KHÔNG BAO GIỜ sẽ là giải pháp phù hợp.


4

Tôi khuyên bạn nên kiểm tra http://wurfl.io/

Tóm lại, nếu bạn nhập một tệp JS nhỏ:

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

bạn sẽ bị bỏ lại với một đối tượng JSON trông giống như:

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

(tất nhiên là giả sử bạn đang sử dụng Nexus 7) và bạn sẽ có thể thực hiện những việc như:

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

Đây là những gì bạn đang tìm kiếm.

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho công ty cung cấp dịch vụ miễn phí này. Cảm ơn.


1
Và làm thế nào điều này không nhận ra safari trên iphone?
Amyth

Bạn có thể mở rộng trên trình duyệt nào bạn đang sử dụng (chuỗi UA chính xác sẽ hoàn hảo), dữ liệu bạn đang nhận và những gì bạn đang mong đợi?
Luca Passani

Tôi cũng đã thử wurfl, tôi đang dùng iPhone 5C chạy iOS 11.2. Nó không nhận ra Safari là một trình duyệt di động. Tôi đang mong đợi sử dụng "is_mobile": đúng và sau đó là "form_factor": Điện thoại thông minh và nó cũng không trở lại.
Mike Wells

Tôi đã phải chuyển sang các chuyên gia về Dữ liệu di động trong công ty và họ nói với tôi rằng OS 11.2 không chạy trên 5C. Thiết bị thấp nhất là 5S. Vì vậy, một cái gì đó không đúng trong những gì bạn đã viết. Vui lòng liên hệ với ScienceiaMobile ngoại tuyến để xác minh xem có thể ngắt kết nối ở đâu. Cảm ơn
Luca Passani

4

đây là một lót

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};

3

Phụ thuộc vào trường hợp sử dụng. Tất cả các thiết bị di động đều cần pin. Nếu những gì bạn đang theo là tính toán năng lượng mà không làm cạn kiệt pin, hãy sử dụng API Trạng thái pin :

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

Nếu những gì bạn đang tìm kiếm là sử dụng mang tính trình bày matchMedia, sẽ trả về giá trị Boolean:

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

Hoặc kết hợp chúng để có trải nghiệm người dùng thậm chí tốt hơn trên các thiết bị máy tính bảng.


Lưu ý rằng API Trạng thái pin đang bị xóa khỏi trình duyệt.
Sora2455

API Trạng thái pin đã bị xóa khỏi Firefox nhưng vẫn là Khuyến nghị của Ứng viên W3C kể từ tháng 7 năm 2016 , tiếp tục hoạt động trong các trình duyệt phổ biến và rất hữu ích trong việc định hình trải nghiệm.
Josh Habdas

2

Đây là giải pháp ECMAScript 6 (TypeScript đã sẵn sàng)

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

Tại sao không trả lại ifđiều kiện thay vì có toàn bộ checkbiến này?
Vic

2

Có một mẹo đơn giản để phát hiện xem nó có phải là thiết bị di động hay không. Chỉ cần kiểm tra nếu sự kiện ontouchstart tồn tại:

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

3
Không hoạt động với máy tính xách tay và thiết bị khử nhiễu với màn hình cảm ứng. Cũng sẽ là một vấn đề với Surface pc như Surface. Ít vấn đề hơn với máy tính để bàn nhưng có nhiều máy tính xách tay màn hình cảm ứng được bán trong những ngày này.
blissfool

2

Tôi đã phải đối mặt với một số tình huống trong đó câu trả lời trên dint làm việc cho tôi. Vì vậy, tôi đã đưa ra điều này. Có thể hữu ích cho ai đó.

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

Nó phụ thuộc vào trường hợp sử dụng của bạn. Nếu bạn tập trung vào việc sử dụng màn hình screen.availWidth, hoặc bạn có thể sử dụng document.body.clientWidthnếu bạn muốn kết xuất dựa trên tài liệu.


1

Điều tốt nhất phải là:

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

Nhưng giống như Yoav Barnea nói ...

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

Sau 3 thử nghiệm này, tôi hy vọng var isMobile là ... ok


> Firefox di động trên Android dường như không có "'định hướng" trong cửa sổ "
molokoloco

1
Xin lỗi .. ok cho tôi nó hoạt động tốt như thế bây giờ. "if (Modernizr.touch) / * ... * /" và tiếp tục ...
molokoloco

Chỉ cần tự hỏi Modernizr.touch sẽ hoạt động như thế nào khi trên một thiết bị máy tính để bàn màn hình cảm ứng.
B2K

Để làm cho nó thanh lịch hơn, bạn nên tạo tất cả mã te chỉ trong một khối if-if if-if if khác.
Heitor

1

Đây là chức năng đầy đủ

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) trả về 4 chữ cái đầu tiên. Làm thế nào để nó phát hiện "android. + Mobile"?
raacer

1
@raacer thực sự có hai regex trong câu trả lời (cả hai trên cùng một dòng) - cái đầu tiên kiểm tra toàn bộ chuỗi UA và tìm kiếm android, mobile, v.v., trong khi cái thứ hai chỉ kiểm tra 4 ký tự đầu tiên của UA .
JackW

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

Ngoài ra, bạn có thể làm theo hướng dẫn này để phát hiện một điện thoại di động cụ thể. Nhấn vào đây .


Vui lòng thêm Mobilevào RX của bạn
oriadam

1

Còn việc sử dụng "window.screen. thong" thì sao?

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

hoặc là

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

Tôi đoán đây là cách tốt nhất vì có một thiết bị di động mới mỗi ngày!

(mặc dù tôi nghĩ rằng nó không được hỗ trợ trong các trình duyệt cũ, nhưng hãy dùng thử :))


1
Còn cảnh quan thì sao?
Erick Voodoo

1
Điều này không hữu ích cho các kịch bản nhất định. Nếu trình duyệt máy tính để bàn bị thay đổi kích thước, nó có thể được phát hiện không chính xác như một trình duyệt di động
toing_toing

Một PC về cơ bản khác với các thiết bị di động về khả năng sử dụng, câu trả lời khủng khiếp !!
Heitor

1

Lưu ý rằng hầu hết các thiết bị di động thế hệ mới hơn hiện nay có độ phân giải lớn hơn 600x400. tức là một chiếc iPhone 6 ....

Bằng chứng kiểm tra: đã chạy các bài đăng được nâng cấp nhất và gần đây nhất tại đây, với một kiểm tra tùy chọn một lần chạy như vậy:

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

Bằng cách nào đó, các kết quả sau đã được trả về trên Ứng dụng trình duyệt sau. Thông số kỹ thuật: iPhone 6S, iOS 10.3.1.

Safari (mới nhất): Đã phát hiện nó như một thiết bị di động.

Chrome (mới nhất): Không phát hiện ra nó là điện thoại di động.

Vì vậy, sau đó tôi đã thử nghiệm đề xuất từ Lanti ( https://stackoverflow.com/a/31864119/7183483 ) và nó đã trả về kết quả phù hợp (di động cho tất cả các thiết bị iOS và máy tính để bàn cho máy Mac của tôi). Do đó, tôi đã tiến hành chỉnh sửa nó một chút vì nó sẽ bắn hai lần (cho cả thiết bị di động và Máy tính bảng). Sau đó tôi nhận thấy khi thử nghiệm trên iPad, nó cũng trở lại dưới dạng điện thoại di động, điều này có ý nghĩa, vì Thông số đó Lantisử dụng kiểm tra hệ điều hành nhiều hơn bất cứ điều gì. Do đó, tôi chỉ đơn giản là di chuyển câu lệnh IF của máy tính bảng bên trong kiểm tra di động, điều này sẽ trả về điện thoại di động là kiểm tra Tablet là âm tính và máy tính bảng thì ngược lại. Sau đó, tôi đã thêm mệnh đề khác cho kiểm tra di động để trở lại dưới dạng máy tính để bàn / máy tính xách tay, vì cả hai đều đủ điều kiện, nhưng sau đó nhận thấy rằng trình duyệt phát hiện thương hiệu CPU và hệ điều hành. Vì vậy, tôi đã thêm những gì được trả lại trong đó như là một phần của câu lệnh if thay thế. Để giới hạn, tôi đã thêm một tuyên bố thận trọng khác trong trường hợp không có gì được phát hiện. Xem dưới đây, sẽ cập nhật với một bài kiểm tra trên PC Windows 10 sớm.

Ồ, và tôi cũng đã thêm một biến 'debugMode', để dễ dàng chuyển đổi giữa gỡ lỗi và biên dịch thông thường.

Từ chối trách nhiệm: Tín dụng đầy đủ cho Lanti , cũng như điều này chưa được thử nghiệm trên Máy tính bảng Windows ... có thể trả về máy tính để bàn / máy tính xách tay, vì HĐH là Windows thuần túy. Sẽ kiểm tra một khi tôi tìm thấy một người bạn sử dụng một.

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

Đây chỉ là một cổng es6 của câu trả lời được chấp nhận mà tôi đang sử dụng trong dự án của mình. Lưu ý rằng điều này cũng bao gồm máy tính bảng.

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

return 'ontouchstart' in window && window.screen.availWidth < 768

Làm thế nào về điều này, nó mở rộng trên câu trả lời ở trên nhưng cũng kiểm tra kích thước màn hình


1

Sử dụng Regex (từ Detmobilebrowsers.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

Đây cũng có thể là một giải pháp.

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');
  }

Nếu bạn sử dụng cả hai phương pháp, bạn sẽ có được một cách hoàn hảo để phát hiện các thiết bị khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.