你的位置:首页 > 软件开发 > Java > javascript: detect mobile devices or browser

javascript: detect mobile devices or browser

发布时间:2015-10-29 14:00:33
http://detectmobilebrowsers.com/http://hgoebl.github.io/mobile-detect.js/http://www.hand-interactive.com/resources/detect-mobile-javascript. ...

http://detectmobilebrowsers.com/

http://hgoebl.github.io/mobile-detect.js/

http://www.hand-interactive.com/resources/detect-mobile-javascript.htm

https://github.com/danielpoe/DeviceDetection/blob/master/src/devicedetection.js

http://jstricks.com/detect-mobile-devices-javascript-jquery/

https://www.npmjs.com/package/mobile-detect

http://mobiledetect.net/

https://github.com/hgoebl/mobile-detect.js/

Device detection (phone, tablet, desktop, mobile grade, os, versions)

MobileDetectSpec.js

/*global MobileDetect:true, mobilePerVendor:true, describe:false, it:false, expect:false, beforeEach:false, afterEach:false, xdescribe:false*//*jshint node:true, browser:true*/"use strict";// handle stand-alone node testsvar MobileDetect = MobileDetect || require('../../mobile-detect.js'),  mobilePerVendor = mobilePerVendor || require('../data/user-agents.js'),  matchers;function createMatcher(type) {  return function (expected) {    var md = this.actual;    this.message = function () {      var additionalInfo = [];      if (md.nr) {        additionalInfo.push('nr=' + md.nr);      }      if (!expected) {        additionalInfo.push('returned "' + md[type]() + '"');      }      if (additionalInfo.length) {        additionalInfo.push('');      }      return "Expected device" + (expected ? " " : " not ") + "to be " +        type + " (" + additionalInfo.join(', ') + md.ua + ")";    };    return (md[type]() !== null) === expected;  };}matchers = {  toBeMobile: createMatcher('mobile'),  toBePhone: createMatcher('phone'),  toBeTablet: createMatcher('tablet')};beforeEach(function () {  this.addMatchers(matchers);});describe("MobileDetect (1 example)", function() {  var aut;  beforeEach(function() {    aut = new MobileDetect('Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i Build/4.1.A.0.562)' +      ' AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', -1);  });  it("should detect OS", function() {    expect(aut.os()).toEqual('AndroidOS');  });  it("should extract mobile/phone/tablet device", function () {    expect(aut.mobile()).toEqual('Sony');    expect(aut.phone()).toEqual('Sony');    expect(aut.tablet()).toBeNull();  });  it("should rank mobile grade", function () {    expect(aut.mobileGrade()).toEqual('A');  });  it("should find out userAgent", function () {    expect(aut.userAgent()).toEqual('Safari');  });  it("should extract correct versions", function () {    expect(aut.version('Android')).toBeCloseTo(4.03, 3);    expect(aut.version('Build')).toBeCloseTo(4.10562, 7);    expect(aut.version('Safari')).toBe(4);    expect(aut.version('MSIE')).toBeNaN();    expect(aut.version('MSIE') >= 7.0).toBeFalsy();    expect(aut.version('MSIE') < 7.0).toBeFalsy();  });  it("should extract correct version strings", function () {    expect(aut.versionStr('Android')).toBe('4.0.3');    expect(aut.versionStr('Build')).toBe('4.1.A.0.562');    expect(aut.versionStr('Safari')).toBe('4.0');    expect(aut.versionStr('MSIE')).toBeNull();  });  it("should answer generic queries", function () {    expect(aut.is('sony')).toBe(true);    expect(aut.is('iPhone')).toBe(false);    expect(aut.is('safari')).toBe(true);    expect(aut.is('androidOS')).toBe(true);  });  it("should find raw case-insensitive matches", function () {    expect(aut.match("mt1.i")).toBe(true);    expect(aut.match("linux")).toBe(true);    expect(aut.match("playstation|nintendo|xbox")).toBe(false);  });  it("should run phone size", function () {    expect(aut.isPhoneSized(-1)).toBeUndefined();    if (typeof window !== 'undefined') {      expect(aut.isPhoneSized(320)).toBe(false);      expect(aut.isPhoneSized(9999)).toBe(true);    }  });});describe("Fixing issues", function () {  it("should fix issue #1", function () {    var aut = new MobileDetect('Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SPH-L710 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', -1);    expect(aut).toBeMobile(true);  });  it("should fix issue #2", function () {    var aut = new MobileDetect(); // userAgent is undefined    expect(aut).toBeMobile(false);    expect(aut).toBePhone(false);    expect(aut).toBeTablet(false);    expect(aut.mobileGrade()).toBe('C');    expect(aut.version('MSIE')).toBeNaN();    expect(aut.version('MSIE') >= 7.0).toBeFalsy();    expect(aut.version('MSIE') < 7.0).toBeFalsy();    expect(aut.versionStr('MSIE')).toBeNull();    expect(aut.isPhoneSized()).toBeFalsy();    expect(aut.match(/xbox/i)).toBeFalsy();  });  it("should fix issue #5", function () {    var aut = new MobileDetect('Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36', -1);    expect(aut).toBePhone(false);    expect(aut).toBeTablet(true);    expect(aut).toBeMobile(true);  });  it("should fix issue #15", function () {    var aut = new MobileDetect('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537', -1);    expect(aut.os()).toEqual('WindowsPhoneOS');  });  it("should fix issue #28", function () {    var aut = new MobileDetect('Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; foo Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko)', -1);    expect(aut).toBePhone(false);    expect(aut).toBeTablet(true);    expect(aut).toBeMobile(true);    expect(aut.tablet()).toBe('UnknownTablet');  });  it("should fix issue #34", function () {    var aut = new MobileDetect('SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)', -1);    expect(aut.is('Bot')).toBe(true);    expect(aut.is('MobileBot')).toBe(true);  });  it("should fix issue #36", function () {    var aut = new MobileDetect('Mozilla/5.0 (Linux; U; Android 4.1.2; zh-CN; HUAWEI C8815 Build/HuaweiC8815) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.7.0.634 U3/0.8.0 Mobile Safari/534.30', -1);    expect(aut.userAgents()).toEqual(['Safari', 'UCBrowser']);    expect(aut.is('UCBrowser')).toBe(true);    expect(aut.is('Safari')).toBe(true);  });  //});describe("Extensibility", function () {  var origImpl, origSony;  function copyProps(src, dest) {    Object.keys(src).forEach(function (key) {      dest[key] = src[key];    });    return dest;  }  beforeEach(function () {    origImpl = copyProps(MobileDetect._impl, {});    origSony = origImpl.mobileDetectRules.phones.Sony;  });  afterEach(function () {    copyProps(origImpl, MobileDetect._impl);    origImpl.mobileDetectRules.phones.Sony = origSony;  });  it("should make internal 'prepareDetectionCache' possible to delegate", function () {    var aut, UA = 'Mozilla/5.0 (Mobile; iPhone OS 7_0_3',      oldPrepareDetectionCache = MobileDetect._impl.prepareDetectionCache;    aut = new MobileDetect(UA);    expect(aut.phone()).toBe('iPhone');    MobileDetect._impl.prepareDetectionCache = function (cache, userAgent, maxPhoneWidth) {      oldPrepareDetectionCache(cache, userAgent, maxPhoneWidth);      // ...      // there would obviously be some logic at this point      // ...      cache.phone = 'MySpecialPhone';    };    aut = new MobileDetect(UA);    expect(aut.phone()).toBe('MySpecialPhone');    // turning back to original implementation    MobileDetect._impl.prepareDetectionCache = oldPrepareDetectionCache;    aut = new MobileDetect(UA);    expect(aut.phone()).toBe('iPhone');  });  it("should make internal 'detectOS' possible to delegate", function () {    var aut, UA = 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0';    aut = new MobileDetect(UA);    expect(aut.os()).toBe(null);    expect(aut.is('FirefoxOS')).toBe(false);    MobileDetect._impl.detectOS = function (ua) {      var os = origImpl.detectOS(ua);      if (os == null) {        if (/.*(Mobile|Tablet).+\sFirefox\/.*/.test(ua)) {          return 'FirefoxOS';        }      }      return os;    };    aut = new MobileDetect(UA);    expect(aut.os()).toBe('FirefoxOS');    expect(aut.is('FirefoxOS')).toBe(true);  });  it("should be possible to extend the regular expressions", function () {    var phones = MobileDetect._impl.mobileDetectRules.phones,      UA = 'Mozilla/5.0 (Linux; U; Android 4.0.3; asdfghjkl Build/4.1.A.0.562',      pattern, aut;    // with original patterns it should not be detected as phone    aut = new MobileDetect(UA);    expect(aut.phone()).toBe(null);    expect(aut.os()).toBe('AndroidOS');    // when we extend the pattern    pattern = phones.Sony.source + '|asdfghjkl';    phones.Sony = new RegExp(pattern, 'i');    // then it should be detected as a Sony mobile phone    aut = new MobileDetect(UA);    expect(aut.phone()).toBe('Sony');    expect(aut.os()).toBe('AndroidOS');  });});xdescribe("Feeding w/ ualist", function () {  function makeVendorHandler(vendorName) {    return function () {      var vendor = mobilePerVendor[vendorName];      vendor.forEach(function (uaProps) {        testUserAgent(uaProps);      });    };  }  function testUserAgent(uaProps) {    var aut = new MobileDetect(uaProps.user_agent, -1);    aut.nr = uaProps.nr;    if ('mobile' in uaProps) {      expect(aut).toBeMobile(uaProps.mobile);    }    if ('tablet' in uaProps) {      expect(aut).toBeTablet(uaProps.tablet);    }    if (uaProps.mobile === true && uaProps.tablet !== undefined) {      expect(aut).toBePhone(!uaProps.tablet);    }  }  var vendor;  for (vendor in mobilePerVendor) {    if (Object.prototype.hasOwnProperty.call(mobilePerVendor, vendor)) {      it("should detect devices from vendor " + vendor, makeVendorHandler(vendor));    }  }});

原标题:javascript: detect mobile devices or browser

关键词:JavaScript

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。