简体   繁体   English

检测网站用户是否来自手机

[英]Detecting if a user to a website is from a mobile phone

I've created a website and using Javascript I would like to navigate to a certain page based on whether the user is from a mobile phone of not. 我创建了一个网站,并使用Javascript根据用户是否来自非移动电话导航到某个页面。 I would want this check to be performed first before anything else is loaded on the page. 我希望被别的页面加载之前先进行此项检查。 As such here is my code: 因此,这是我的代码:

$(window).load(function(){
   if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Nokia/i.test(navigator.userAgent))
   {
     window.location.href ="http://bookbaysearch.appspot.com/";
   }
   else
   {
      //Carry on Loading the page
   }
});

As such I'm using the $(window).load() function as I assume that this is the first event called by jQuery but for some reason I doesn't seem to work. 因此,我使用$(window).load()函数,因为我假设这是jQuery调用的第一个事件,但由于某种原因,我似乎无法正常工作。 I'm not sure if what I am doing is what is need to achieve what I mentioned earlier in the post. 我不确定我在做什么是实现我之前在帖子中提到的内容所需要的。 Any help would really be appreciated! 任何帮助将不胜感激!

By using $(window).load() you are actually waiting for the page to load, even images and other files and when everything is loaded, your code will execute. 通过使用$(window).load()您实际上是在等待页面加载,甚至是图像和其他文件,并且在加载所有内容时,您的代码将执行。 So therefor it's better to run it inside an IIFE . 因此,最好在IIFE中运行它。

(function($){

    var cfg = {
            mobileRedirect: 'http://bookbaysearch.appspot.com/',
            // see below
        },
        isTouch = (function(){
            // see below
        }()),
        deviceDetection = (function(){
            // see below
        }(navigator.userAgent || navigator.vendor || window.opera));

    //direct mobile users
    if (isTouch && deviceDetection === cfg.devices.mobile){
        window.location.href = cfg.mobileRedirect;
    }

    // once the DOM is ready
    $(function(){
        // do something for other devices
        //$(document.body).addClass(deviceDetection);
    });

    // once all is loaded
    $(window).load(function(){
        // do something after everything is loaded
    });

}(window.jQuery));

I don't believe you actually have to wait for the DOM ready event to run the check, since the navigator object will be available once connected. 我认为您实际上不必等待DOM ready事件来运行检查,因为一旦连接后navigator对象将可用。 Hence, it's there in my example in case you need it for something else. 因此,在我的示例中就可以使用它,以防您需要其他功能。

Touch detection 触控侦测

touch: (window.Modernizr && Modernizr.touch === true) || (function () {
    return !!((window.hasOwnProperty("ontouchstart")) || (window.DocumentTouch && document instanceof window.DocumentTouch));
})(),

Device detection: 设备检测:

You can check out detectmobilebrowsers.com as I did. 您可以像我一样查看detectmobilebrowsers.com Somewhere hidden on that page they have a small regexp for tablets. 在该页面上隐藏的某个地方,他们有一个用于平板电脑的小型正则表达式。 Anything else I consider it to be a desktop. 我认为它是台式机。 I've wrapped them up both in a property deviceDetection which you can use as a class on the body and then do some fancy css or separate behavior in your script. 我将它们包装在属性deviceDetection ,可以将其用作主体上的类,然后在脚本中执行一些漂亮的CSS或单独的操作。

var cfg = {
    patterns: {
        mobile: new RegExp('/(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'),
        mobile2: new RegExp('/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'),
        tablet: new RegExp('/android|ipad|playbook|silk/g')
    },
    devices: {
        mobile: "mobile",
        tablet: "tablet",
        desktop: "desktop"
    }
};

// Device detection
// todo (research): device detection -vs- touch detection
// @doc: http://modernizr.com/docs/
// @doc: http://detectmobilebrowsers.com
// @param (dvc): browser string value
// @return (string): mobile | tablet | desktop
deviceDetection: (function (dvc) {
    var cfgPatterns = cfg.patterns,
        cfgDevice = cfg.devices;

    return cfgPatterns.mobile.test(dvc) || cfgPatterns.mobile2.test(dvc.substr(0, 4))
        ? cfgDevice.mobile
        : cfgPatterns.tablet.test(dvc)
            ? cfgDevice.tablet
            : cfgDevice.desktop;
}(navigator.userAgent || navigator.vendor || window.opera)),

As it is still not possible to have a 100% accurate detection, a combination of touch detection and device detection can help. 由于仍然无法实现100%准确的检测,因此将触摸检测和设备检测相结合可以提供帮助。 Even Modernizr doesn't have the best approach imho and therefor, wherever I need it, I use a combination of both. 即使是Modernizr也不是最好的方法,因此,在我需要的地方,我都将两者结合使用。

source: Modernizr docs 来源:Modernizr文档

The Modernizr.touch test only indicates if the browser supports touch events, which does not necessarily reflect a touchscreen device. Modernizr.touch测试仅指示浏览器是否支持触摸事件,这不一定反映触摸屏设备。 For example, Palm Pre / WebOS (touch) phones do not support touch events and thus fail this test. 例如,Palm Pre / WebOS(触摸)电话不支持触摸事件,因此无法通过此测试。 Additionally, Chrome (desktop) used to lie about its support on this, but that has since been rectified. 此外,Chrome(台式机)过去常常对此表示支持,但此后已得到纠正。 Modernizr also tests for Multitouch Support via a media query, which is how Firefox 4 exposes that for Windows 7 tablets. Modernizr还通过媒体查询测试Multitouch支持,这是Firefox 4公开Windows 7平板电脑的方式。 It's recommended to set both touch and mouse events together, to cater for hybrid devices – see the Touch And Mouse HTML5 Rocks article. 建议同时设置触摸和鼠标事件,以适应混合设备-请参阅“ 触摸和鼠标 HTML5 Rocks”文章。

Try this.. 尝试这个..

var android = (navigator.platform.indexOf("android")>=0);
if (android) {
   // Do something
}

And platform name may be.. 平台名称可能是..

android|webos|iphone|ipad|ipod|blackberry|iemobile

Try this: 尝试这个:

$(document).on('load ready',function(){
   if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Nokia/i.test(navigator.userAgent))
   {
     window.location.href ="http://bookbaysearch.appspot.com/";
   }
   else
   {
      //Carry on Loading the page
   }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM