Cách tốt nhất để phát hiện một thiết bị di động là gì?


1651

Có một cách chắc chắn để phát hiện xem người dùng có sử dụng thiết bị di động trong jQuery hay không? Một cái gì đó tương tự như thuộc tính CSS @media? Tôi muốn chạy một tập lệnh khác nếu trình duyệt nằm trên thiết bị cầm tay.

Hàm jQuery $.browserkhông phải là thứ tôi đang tìm kiếm.


7
Cung cấp một URL di động đặc biệt cho các thiết bị di động. Đây là cách hầu hết các trang web lớn xử lý các thiết bị di động. Xem m.google.com .
meagar

6
jQuery không, và không thể làm mọi thứ. Nó được cung cấp khả năng điều khiển và xử lý DOM trên trình duyệt chéo, hoạt hình đơn giản và ajax giữa các trình duyệt và tạo khung khung xương cho các plugin để xây dựng. Vui lòng lưu ý các hạn chế của jQuery trước khi hỏi cụ thể về giải pháp jQuery.
Yi Jiang

78
Tác nhân người dùng liên tục di chuyển mục tiêu, mọi người đọc bài đăng này nên rất cảnh giác với tác nhân người dùng đánh hơi
Rob

46
Thiết bị 'di động' là gì? Đây có phải là thiết bị hỗ trợ cảm ứng (bao gồm Chrome Pixels và máy tính xách tay Windows 8 có chuột) không? Đây có phải là một thiết bị có màn hình nhỏ (những gì về iPad võng mạc)? Đây có phải là một thiết bị có CPU chậm? Hoặc một thiết bị có kết nối internet chậm? Tùy thuộc vào những gì bạn muốn làm câu trả lời cho câu hỏi này sẽ khác nhau. Để nhắm mục tiêu độ phân giải màn hình hoặc cảm ứng là dễ dàng. Nếu bạn muốn cung cấp nội dung nhỏ hơn hoặc JS ít chuyên sâu hơn cho một số thiết bị, thì không có viên đạn bạc nào. Kiểm tra cho window.navigator.connection và quay trở lại (người dùng khó chịu, xấu, không được khuyến khích) Ngửi ngửi. 2 xu của tôi.
David Gilbertson

3
@Cole "Cole9" Johnson Quan điểm của tôi chính xác. 'Di động' dường như được sử dụng như một thuật ngữ ô cho cảm ứng, CPU chậm, mạng chậm và màn hình nhỏ. Nhưng không ai trong số này là những giả định hoàn hảo. Tôi tin rằng việc xem xét các cá nhân này sẽ dẫn đến một sản phẩm tốt hơn là thiết kế cho một số khái niệm mơ hồ về 'di động'. Do đó tôi đặt câu hỏi đó cho OP.
David Gilbertson

Câu trả lời:


2027

Lưu ý của biên tập viên: phát hiện tác nhân người dùng không phải là một kỹ thuật được khuyến nghị cho các ứng dụng web hiện đại. Xem các bình luận bên dưới câu trả lời này để xác nhận thực tế này. Bạn nên sử dụng một trong những câu trả lời khác bằng cách sử dụng tính năng phát hiện và / hoặc truy vấn phương tiện.


Thay vì sử dụng jQuery, bạn có thể sử dụng JavaScript đơn giản để phát hiện ra nó:

if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
 // some code..
}

Hoặc bạn có thể kết hợp cả hai để làm cho nó dễ truy cập hơn thông qua jQuery ...

$.browser.device = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));

Bây giờ $.browsersẽ trở lại "device"cho tất cả các thiết bị trên

Lưu ý: $.browserđã xóa trên jQuery v1.9.1 . Nhưng bạn có thể sử dụng điều này bằng cách sử dụng trình cắm di chuyển jQuery


Một phiên bản kỹ lưỡng hơn:

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

438
Đánh hơi tác nhân người dùng là một kỹ thuật phát hiện rất gật đầu, chuỗi tác nhân người dùng là một mục tiêu di chuyển liên tục, họ không nên tin tưởng một mình. Mọi người bỏ phiếu bài đăng này nên xem xét nghiên cứu thêm.
Cướp

65
Một trong những vấn đề với việc đánh hơi chỉ các thiết bị cụ thể ra khỏi tác nhân người dùng là bạn phải nhớ cập nhật phát hiện khi thiết bị mới xuất hiện. Đây không phải là một giải pháp lý tưởng.
ICodeForCoffee

11
Trình duyệt cá heo trên Android không gửi bất kỳ chuỗi nào trong số đó!
feeela

88
Nếu người dùng của bạn đủ xảo quyệt hoặc nhà phát triển đủ câm để thay đổi chuỗi tác nhân người dùng, họ sẽ quan tâm đến họ ...
mattdlockyer 22/03/13

58
Vì vậy, làm thế nào di động bạn sẽ xem xét một TV Android với chuột? Làm thế nào di động là một PC Windows có thể chạy ở chế độ kép (với bàn phím hoặc dưới dạng màn hình cảm ứng)? Nếu bạn đã làm điều này trước khi iPad được phát minh, thì bạn phải thêm nó sau vào tất cả các trang web của mình. Các hệ điều hành tiếp theo sắp ra mắt: Ubuntu Mobile, FirefoxOS, Tizen ....This.Is.A.Bad.Idea.
FrancescoMM

535

Đối với tôi nhỏ là đẹp nên tôi đang sử dụng kỹ thuật này:

Trong tệp CSS:

/* Smartphones ----------- */
@media only screen and (max-width: 760px) {
  #some-element { display: none; }
}

Trong tệp jQuery / JavaScript:

$( document ).ready(function() {      
    var is_mobile = false;

    if( $('#some-element').css('display')=='none') {
        is_mobile = true;       
    }

    // now i can use is_mobile to run javascript conditionally

    if (is_mobile == true) {
        //Conditional script here
    }
 });

Mục tiêu của tôi là để trang web của tôi "thân thiện với thiết bị di động". Vì vậy, tôi sử dụng CSS Media Queries để hiển thị / ẩn các yếu tố tùy thuộc vào kích thước màn hình.

Ví dụ: trong phiên bản di động của tôi, tôi không muốn kích hoạt Hộp Like của Facebook, vì nó tải tất cả những hình ảnh và nội dung tiểu sử đó. Và điều đó không tốt cho khách truy cập di động. Vì vậy, ngoài việc ẩn phần tử container, tôi cũng thực hiện điều này bên trong khối mã jQuery (ở trên):

if(!is_mobile) {
    (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pt_PT/all.js#xfbml=1&appId=210731252294735";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

Bạn có thể thấy nó hoạt động tại http://lisboaautentica.com

Tôi vẫn đang làm việc trên phiên bản di động, vì vậy nó vẫn không giống như khi viết.

Cập nhật bởi dekin88

Có một API JavaScript được tích hợp để phát hiện phương tiện truyền thông. Thay vì sử dụng giải pháp trên, chỉ cần sử dụng các giải pháp sau:

$(function() {      
    let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;

    if (isMobile) {
        //Conditional script here
    }
 });

Hỗ trợ trình duyệt: http://caniuse.com/#feat=matchmedia

Ưu điểm của phương pháp này là nó không chỉ đơn giản và ngắn hơn, mà bạn có thể nhắm mục tiêu một cách có điều kiện các thiết bị khác nhau như điện thoại thông minh và máy tính bảng nếu cần mà không cần phải thêm bất kỳ yếu tố giả nào vào DOM.


8
Bạn không cần # một số yếu tố THỰC SỰ TRONG DOM để làm việc này?
Rimer

68
-1 Tài screen.widthsản là một toàn cầu. Không cần phải tùy ý thêm một phần tử vào DOM và mang lại các truy vấn phương tiện CSS một cách không cần thiết. Ngoài ra, nếu trình duyệt nằm trên máy tính để bàn và người dùng thay đổi kích thước cửa sổ, $is_mobilesẽ không được cập nhật.
merv

98
Tại sao không:if( screen.width <= 480 ) { // is mobile }
andrewrjones

23
@andrewrjones Thiết bị Retina nhân đôi widthgiá trị thuộc tính IIRC. Do đó, một iPhone võng mạc sẽ có một widthsố 640và chiều cao 960trong bức chân dung, và một widthcủa 960và chiều cao 640trong cảnh quan.
Cole Johnson

66
Bạn vừa mới phát minh lại window.matchMedia: developer.mozilla.org/en-US/docs/Web/API/Window.matchMedia
Paul Irish

236

Theo Mozilla - Phát hiện trình duyệt bằng tác nhân người dùng :

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.

Như thế này:

if (/Mobi/.test(navigator.userAgent)) {
    // mobile!
}

Điều này sẽ phù hợp với tất cả các tác nhân người dùng trình duyệt di động phổ biến, bao gồm Mozilla, Safari, IE, Opera, Chrome, v.v.

Cập nhật cho Android

EricL cũng khuyên bạn nên thử nghiệm với Androidtư cách là tác nhân người dùng, vì chuỗi tác nhân người dùng Chrome cho máy tính bảng không bao gồm "Mobi" (tuy nhiên phiên bản điện thoại làm):

if (/Mobi|Android/i.test(navigator.userAgent)) {
    // mobile!
}

11
Cảm ơn câu trả lời! /Mobi/i.test(navigator.userAgent)Mặc dù vậy, tôi thích , vì test () nó trả về Boolean.
arminrosu

5
Nghịch lý FireFox Mobile trên Samsung Galaxy Note 8 không trả về Mobi và thử nghiệm sẽ trả về sai.
Eirinn

13
Bài viết được liên kết đề cập: Nếu thiết bị đủ lớn mà không được đánh dấu bằng Mobi Mobi, bạn nên phục vụ trang web trên máy tính để bàn của mình (theo cách tốt nhất, nên hỗ trợ đầu vào cảm ứng, vì nhiều máy tính để bàn sẽ xuất hiện với màn hình cảm ứng).
QuasarDonkey

2
Điều này tốt hơn nhiều so với các giải pháp được đề xuất khác, nó phải là câu trả lời được chấp nhận imo
RNobel

9
Derp. Cảm ơn. Tôi không thể chỉnh sửa bài viết trước của tôi. Đây là một lần nữa:/Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent)
EricL

90

Một lớp lót đơn giản và hiệu quả:

function isMobile() { return ('ontouchstart' in document.documentElement); }

Tuy nhiên, mã trên không tính đến trường hợp cho máy tính xách tay có màn hình cảm ứng. Vì vậy, tôi cung cấp phiên bản thứ hai này, dựa trên giải pháp @Julian :

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

29
Còn máy tính xách tay Windows có màn hình cảm ứng thì sao?
Chris Cinelli

10
isMobileChức năng thứ hai bạn cung cấp trả về truetrên thiết bị định mệnh của tôi !! (Google Chrome v44.0)
Luke

12
Đây là nhiều hơn một phương pháp isTouchSupported không thực sự phát hiện di động.
Barkermn01

3
Không phải tất cả các điện thoại di động đều có màn hình cảm ứng.
Andrew

@LukeP Bạn có làm mới khi đi từ mô phỏng di động sang máy tính để bàn không?
Christian4423

81

Những gì bạn đang làm bằng cách muốn phát hiện một thiết bị di động đang tiến gần đến một khái niệm "trình duyệt đánh hơi" IMO. Nó có thể sẽ tốt hơn nhiều để làm một số tính năng phát hiện. Các thư viện như http://www.modernizr.com/ có thể giúp với điều đó.

Ví dụ, đâu là ranh giới giữa di động và không di động? Nó càng ngày càng mờ hơn mỗi ngày.


3
Tuy nhiên, người dùng có thể muốn sử dụng "jquery mobile" cho các thiết bị đó, bất kể các tính năng được hỗ trợ.
Sirber

9
Ví dụ: vấn đề của tôi với "di động" "không di động" là các tính năng cuộn qua của tôi, tôi đã thiết lập JS để tắt các tính năng, chỉ cần phát hiện
Sam Sussman

4
Tuy nhiên, nếu bạn muốn cung cấp một ứng dụng có thể tải xuống dành riêng cho thiết bị, nó có thể hữu ích.
Bastes

3
Tùy thuộc vào tình huống, tôi đang tìm kiếm thứ gì đó sẽ cho tôi biết nếu người dùng sử dụng thiết bị di động, để tôi có thể vô hiệu hóa một số hình ảnh động dựa trên JavaScript nặng. Việc đánh hơi UA sẽ phù hợp hơn nhiều so với việc cố gắng 'phát hiện' các khả năng hiệu suất JavaScript của trình duyệt của người dùng.
Rick Suggs

9
Di động so với không di động là một sự khác biệt rất lớn, chỉ sử dụng "phát hiện tính năng" là ngu ngốc khi bạn đang cố gắng cung cấp các tương tác / ui cho trải nghiệm trên thiết bị di động / máy tính để bàn. Cá nhân, tôi ước rằng có một cách dễ dàng (và đáng tin cậy) để có được HĐH mà trình duyệt hiện tại đang chạy trong
nbsp

66

Đó không phải là jQuery, nhưng tôi đã tìm thấy cái này: http://detectmobilebrowser.com/

Nó cung cấp các tập lệnh để phát hiện các trình duyệt di động bằng nhiều ngôn ngữ, một trong số đó là JavaScript. Điều đó có thể giúp bạn với những gì bạn đang tìm kiếm.

Tuy nhiên, vì bạn đang sử dụng jQuery, bạn có thể muốn biết về bộ sưu tập jQuery.support. Đây là một tập hợp các thuộc tính để phát hiện các khả năng của trình duyệt hiện tại. Tài liệu ở đây: http://api.jquery.com/jQuery.support/

Vì tôi không biết chính xác những gì bạn đang cố gắng thực hiện, tôi không biết cái nào trong số này sẽ hữu ích nhất.

Tất cả những gì đang được nói, tôi nghĩ rằng đặt cược tốt nhất của bạn là chuyển hướng hoặc viết một tập lệnh khác đến đầu ra bằng ngôn ngữ phía máy chủ (nếu đó là một tùy chọn). Vì bạn không thực sự biết các khả năng của trình duyệt di động x, thực hiện phát hiện và logic thay đổi ở phía máy chủ sẽ là phương pháp đáng tin cậy nhất. Tất nhiên, tất cả những điều đó là một điểm cần thiết nếu bạn không thể sử dụng ngôn ngữ phía máy chủ :)


6
không hỗ trợ iPad. Để hỗ trợ iPad, hãy tìm ip (hone | od) và "| ad" - ví dụ: ip (hone | od | ad)
Jayson Ragasa

3
Tôi vừa thử javascript từ Detmobilebrowser.com/ và CNTT KHÔNG hoạt động cho iPad.
Milche P Parent

3
@MilcheP Parent đó là do tập lệnh bị lỗi, sử dụng iPad thay vì ipad, sau đó nó hoạt động, tôi gặp sự cố trên Samsung Tab của mình, phải sử dụng Android iso android :)
Coen Damen

13
Có phiên bản jQuery ở đó và nó hoạt động hoàn hảo, nhưng để phát hiện máy tính bảng, bạn phải thêm |android|ipad|playbook|silknhư mô tả trong phần giới thiệu (theo thiết kế)
cprcrack

3
Vâng, một máy tính bảng không phải là điện thoại di động. Các trang web được gọi là trình duyệt di động dectect .
Đêm giao thừa

47

Đôi khi, mong muốn biết khách hàng đang sử dụng thiết bị thương hiệu nào để hiển thị nội dung cụ thể cho thiết bị đó, như liên kết đến cửa hàng iPhone hoặc thị trường Android. Modernizer là tuyệt vời, nhưng chỉ cho bạn thấy các khả năng của trình duyệt, như HTML5 hoặc Flash.

Đây là giải pháp UserAgent của tôi trong jQuery để hiển thị một lớp khác nhau cho từng loại thiết bị:

/*** sniff the UA of the client and show hidden div's for that device ***/
var customizeForDevice = function(){
    var ua = navigator.userAgent;
    var checker = {
      iphone: ua.match(/(iPhone|iPod|iPad)/),
      blackberry: ua.match(/BlackBerry/),
      android: ua.match(/Android/)
    };
    if (checker.android){
        $('.android-only').show();
    }
    else if (checker.iphone){
        $('.idevice-only').show();
    }
    else if (checker.blackberry){
        $('.berry-only').show();
    }
    else {
        $('.unknown-device').show();
    }
}

Giải pháp này được lấy từ Graphics Maniacs http://gpsonmaniacs.com/note/detecting-iphone-ipod-ipad-android-and-blackberry-browser-with-javascript-and-php/


Điều này làm việc tuyệt vời. Tôi cần phải tắt chức năng jQuery chạy khi cuộn khi sử dụng điện thoại iPad hoặc Android và vì các thiết bị khác nhau có độ rộng màn hình khác nhau, đây là một giải pháp đơn giản. Cảm ơn rất nhiều.
Eric Allen

Vấn đề duy nhất khi sử dụng thử nghiệm của Android là những gì về ngóc ngách sử dụng tác nhân người dùng Android
MayorMonty

Câu trả lời hay cho thấy chúng ta không phải là người theo chủ nghĩa cơ bản phát hiện.
Fernando

44

Tìm thấy một giải pháp trong: http://www.abeautitablesite.net/blog/2011/11/detecting-mobile-devices-with-javascript/ .

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);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

Và sau đó để xác minh xem đó có phải là Di động hay không, bạn có thể kiểm tra bằng cách sử dụng:

if(isMobile.any()) {
   //some code...
}

Một giải pháp dựa trên tác nhân người dùng hoạt động tốt khi bạn có thể tin tưởng chuỗi phụ liên quan trực tiếp đến loại thiết bị. tức là iPad = iPad. Tuy nhiên, hiện nay có rất nhiều loại thiết bị khác nhau (hơn 25.000) mà cách tiếp cận không đủ chính xác cho hầu hết các mục đích kinh doanh. Tôi đã thành lập dự án nguồn mở 51Degrees.com để cung cấp một sự thay thế đáng tin cậy và mạnh mẽ. Nó sẽ hoạt động trong JavaScript và cả phía máy chủ. Tất cả các tài liệu đều có ở đây ... 51degrees.com/support/documentation
James Rosewell

Tôi đã sử dụng ở trên, và nó hoạt động tốt với tôi, nhưng bây giờ nó không hoạt động cho Android 5.1 trở lên, có gì thay đổi trong Android 5.1 trở lên không?
Imran Qamer

if (isMobile.Android ()) {document.getEuityById ("myAnchor"). setAttribution ("href", " google.com" ); }
Amranur Rahman

25

Nếu bằng "di động", bạn có nghĩa là "màn hình nhỏ", tôi sử dụng điều này:

var windowWidth = window.screen.width < window.outerWidth ?
                  window.screen.width : window.outerWidth;
var mobile = windowWidth < 500;

Trên iPhone, bạn sẽ kết thúc với window.screen. Băng thông 320. Trên Android, bạn sẽ kết thúc với một cửa sổ. Đồ trang của 480 (mặc dù điều đó có thể phụ thuộc vào Android). iPad và máy tính bảng Android sẽ trả về các số như 768 để chúng có được chế độ xem đầy đủ như bạn muốn.


1
Tại sao 'window.screen. thong' không đủ? Có vẻ như bạn đang sử dụng 'window.screen. Thong' hoặc 'window.outerWidth' nhỏ hơn. Tại sao bạn quan tâm đến 'outsWidth'? Cảm ơn trước câu trả lời!
dùng1330974

16

Nếu bạn sử dụng Modernizr , nó rất dễ sử dụng Modernizr.touchnhư đã đề cập trước đó.

Tuy nhiên, tôi thích sử dụng kết hợp Modernizr.touchthử nghiệm tác nhân người dùng và để an toàn.

var deviceAgent = navigator.userAgent.toLowerCase();

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

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

Nếu bạn không sử dụng Modernizr, bạn chỉ cần thay thế Modernizr.touchchức năng trên bằng('ontouchstart' in document.documentElement)

Cũng lưu ý rằng việc kiểm tra tác nhân người dùng iemobilesẽ cung cấp cho bạn phạm vi rộng hơn của các thiết bị di động Microsoft được phát hiện hơn Windows Phone.

Cũng xem câu hỏi SO này


Và tương tự trong Dart : TouchEvent.supported.
Kai Sellgren

('ontouchstart' in window)là một thay thế cho Modernizr.touch, quá, hacks.mozilla.org/2013/04/...
JVE999

Tôi nghĩ Modernizr là một giải pháp tuyệt vời!
Bobby Russell

Bạn thực sự nên sử dụng RegEx |thay vì nhiều trận đấu. Bạn cũng không cần toLowerCase()bởi vì bạn có công cụ isửa đổi. Tại đây: var isTouchDevice = Modernizr.touch || /iphone|ipod|ipad|android|iemobile|iphone|ipad|ipod|blackberry|bada/i.test(navigator.userAgent);
oriadam

14

Bạn không thể dựa vào navigator.userAgent, không phải mọi thiết bị đều tiết lộ HĐH thực sự của nó. Trên HTC của tôi chẳng hạn, nó phụ thuộc vào cài đặt ("sử dụng phiên bản di động" bật / tắt). Trên http://my.clockodo.com , chúng tôi chỉ đơn giản được sử dụng screen.widthđể phát hiện các thiết bị nhỏ. Thật không may, trong một số phiên bản Android có lỗi với screen. Thong. Bạn có thể kết hợp theo cách này với userAgent:

if(screen.width < 500 ||
 navigator.userAgent.match(/Android/i) ||
 navigator.userAgent.match(/webOS/i) ||
 navigator.userAgent.match(/iPhone/i) ||
 navigator.userAgent.match(/iPod/i)) {
alert("This is a mobile device");
}

8
Nhiều điện thoại di động có chiều rộng> 1000, đặc biệt là ở chế độ
nằm ngang

14

Tôi biết câu hỏi này có rất nhiều câu trả lời, nhưng từ những gì tôi thấy không ai tiếp cận câu trả lời theo cách tôi sẽ giải quyết vấn đề này.

CSS sử dụng chiều rộng (Truy vấn phương tiện) để xác định kiểu nào được áp dụng cho tài liệu web dựa trên chiều rộng. Tại sao không sử dụng chiều rộng trong JavaScript?

Ví dụ: trong Truy vấn phương tiện (Đầu tiên trên thiết bị di động) của Bootstrap, tồn tại 4 điểm snap / break:

  • Các thiết bị cực nhỏ là 768 pixel trở xuống.
  • Thiết bị nhỏ có phạm vi từ 768 đến 991 pixel.
  • Thiết bị trung bình có phạm vi từ 992 đến 1199 pixel.
  • Thiết bị lớn có 1200 pixel trở lên.

Chúng tôi cũng có thể sử dụng điều này để giải quyết vấn đề JavaScript của mình.

Đầu tiên chúng ta sẽ tạo một hàm lấy kích thước cửa sổ và trả về một giá trị cho phép chúng ta xem thiết bị có kích thước nào đang xem ứng dụng của chúng ta:

var getBrowserWidth = function(){
    if(window.innerWidth < 768){
        // Extra Small Device
        return "xs";
    } else if(window.innerWidth < 991){
        // Small Device
        return "sm"
    } else if(window.innerWidth < 1199){
        // Medium Device
        return "md"
    } else {
        // Large Device
        return "lg"
    }
};

Bây giờ chúng ta đã thiết lập chức năng, chúng ta có thể gọi nó là lưu trữ giá trị:

var device = getBrowserWidth();

Câu hỏi của bạn là

Tôi muốn chạy một tập lệnh khác nếu trình duyệt nằm trên thiết bị cầm tay.

Bây giờ chúng ta có thông tin thiết bị, tất cả những gì còn lại là một câu lệnh if:

if(device === "xs"){
  // Enter your script for handheld devices here 
}

Dưới đây là một ví dụ về CodePen: http://codepen.io/jacob-king/pen/jweeWG


Điều này làm việc tốt nhất cho tôi. Vì tôi đang sử dụng bootstrap cho một số trang chuyển tiếp trên thiết bị di động, kỹ thuật này hoạt động tốt để tự động chuyển hướng từ một trang không chuyển tiếp (không phải bootstrap) sang trang bootstrap. Mẹo: Tôi đã tìm thấy một vấn đề nhỏ trong các công cụ IE12 F12: Tôi đã bật mô phỏng trong F12 Dev Tools cho thiết bị di động và nó gặp sự cố khi phát hiện kích thước cửa sổ. Tôi đã định cỡ lại nó dưới điểm phá vỡ xs nhưng nó đã phát hiện ra nó là md. Ngay sau khi tôi tắt mô phỏng điện thoại và làm mới trang, nó đã phát hiện chính xác kích thước và trong mã của tôi, tôi chuyển hướng đến một trang bootstrap.
Jeff Mergler

Đó là tôi đã tìm kiếm một lúc. Cảm ơn bạn!
Nhà phát triển

2
@JacobKing bạn nói Small Devices range from 768 to 991 pixels.điều này có nghĩa là nó phải window.innerWidth < 992bao gồm (991 được bao gồm) điều tương tự cho 1199, nó phải là <1200 thay vào đó
medBouzid

13

Trong một dòng javascript:

var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));

Nếu tác nhân người dùng chứa 'Mobi' (theo MDN) và ontouchstart khả dụng thì có khả năng đó là một thiết bị di động.


1
phải /Mobi/.test(navigator.userAgent)... matchkhông làm điều đó cho tôi
BananaAcid

12

Tôi ngạc nhiên khi không ai chỉ ra một trang web đẹp: http://detectmobilebrowsers.com/ Nó đã sẵn sàng tạo mã bằng các ngôn ngữ khác nhau để phát hiện trên thiết bị di động (bao gồm nhưng không giới hạn):

  • Apache
  • ASP
  • C #
  • IIS
  • JavaScript
  • NGINX
  • PHP
  • Perl
  • Con trăn
  • Đường ray

Và nếu bạn cũng cần phát hiện các máy tính bảng, chỉ cần kiểm tra phần Giới thiệu để biết thêm thông số RegEx.

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.


Đối với tôi nó đang hoạt động, bạn có thể nói cụ thể hơn về việc bạn sử dụng mã nào và dường như là một vấn đề không?
Maksim Luzik

trang đó là phản hồi, tất cả các phản hồi khác là bản sao dán của trang đó
Rubén Ruíz

11

Nếu bạn không đặc biệt lo lắng về màn hình nhỏ, bạn có thể sử dụng tính năng phát hiện chiều rộng / chiều cao. Vì vậy, nếu chiều rộng dưới một kích thước nhất định, trang web di động sẽ bị ném lên. Nó có thể không phải là cách hoàn hảo, nhưng nó có thể sẽ dễ dàng phát hiện nhất cho nhiều thiết bị. Bạn có thể cần phải đặt một cái cụ thể cho iPhone 4 (độ phân giải lớn).


9

Để 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
    mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile','tablet','mobi']; 
    var ua=navigator.userAgent.toLowerCase();
    for (var i in mobile) if (ua.indexOf(mobile[i]) > -1) return true;

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

1
giả định của bạn dựa trên localStorage khá thú vị, bạn có thể cung cấp một loạt các thiết bị hoặc trình duyệt được hỗ trợ phù hợp chính xác với tập lệnh của bạn không? Tôi quan tâm đến việc tìm giải pháp cho câu hỏi này, tôi đã hỏi và cố gắng phát hiện các trình duyệt máy tính bảng di động thực sự có thể là một cách giải quyết thú vị
Gruber

9

Nếu thấy rằng chỉ cần kiểm tra navigator.userAgentkhông phải lúc nào cũng đáng tin cậy. Độ tin cậy cao hơn có thể đạt được bằng cách kiểm tra navigator.platform. Một sửa đổi đơn giản cho câu trả lời trước dường như hoạt động tốt hơn:

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||
   (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) {
    // some code...
}

5
Không được phép hạ thấp một câu trả lời mà không để lại bình luận không được phép. Tốt nhất, nó thật thô lỗ.
Đánh dấu

8

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 JavaScript 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, 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.is_mobile) {
    //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.


Wurfl thất bại trong việc phát hiện nexus7 và iPad mini!
Jacob

Có điều gì đó không đúng về Nexus 7. Bạn có chắc chắn rằng bạn không có Nexus giả mạo chuỗi UA trong cài đặt? Theo như iPad mini có liên quan, vâng, điều đó rất khó phân biệt với các iPad khác, nhưng nó vẫn được công nhận là iPad, phải không? Có phải bạn đã đánh giá thấp bài viết của tôi?
Luca Passani

Không, ipad mini được phát hiện là một thiết bị để bàn
Jacob

7

Kiểm tra bài đăng này , nó cung cấp một đoạn mã thực sự hay để biết phải làm gì khi thiết bị cảm ứng được phát hiện hoặc phải làm gì nếu sự kiện touchstart được gọi:

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

'ontouchstart' in document.documentElementcó lẽ là một thử nghiệm tốt hơn cho hỗ trợ cảm ứng hơn window.Touch. Thậm chí tốt hơn, sử dụng Modernizr.js ( modernizr.com ) vì đã dành rất nhiều suy nghĩ cố gắng để có được cảm ứng phát hiện ngay. Bạn có thể thấy mã phát hiện cảm ứng của họ trong Modernizr.com/doads/modernizr.js nếu bạn xem mã phát triển và tìm kiếm trên "touch".
robocat

3
Phát hiện cảm ứng đã khiến tôi gặp rắc rối, bởi vì một số máy tính xách tay Windows 8 mới phát hiện là màn hình cảm ứng trong Chrome, dẫn đến kết quả kỳ lạ.
JWarner

6

Đây là một chức năng bạn có thể sử dụng để có câu trả lời đúng / sai về việc bạn có đang chạy trên trình duyệt di động hay không. Vâng, đó là trình duyệt đánh hơi, nhưng đôi khi đó chính xác là những gì bạn cần.

function is_mobile() {
    var agents = ['android', 'webos', 'iphone', 'ipad', 'blackberry'];
    for(i in agents) {
        if(navigator.userAgent.match('/'+agents[i]+'/i')) {
            return true;
        }
    }
    return false;
}

1
Điều đó sẽ không phát hiện ra nhiều trình duyệt di động, đặc biệt là Chrome di động. Nó cũng có thể sẽ thất bại trên một số: Opera Mobile, Firefox mobile, Opera Mini, nhiều trình duyệt di động phổ biến khác của Trung Quốc, v.v.
robocat

Bạn không cần forđiều này! + Bạn quên tạo RegExp. Đây là một cách đơn giản hơn:return !!navigator.userAgent.match(new RegExp(agents.join('|'),'i'))
oriadam 2/12/2015

6

Tất cả các câu trả lời đều sử dụng tác nhân người dùng để phát hiện trình duyệt nhưng phát hiện thiết bị dựa trên tác nhân người dùng không phải là giải pháp tốt, tốt hơn là phát hiện các tính năng như thiết bị cảm ứng (trong jQuery mới họ loại bỏ $.browservà sử dụng $.supportthay thế).

Để phát hiện điện thoại di động, bạn có thể kiểm tra các sự kiện chạm:

function is_touch_device() {
  return 'ontouchstart' in window // works on most browsers 
      || 'onmsgesturechange' in window; // works on ie10
}

Lấy từ cách tốt nhất để phát hiện thiết bị 'màn hình cảm ứng' bằng JavaScript?


4
Thật không may, điều này không đáng tin cậy và dù sao nó cũng trở lại truetrên máy tính để bàn có màn hình cảm ứng. stucox.com/blog/you-cant-detect-a-touchscreen
JustAMartin

1
Đừng quên máy tính xách tay với màn hình cảm ứng và trải nghiệm trình duyệt đầy đủ. :-)
Mike Kormendy

đây có thể không phải là cách để kiểm tra xem đó có phải là thiết bị di động hay không nhưng vì tên chức năng của bạn nói rằng nó hoàn hảo để kiểm tra các thiết bị hỗ trợ cảm ứng. +1 từ tôi ;-)
Kathara

6

Tôi sẽ đề nghị sử dụng kết hợp các chuỗi sau đây, để kiểm tra xem loại thiết bị có được sử dụng không.

Theo chuỗi tài liệu MozillaMobi được khuyến nghị. Nhưng, một số máy tính bảng cũ không trả về true nếu chỉ Mobiđược sử dụng, do đó chúng ta cũng nên sử dụng Tabletchuỗi.

Tương tự, để ở bên an toàn iPadiPhonechuỗi cũng có thể được sử dụng để kiểm tra loại thiết bị.

Hầu hết các thiết bị mới sẽ trở lại truecho Mobichuỗi một mình.

if (/Mobi|Tablet|iPad|iPhone/.test(navigator.userAgent)) {
    // do something
}

3
Tôi đã phải thêm "android" vào đó để làm việc trên máy tính bảng. Tôi sẽ phải điều chỉnh nhưng tôi thích cách tiếp cận.
Andy

6

Bạn có thể sử dụng truy vấn phương tiện để có thể xử lý dễ dàng.

isMobile = function(){
    var isMobile = window.matchMedia("only screen and (max-width: 760px)");
    return isMobile.matches ? true : false
}

Tôi thích cách tiếp cận này, tôi window.matchMedia("(pointer:coarse)").matches;từ một câu trả lời khác.
Jason Lydon

6

Câu trả lời tuyệt vời cảm ơn. Cải tiến nhỏ để hỗ trợ Windows phone và Zune:

if (navigator.userAgent.match(/Android/i) ||
  navigator.userAgent.match(/webOS/i) ||
  navigator.userAgent.match(/iPhone/i) ||
  navigator.userAgent.match(/iPad/i) ||
  navigator.userAgent.match(/iPod/i) ||
  navigator.userAgent.match(/BlackBerry/) ||
  navigator.userAgent.match(/Windows Phone/i) ||
  navigator.userAgent.match(/ZuneWP7/i)
) {
  // some code
  self.location = "top.htm";
}

Tôi sẽ nói rằng đây là cách khắc phục đơn giản nhất (có thể không tốt nhất) nếu bạn đang cố xử lý các sự kiện di chuột / kéo cho thiết bị di động. Tôi sử dụng một cái gì đó như thế này để tạo ra một boolean "isMobile" sau đó được kiểm tra cho mọi sự kiện di chuột / di chuột. Đó là hai xu của tôi, dù sao đi nữa. Thêm nhiều thư viện js hoặc mã yêu cầu tương tác người dùng không có ý nghĩa quá lớn đối với tôi; sửa tôi nếu tôi sai
MeanMatt

3
Vì bạn đang sử dụng các biểu thức thông thường, nên thực sự sử dụng chúng:if (navigator.userAgent.match(/Android|webOS|iPhone|iPad|etc/)){self.location = "top.htm"}
foobarbiru

5

Dùng cái này:

/**  * jQuery.browser.mobile (http://detectmobilebrowser.com/)  * jQuery.browser.mobile will be true if the browser is a mobile device  **/ (function(a){jQuery.browser.mobile=/android.+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|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|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|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|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|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);

Sau đó sử dụng:

if(jQuery.browser.mobile)
{
   console.log('You are using a mobile device!');
}
else
{
   console.log('You are not using a mobile device!');
}

5

Chức năng đơn giản dựa trên http://detectmobilebrowser.com/

function isMobile() {
    var a = 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|phone)|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));
}

5
<script>
  function checkIsMobile(){
      if(navigator.userAgent.indexOf("Mobile") > 0){
        return true;
      }else{
        return false;
      }
   }
</script>

Nếu bạn chọn bất kỳ trình duyệt nào và nếu bạn cố gắng lấy navigator.userAgent thì chúng tôi sẽ nhận được thông tin trình duyệt giống như sau

Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit / 537.36 (KHTML, như tắc kè) Chrome / 64.0.3282.186 Safari / 537.36

Điều tương tự nếu bạn làm trong điện thoại di động, bạn sẽ nhận được theo dõi

Mozilla / 5.0 (Linux; Android 8.1.0; Pixel Build / OPP6.171019.012) AppleWebKit / 537.36 (KHTML, như Gecko) Chrome / 61.0.3163.98 Mobile Safari / 537.36

Mọi trình duyệt trên thiết bị di động sẽ có người dùng với chuỗi chứa "Di động" Vì vậy, tôi đang sử dụng đoạn mã trên trong mã của mình để kiểm tra xem tác nhân người dùng hiện tại có phải là web / di động hay không. Dựa trên kết quả tôi sẽ thực hiện các thay đổi cần thiết.


4

Tôi dùng cái này

if(navigator.userAgent.search("mobile")>0 ){
         do something here
}

4

Làm thế nào về mobiledetect.net ?

Các giải pháp khác có vẻ quá cơ bản. Đây là một lớp PHP nhẹ. Nó sử dụng chuỗi User-Agent kết hợp với các tiêu đề HTTP cụ thể để phát hiện môi trường di động. Bạn cũng có thể hưởng lợi từ Phát hiện di động bằng cách sử dụng bất kỳ plugin nào của bên thứ 3 có sẵn cho: WordPress, Drupal, Joomla, Magento, v.v.


Bởi vì câu hỏi yêu cầu cho jQuery?
Craicerjack

3

Chuỗi tác nhân người dùng không nên được tin cậy một mình. Giải pháp dưới đây sẽ hoạt động trong mọi tình huống.

function isMobile(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)));
}

và gọi chức năng này:

isMobile(navigator.userAgent || navigator.vendor || window.opera)
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.