Bir mobil tarayıcı algılama


888

Kullanıcının mobil tarayıcısı olup olmadığı boolean değeri döndüren bir işlev arıyorum.

navigator.userAgentRegex kullanarak bu işlevi kullanabileceğimi ve yazabileceğimi biliyorum , ancak kullanıcı aracıları farklı platformlar için çok çeşitli. Mümkün olan tüm cihazlarla eşleşmenin kolay olacağından şüpheliyim ve bence bu problem birçok kez çözüldü, bu yüzden bu tür bir görev için bir çeşit komple çözüm olmalı.

Bu siteye bakıyordum , ama ne yazık ki senaryo o kadar şifreli ki, amacım için nasıl kullanılacağına dair hiçbir fikrim yok, bu da doğru / yanlış döndüren bir işlev yaratmak.



2
Bunu okumaya çalışın. stackoverflow.com/questions/743129/…
KyelJmD

5
@Thrustmaster: Gerçekten olmazdı. Farklı tarayıcılara farklı JS sunmak Vary: User-Agent, yanıtınıza eklemeniz gerektiği anlamına gelir , aksi takdirde önbellek proxy'leri bir sürümü depolar ve başka bir tarayıcıya gönderir. Ancak Vary: User-AgentIE'de yanıtı erişilemez hale getirir.
bobince

17
@ave: "Mobil" bir tarayıcı algılayarak ne yapmaya çalışıyorsunuz? Bu ayrım günümüzün tabletler ve hibrit hesaplama cihazları dünyasında tartışmalıdır. Küçük ekranları tespit etmek ve bu durumda farklı bir kullanıcı arayüzü sunmak mı istiyorsunuz? Düşük bant genişliği bağlantısını mı arıyorsunuz? Dokunmatik arayüzleri mi arıyorsunuz?
bobince

2
Bu yüzden, detmobilebrowsers.com javascript yöntemini kullanmak için cevabımı güncelledim ancak hala buna ihtiyaç duyan bir Boole değeri döndürdüm. ( her ihtimale karşı ). Mutlu Algılama :)
Michael Zaporozhets

Yanıtlar:


1317

Regex kullanma ( Detectmobilebrowsers.com'dan ):

Burada , kullanıcının bir mobil cihazla gezinip gezinmediğine bağlı olarak bir trueveya falsedeğer döndüren çılgınca uzun ve kapsamlı bir normal ifade kullanan bir işlev var .

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

Bu teste tabletleri dahil etmek isteyenler için (tartışmasız olsa da, yapmamalısınız), aşağıdaki işlevi kullanabilirsiniz:

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

Orijinal Cevap

Bunu, bir cihaz listesi üzerinden çalışarak ve useragenteşleşmelerin böyle bir şey olup olmadığını kontrol ederek yapabilirsiniz :

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

Bununla birlikte, bu yöntemin güvenilir olmadığına inandığınızdan, 800x600 veya daha düşük bir çözünürlüğe sahip herhangi bir cihazın da bir mobil cihaz olduğunu varsayarak hedefinizi daha da daraltabilirsiniz (bu günlerde birçok mobil cihazın bundan daha büyük çözünürlükleri olmasına rağmen)

yani

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

Referans:


25
Merhaba , iPad 3, iOS 6.1.2'deki tespitmobilbrowsers.com bağlantısını yeni ziyaret ettim ve "Mobil tarayıcı algılanmadı" diyor.
Richard Lovejoy

49
@RichardLovejoy site oluştururken, ipad genellikle mobil olarak kabul edilmez.
Michael Zaporozhets

42
Gönderen yaklaşık sayfa: Android tablet, iPad, Kindle Yangınlar ve Playbooks tasarım gereği algılanmaz. Tabletler için destek eklemek |android|ipad|playbook|silkiçin ilk normal ifadeye ekleyin .
Gras Double

13
Google TV de Android. Cep telefonunu ne tanımlar? Ekran boyutu ? Dokunma ? cihazOrientation? Ben tasarım daha mousehover veya değil, büyük yaka veya küçük bağlantılar bir soru. Yani, şimdilik, "if (Modernizr.touch)" ile
koşuyorum

31
Gawd, bu tüm kullanıcı aracıları fikri korkunç ve gerçekten, gerçekten durması gerekiyor. Müşterilerin gelgite karşı savaşmasına ve sadece medya sorgularına bağlı kalmasına izin vermemizi gerçekten bırakmalıyız. Belirli sayfalar için ölçeğe göre yönlendirmeler yapmak istiyorlarsa, JS aracılığıyla belirli bir medya sorgusunun aralığını kontrol edin, yani tylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

Nasıl olur:

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

... akıllı telefonlar genellikle bu özelliği desteklediğinden ve masaüstü tarayıcıları desteklemediğinden.

DÜZENLEME: @Gajus'un belirttiği gibi, bu çözüm artık kullanımdan kaldırılmıştır ve kullanılmamalıdır ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
Bu gerçekten süper benzersiz ve harika, cevabımı eklersem sakıncası var mı?
Michael Zaporozhets

77
Bu muhtemelen uzun sürmeyecek. 1) Tabletler iyi ekran boyutlarına sahip olabilir, tam masaüstü web sitesini görüntülemelerini istiyorsunuz, ancak bu özelliğe sahip olacaklar 2) Windows 8 burada ve onunla birlikte dokunmatik ekranlı ve dönen ekranlı bir grup dizüstü bilgisayar.
Dave Hilditch

10
iyi ekran boyutları ile Tabletler hakkında ilk noktanıza gelince-Bence diğer tüm çözümler için de aynı argümanlar yapabilirsiniz (küçük ekran olarak izlenen büyük ekrana sahip bir tablet). her neyse, burada fikir, uzun kod saklamak yerine yeni cihazlar tarafından paylaşılan mülkleri aramak ve yeni gelen her cihaz / vesion / model ile normal ifade eklemek. Cihaz algılamanın geçmişe ait olduğunu düşünüyorum ve bugün özellik algılamaya odaklanmamız gerekiyor. yine burada bu konuda daha uygun özellik hakkında memnun olacak ...
yoav barnea

2
Sevin ve mükemmel çalışıyor, teşekkür ederim. Benim çözümüm için hemen peşindeydim.
Bojangles

40
window.orientationbazı mobil tarayıcıların bilinmeyen nedenlerle desteklemeyi seçtiği , kullanımdan kaldırılmış bir mülktür ( developer.mozilla.org/tr-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation ). . Aynı tarayıcılar uygulanır window.screen.orientation(masaüstü tarayıcılarda da tanımlanır). Sadece window.orientationeski nedenlerle orada kaldığını ve bu nedenle yeni uygulamalarda kullanılmaması gerektiğini varsayabilirim .
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());
    }
};

Nasıl kullanılır

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

Kullanıcının belirli bir mobil cihazda olup olmadığını kontrol etmek için:

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

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

Github'da geliştirilmiş sürüm: https://github.com/smali-kazmi/detect-mobile-browser


Neden any()ORed isMobileüyelerinde bir ... for döngüsü oluşturmuyorsunuz ?
SomeShinyObject

@ChristopherW
Tavsiye

2
Belki de daha yaygın olanları ilk sıraya koymak ve erken kurtarma işleminin fazladan işlemden tasarruf etmesini sağlamak için iOS'u BlackBerry'nin () önüne taşıyın?
Rob_vH

2
@Rob_vH i bazı özellikleri ile github ( github.com/smali-kazmi/detect-mobile-browser ) içine bu kodu koymuştu ; orada da öneri gönderebilirsiniz
Mudaser Ali

1
@AkarshSatija Bu 5 normal ifade kontrolünden gelen performans düşüşü, uygulamalarınızdan herhangi birini gerçekten etkiliyor mu? Olsaydı çok şaşırırdım. Erken optimizasyon zaman kaybı olabilir ...
trusktr

68

İşte facebook sapan kaynağından basit bir çözüm

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

Güzel. Bazı durumlarda çok yararlı
Chuck Le Butt

Bir mobil uygulamanın yüklenebileceği bir cihazın algılanması durumunda kullanışlıdır. Tarayıcıyı umursamazsınız. Sadece cihaz / işletim sistemi.
Charlie Reitzel

30

Mobil ve tablet olarak sınıfladığım "dokunmatik ekranlı cihazları" tespit etmek için basit ve temiz bir yol bulmak için buraya geldim. Mevcut cevaplarda temiz bir seçim bulamadım, ancak birisine de yardımcı olabilecek aşağıdakileri yaptı.

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

Düzenleme : Dokunmatik ekranı ve cep telefonlarını aynı anda desteklemek için aşağıdakileri kullanabilirsiniz:

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

9
Masaüstü monitörü dokunmayı destekliyorsa ne olur?
Anton Kuzmin

@HappyCoder Bir masaüstündeki dokunmatik ekran etkin olduğunda tarayıcıya bildirmenin işletim sistemine bağlı olduğuna inanıyorum. Evet, bu kontrol hala geçerli olmalı.
Tigger

(+1) Ancak, kullandığım masaüstüm artık bir touchScreen'e sahip ve her zaman tutarlı değil touchstart|end|etc.
Cody

1
Bootstrap tarih seçici aşağıdakileri kullanır: if (belgede window.navigator.msMaxTouchPoints || 'ontouchstart') {this.input.blur (); }
JT Taylor

1
Microsoft, bir benzeri @JTTaylor görünüyor öneren navigator.maxTouchPoints (hiçbir msönek). Kontrol edilecek bir MDN makalesi de var .
Tigger

20

Birçoğunun belirttiği gibi, kullanıcı aracısı verilerinin hareketli hedefine güvenmek sorunludur. Aynı şey ekran boyutuna saymak için de söylenebilir.

Arayüzümün dokunup dokunmadığını belirlemek için yaklaşımım bir CSS tekniğinden ödünç alındı :

Yalnızca javascript (tüm modern tarayıcılar tarafından desteklenir) kullanılarak, bir medya sorgu eşleşmesi cihazın mobil olup olmadığını kolayca belirleyebilir .

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

6
Dokunmatik ekranlı dizüstü bilgisayarlara ne dersiniz?
Maxim

6
! MatchMedia ("(any-pointer: fine)"). İle eşleşir. ("Dokunmatik fare yok" yerine "Fare takılı değil"
Sora2455

Bu, son komut dosyamın tarayıcının zum özelliğini kullanan kişiler tarafından kandırılır (örneğin, 1080p'ye düşen ve hala zum kullanmak zorunda kalan 4K ile 13 inçlik bir ekranda konuştuğum bir adam). Firefox) ve Android cihazları (Waterfox / Chrome / "Tarayıcı") Kesinlikle daha yüksek oy kullanan tüm cevaplardan çok daha güvenilir
John

navigator.userAgent.toLowerCase (). indexOf ('fennec')> -1 (belki de en iyi ek değil) ile desteklediğim bir Android'de FireFox rezene'yi algılamıyor
StayCool

2
Ayrıca hover özelliğini test edebilirsiniz: akıllı telefonlar ve dokunmatik ekranlar için @media (vurgulu: hiçbiri) ve (işaretçi: kaba)
Batailley

16

MDN'nin kullanıcı aracısını kullanarak Tarayıcı algılama hakkındaki makalesine göre, mümkünse bu yaklaşımdan kaçınılması ve özellik algılama gibi diğer yollar önerilmesi önerilir.

Bununla birlikte, cihazın mobil olup olmadığını tespit etmek için kullanıcı aracısını bir araç olarak kullanması gerekiyorsa, şunları önerirler:

Özetle, bir mobil cihazı algılamak için Kullanıcı Aracısının herhangi bir yerinde “Mobi” dizesini aramanızı öneririz.

Bu nedenle, bu tek astar yeterli olacaktır:

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

[GÜNCELLEME]:

@ Zenw0lf'nin yorumlarda belirttiği gibi, Normal İfade kullanmak daha iyi olurdu:

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


.includesIE-11 tarafından sopport değil
Pasha Oleynik

1
@PashaOleynik bir çoklu dolgu bunu düzeltebilir
Maxim

Android ile Nexus 7 tablet Mobile, kullanıcı aracısı dizesinde yok
Alex Sorokoletov

@AlexSorokoletov Ayrıca MDN makalesi içinIf 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
Bunun const isMobile = /Mobi/.test(window.navigator.userAgent)
çoklu dolgular

14

JS kodunun bir mobil tarayıcıda yürütülüp yürütülmediğini tespit etmek için mükemmel bir çözüm yoktur, ancak aşağıdaki iki seçeneğin çoğu durumda çalışması gerekir.

1.Seçenek: Tarayıcı koklama

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

Bu tarayıcı koklama kodu, isMobile adlı bir kütüphanenin kodudur .


Seçenek 2: Pencere. Yönlendirme

window.orientationTanımlanıp tanımlanmadığını test edin :

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


Not

Tüm dokunmatik ekranlı cihazlar mobil değildir ve tersi de geçerlidir. Bu nedenle, özellikle dokunmatik ekran için bir şey uygulamak istiyorsanız, tarayıcınızın bir mobil cihazda çalışıp çalışmadığını test etmemelisiniz, bunun yerine cihazlarda dokunmatik ekran desteği olup olmadığını test etmelisiniz:

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


Oryantasyon yaklaşımı gerçekten güzel! ))
Maxim

1
window.orientationÇözümünüzü beğendim , ancak dokümanlar kullanımdan kaldırıldığını söylüyor! developer.mozilla.org/tr-TR/docs/Web/API/Window/orientation
skwidbreth

3
Yönlendirme yaklaşımı hoş DEĞİLDİR çünkü Windows 8 ve sonraki sürümler yön değiştirebilir.
Heitor

Windows 8 ve daha yeni sürümler, cep telefonları için destek eklemeye odaklanmıştır, ancak melezler (büyük pedlere dönüşebilen dizüstü bilgisayarlar) da bu nedenle, moz kullanımdan kaldırılmış olarak söz etmese bile yönlendirme bir algılama yöntemi olarak başarısız olur.
Jeff Clayton

Yüklü Grafik Yazılımı ile Win 7'den yönünü değiştirebilir, ancak kendinize bir soru sorabilirsiniz, Masaüstünde / Dizüstü bilgisayarda Yatay yerine Dikey gibi başka bir ekran yönlendirmesi kullanabilir ve 1 dakikadan daha uzun süre i kullanabilir. Hiç kimse !!! Masaüstünde yönün değiştirilmesi, ekranınızdaki karakterleri aşağıdan yukarıya doğru okumaya başlayacağınız anlamına gelir.
GirlCode

11

İşte maçtan daha verimli bir userAgent çözümü ...

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
test yöntemi büyük / küçük harfe duyarlı değildir, ancak normal ifadeniz doğrudur. sadece sonunda "i" ile büyük / küçük harfe duyarsız regex için işaretleyebilir ve/iphone|etc/i.test(navigator.userAgent)
xec

11

Ek bir denetim katmanı eklemek için HTML5 depolama alanını mobil depolama veya masaüstü depolama kullanıp kullanmadığını tespit etmek için kullanıyorum. Tarayıcı depolamayı desteklemiyorsa, bir dizi mobil tarayıcı ismim var ve kullanıcı aracısını dizideki tarayıcılarla karşılaştırıyorum.

Oldukça basit. İşte işlevi:

// 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
Henüz mobil cihazlarda test etmedim, ancak sessionStorage.desktopSafari, Chrome veya Firefox'ta (yayınlama sırasındaki en yeni sürümlerin tümü) mevcut değil. Ancak çözümünüz diğerlerinden daha iyi bir yöne gittiğinden yukarı oy alırsınız. Ama var mobile =bunun yerine kullanmayı unutma mobile =.
shuckster

3
Ayrıca, hala bu yöntemi desteklemeyen eski tarayıcılarla indexOf'u kullanmamak veya çok amaçlı bir dolgu kullanmak iyi bir fikirdir. Küçük harf değerleri listesinde toLowerCase kullanmanız veya orada yavaş döngü yerine /ipad|iphone|etc/i.test(navigator.userAgent) çalıştırmanız gerekli değildir.
Jeffrey Gilbert

10

Özellik algılama, hangi cihazı kullandığınızı anlamaya çalışmaktan çok daha iyidir ve her zaman çıkan yeni cihazlara ayak uydurmak çok zordur, Modernizr gibi bir kütüphane belirli bir özelliğin mevcut olup olmadığını size bildirir.


18
Sorulandan başka bir soruyu cevapladınız. "Mobil cihazı nasıl algılayabilirim?" Yerine "belirli özellikleri nasıl algılayabilirim?" Yanıtını verdiniz. Tüm cihaz algılama özellik algılama için değildir. Cihazlar hakkında istatistik almak istiyorsak ne olur? O zaman hayır, "özellik algılama" "[cihazı bulmak] 'dan daha iyi değildir.
Jonathan Allard

1
Bu cevap değil, sadece bir yorumdan daha fazlasını hak ediyor. Soru şu: Neden bir tarayıcı algılamak istiyorsunuz ve muhtemelen sadece (dokunma) dokunuşu nedeniyle bilmek isteyeceksiniz. Duyarlı web tasarımı çoğu durumda olmasa bile çoğu zaman yeterlidir.
twicejr

8

Böyle bir şeye ne dersin?

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

Neden sadece kullanmıyorsunuz screen.width? Bana göre bu daha güvenilir window.matchMedia.
John Slegers

İyi bir nokta John, o sırada ne düşündüğümü tam olarak hatırlayamıyorum, birincisi yanlışsa ikinci maddenin doğru dönmesi pek olası görünmüyor. Yine de eklediğim bir sebep olmalı.
stujo

Çoğu iyi programcı, bir yıl önce yazdıkları kodu gördüklerinde utanıyorlar. Sadece programcı olarak
büyüyemeyenler

4
Pencere çözünürlüğünün, tarayıcının mobil bir cihazda olup olmadığıyla hiçbir ilgisi yoktur. Örneğin, birçok masaüstü tarayıcısı tam ekran olmayan pencerelerde çalışır. Bu tarayıcılara elde taşınabilir ekranlar için tasarlanmış bir kullanıcı arayüzü sunarsanız, kullanıcılarının sinir bozucu bir deneyimi olacaktır.
ɈsәɹoɈ

1
@JohnSlegers - Çoğunlukla bir soru sormaya ve stackoverflow ile ilgili kendi cevabımı bulmaya utanıyorum. tekrar ve tekrar. Ben kendimi sabit bir yığın taşması yaşıyorum
vsync

7

Öğe odaklandıktan sonra hemen bulanıklaştırırsınız. GitHub'da yaklaşık 10.000 yıldız bulunan çok popüler ve bakımlı bir bileşen olan Bootstrap-datepicker, bu yaklaşımı kullanır:

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

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

Yardım için Tigger'e teşekkürler .


7

Mobil veya tablet cihazları tespit etmenin gerçekten iyi bir yolu, tarayıcının bir dokunma etkinliği oluşturup oluşturamayacağına bakmaktır.

Düz JavaScript Kodu:

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

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

Bu benim için gerçekten işe yaradı, ancak dokunmatik ekran içeren dizüstü bilgisayar cihazlarında bir sorun olabilir.

Dokunmatik ekranlı bir dizüstü bilgisayarın mobil cihaz olarak algılanıp algılanmayacağından emin değilim, çünkü henüz test etmedim.


5
Dokunmatik ekranlı dizüstü bilgisayarlar mobil cihaz olarak algılanacaktır. Masaüstü bilgisayarlar için dokunmatik ekranlı monitörlerin yanı sıra. İster inanın ister inanmayın, dokunmatik ekranı olmayan başka bir cihaza RDP için dokunmatik ekranlı cihaz kullanıyorsanız da sorun yaşarsınız.
blissfool

@blissfool Sanırım bu mobil cihazları tespit etmek için doğru yol olmayacak.
Neo Morina

Ne yazık ki hayır. Ancak, yine de çok sınırlı bir kullanım durumu için uygun bir seçenek olabilir.
blissfool

her durumda kesin olarak atılacak bir istisnayı temel alan kod yazmayın ...
Pablo

@Sivic, yalnızca bir TouchEvent olmadığında atılır ve yukarıdaki kod onu yakalar ve false değerini döndürür. Mobil veya Tablet veya diğer Dokunmatik Ekranlı cihazlarda durum böyle değildir.
Neo Morina

5

İşte benim sorun için yeniden düşünülmüş çözüm. Hala mükemmel değil. Tek gerçek çözüm, cihaz üreticilerinin "Mobil" ve "Tablet" kullanıcı aracısı dizelerini ciddiye almaya başlamasıdır.

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

Nexus 7 tabletinde yalnızca Android UA dizesi olduğunda ne olur? İlk olarak, Mobil gerçekleşir, daha sonra Tablette daha sonra gerçek olur, ancak Tablet Mobil UA dizesini vücut etiketinden siler.

CSS:

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

alertgeliştirme için satırlar eklendi. Chrome konsolu birçok mobil cihazı taklit edebilir. Orada test edin.

DÜZENLE:

Bunu kullanmayın, bunun yerine özellik algılamayı kullanın. Orada o kadar çok cihaz ve marka var ki, bir markayı HİÇBİR hedeflemek doğru çözüm olacaktır.


4

Http://wurfl.io/ adresini kontrol etmenizi öneririm.

Özetle, küçük bir JS dosyasını içe aktarırsanız:

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

şuna benzer bir JSON nesnesi kalacak:

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

(bu elbette bir Nexus 7 kullandığınızı varsayar) ve aşağıdakileri yapabilirsiniz:

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

Aradığın şey bu.

Feragatname: Bu ücretsiz hizmeti sunan şirket için çalışıyorum. Teşekkürler.


1
Ve nasıl bu iphone safari tanımıyor?
Amyth

Hangi tarayıcıyı kullandığınızı (tam UA dizesi mükemmel olurdu), hangi verileri elde edeceğinizi ve ne beklediğinizi genişletebilir misiniz?
Luca Passani

Ben de wurfl denedim, IOS 11.2 çalıştıran bir iPhone 5C kullanıyorum. Safari'yi mobil tarayıcı olarak tanımıyor. "İs_mobile": true ve sonra "form_factor": Smartphone ve ya da dönen değil kullanmayı umuyorum.
Mike Wells

Şirketteki Mobil Veri gurularına dönmeliydim ve bana OS 11.2'nin 5C'de çalışmadığını söylüyorlar. En düşük cihaz 5S'dir. Yani yazdıklarınızda bir şeyler doğru değil. Bağlantıyı kesmenin nerede olabileceğini doğrulamak için ScientiaMobile çevrimdışı ile iletişime geçmekten çekinmeyin. Teşekkürler
Luca Passani

4

heres bir astar

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

3

Kullanım durumuna bağlıdır. Tüm mobil cihazlar için pil gerekir. Eğer peşinde olduğunuz şey pili tüketmeden hesaplama gücü ise Pil Durumu API'sını kullanın :

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

Aradığınız şey matchMediabir Boole değeri döndüren sunum amaçlı kullanımsa :

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

Veya tablet cihazlarda daha da iyi bir kullanıcı deneyimi için bunları birleştirin.


Pil Durumu API'sının tarayıcılardan kaldırıldığını unutmayın.
Sora2455

Pil Durumu API'sı Firefox'tan kaldırıldı, ancak Temmuz 2016'dan beri bir W3C Aday Önerisi olarak kalıyor , popüler tarayıcılarda çalışmaya devam ediyor ve deneyim şekillendirmede faydalı .
Josh Habdas

2

İşte bir ECMAScript 6 çözümü (TypeScript için hazır)

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

Neden ifbu checkdeğişkenin tamamını kullanmak yerine koşulu döndürmüyorsunuz ?
Vic

2

Mobil bir cihaz olup olmadığını tespit etmek için basit bir numara var. Ontouchstart olayının mevcut olup olmadığını kontrol edin :

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

3
Dokunmatik ekranlı dizüstü bilgisayarlar ve masaüstü bilgisayarlar ile çalışmaz. Ayrıca Surface gibi hibrid pc'lerle ilgili bir sorun olacak. Masaüstü bilgisayarlarda daha az sorun var ama bu günlerde daha fazla dokunmatik ekranlı dizüstü bilgisayar satılıyor.
blissfool

2

Yukarıdaki cevapların benim için işe yaradığı bazı senaryolarla karşılaştım. Ben de bunu buldum. Birine yardımcı olabilir.

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

Kullanım durumunuza bağlıdır. Ekran kullanımına odaklanırsanız screen.availWidthveya document.body.clientWidthbelgeye dayalı olarak oluşturmak istiyorsanız kullanabilirsiniz.


1

En iyisi şöyle olmalıdır:

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

Ama Yoav Barnea'nın dediği gibi ...

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

Bu 3 testten sonra, umarım var isMobile ... tamam


> Android'de Firefox
Mobile'ın

1
Üzgünüm .. tamam benim için şimdi böyle iyi çalışıyor. "if (Modernizr.touch) / * ... * /" ve devam et ...
molokoloco

Sadece bir dokunmatik ekran masaüstü cihazında Modernizr.touch'un nasıl çalışacağını merak ediyorum.
B2K

Daha zarif hale getirmek için tüm te kodunu bir if-else if-else if bloğunda yapmanız gerekir.
Heitor

1

İşte tam işlevi

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) ilk 4 harfi döndürür. "Android. + Mobile" nasıl algılanır?
raacer

1
@raacer aslında cevapta iki regex (her ikisi de aynı satırda) var - birincisi tüm UA dizesine karşı kontrol ediyor ve android, mobil vb. .
JackW

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

ayrıca belirli bir mobil cihazı tespit etmek için bu eğiticiyi takip edebilirsiniz. Click burada .


Ekleyiniz Mobilesizin RX
oriadam

1

"window.screen.width" kullanmaya ne dersiniz?

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

veya

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

Sanırım bu en iyi yol çünkü her gün yeni bir mobil cihaz var!

(eski tarayıcılarda desteklenmediğini düşünüyorum, ancak deneyin :)


1
Peyzaj hakkında ne düşünüyorsunuz?
Erick Voodoo

1
Bu, belirli senaryolar için çok yararlı değildir. Masaüstü tarayıcı yeniden boyutlandırılırsa, mobil tarayıcı olarak yanlış algılanabilir
toing_toing

Bir PC aslında kullanılabilirlik, korkunç cevap mobil cihazlardan farklı !!
Heitor

1

Çoğu yeni nesil mobil cihazın artık 600x400'den daha yüksek çözünürlüklere sahip olduğunu unutmayın. yani, bir iPhone 6 ....

Test kanıtı: en çok oylanan ve en son yayınları burada çalıştırdı, isteğe bağlı bir kez kontrol şu şekilde çalıştırıldı:

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

Her nasılsa, aşağıdaki sonuçlar aşağıdaki Tarayıcı Uygulamalarında döndürüldü. Özellikler: iPhone 6S, iOS 10.3.1.

Safari (en yeni): Mobil olarak algılandı.

Chrome (en yeni): Mobil olarak algılamadı.

SO, daha sonra Lanti'den ( https://stackoverflow.com/a/31864119/7183483 ) öneriyi test ettim ve uygun sonuçları (tüm iOS cihazları için mobil ve Mac'im için masaüstü) döndürdü. Bu nedenle, iki kez (hem mobil hem de Tablet için) ateş edeceği için biraz düzenlemeye devam ettim. Daha sonra bir iPad'de test ederken, mobil olarak da döndüğünü fark ettim, bu da mantıklıydı, çünkü Lanti'nin Parametrelerikullanır işletim sistemi her şeyden daha fazla. Bu nedenle, tablet IF deyimini mobil çekin içine taşıdım, bu da mobil dönecekti Tablet kontrolünün negatif olduğu ve aksi halde tablet. Daha sonra, mobil çekin masaüstü / dizüstü bilgisayar olarak geri dönmesi için başka bir hüküm ekledim, çünkü her ikisi de hak kazanıyor, ancak tarayıcının CPU ve OS markasını algıladığını fark ettim. Yani ben orada ifade başka yerine bir parçası olarak döndürülen ekledi. Bunu kapatmak için, hiçbir şey algılanmadığı takdirde başka bir uyarıcı ifade ekledim. Aşağıya bakın, yakında Windows 10 bilgisayarında bir testle güncellenecek.

Oh ve ben de kolayca hata ayıklama ve normal derleme arasında geçiş yapmak için bir 'debugMode' değişkeni ekledi.

Dislaimer: Tam kredi Lanti OS saf, Windows olduğundan, masaüstü / dizüstü döndürebilir de bu, Windows Tablet üzerinde test edilmediğini, .... Birini kullanan bir arkadaş bulduktan sonra kontrol edecektir.

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

Bu, projemde kullandığım kabul edilen cevabın sadece bir es6 portu . Bunun tabletleri de içerdiğini unutmayın.

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

Buna ne dersin, yukarıdaki cevaba göre genişliyor ancak ekran boyutunu da kontrol ediyor


1

Regex kullanma ( Detectmobilebrowsers.com'dan ):

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

Bu da bir çözüm olabilir.

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

Her iki yöntemi de kullanırsanız, farklı cihazları tespit etmek için mükemmel bir yol elde edersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.