触摸检测Blackberry 9300 6.0

时间:2012-08-06 11:33:03

标签: javascript jquery html mobile blackberry

我目前在使用的插件中遇到一些触摸检测问题。

该插件使用以下代码

touch = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch;
eventType = (touch) ? "touchend" : "click";

确定是否应在某些图库导航中使用touchend或click事件。

然而,不幸的是,当使用运行os 6.0的Blackberry 9300访问该页面时,它被错误地报告为启用触摸的设备并且事件不会触发。

我已经检查了所使用的检测方法,它与Modernizr中的检测方法相同。

有没有人能解决这个问题?

1 个答案:

答案 0 :(得分:6)

根据Paul Irish, RIM said关于这个问题:

  

不幸的是,我们在BlackBerry 6.0期间遇到了构建系统问题导致构建启用了WebKit触摸支持,即使对于非触摸设备也是如此。它已经修复了,但是一些公共版本确实存在这个问题。

在github / Modernizr上查看这些(当前打开的)门票,了解可能的解决方法和最新的检测代码,然后根据需要尝试更改插件。如果下面的最新检测代码不起作用,您可能需要专门检测黑莓。

另外检查this touch test,browserscope选项卡表示黑莓9000被检测为false,因此值得一试在设备中进行测试。 http://modernizr.github.com/Modernizr/touch.html

除了您发布的代码之外,触摸检测的latest modernizr来源似乎还添加了@media检测。

/*
 * The Modernizr.touch test only indicates if the browser supports
 *    touch events, which does not necessarily reflect a touchscreen
 *    device, as evidenced by tablets running Windows 7 or, alas,
 *    the Palm Pre / WebOS (touch) phones.
 *
 * Additionally, Chrome (desktop) used to lie about its support on this,
 *    but that has since been rectified: crbug.com/36415
 *
 * We also test for Firefox 4 Multitouch Support.
 *
 * For more info, see: modernizr.github.com/Modernizr/touch.html
 */

tests['touch'] = function() {
    var bool;

    if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
      bool = true;
    } else {
      injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
        bool = node.offsetTop === 9;
      });
    }

    return bool;
};

BlackBerry / PlayBook UA嗅探

要使用用户代理字符串专门检测BlackBerry设备并借用herehere提供的解决方案,我启动了这个小功能,您可以测试并查看jsbin在{{3它应该从用户代理字符串解析Blackberry 5.0 / 4.0 / 6.0和Playbook:

function rim_useragent_parser(ua) {

    var info = false,
        model = null,
        model_number = null,
        os_version = null;

    if (ua.indexOf("BlackBerry") >= 0) {
        if (ua.indexOf("Version/") >= 0) {
            // BlackBerry 6 and 7
            model = ua.match(/BlackBerry\s[0-9]*/);
            if (model) {
                model_number = model[0].match(/[0-9]+/);
                pos = ua.indexOf("Version/") + 8;
                os_version = ua.substring(pos, pos + 3);
                info = {
                    'model' : model[0],
                    'model_number' : model_number[0],
                    'os_version' : os_version
                };
            }
        }
        else {
            // BlackBerry Device Software 4.2 to 5.0
            model = ua.match(/^BlackBerry[0-9]*/);
            if (model) {
                model_number = model[0].match(/[0-9]+/);
                var SplitUA = ua.split("/");
                os_version = SplitUA[1].substring(0, 3);
                info = {
                    'model' : model[0],
                    'model_number' : model_number[0],
                    'os_version' : os_version
                };
            }
        }
    }
    else if (ua.indexOf("PlayBook") >= 0) {
        // PlayBook
        model = ua.match(/RIM Tablet OS\s[0-9].[0-9].[0-9]/);
        if (model) {
            model_number = model[0].match(/[0-9].[0-9].[0-9]/);
            pos = ua.indexOf("Version/") + 8;
            os_version = ua.substring(pos, pos + 5);
            info = {
                'model' : model[0],
                'model_number' : model_number[0],
                'os_version' : os_version
            };
        }
    }

    return info;

}

当然,您可能需要将其简化为“Blackberry 9300 6.0”,我想您也可以这样做:

var ua = navigator.userAgent;
if (ua.indexOf("BlackBerry") >= 0) {
    if (ua.indexOf("Version/") >= 0) {
        // BlackBerry 6 and 7
        var model = ua.match(/BlackBerry\s[0-9]*/);
        if (model) {
            var model_number = model[0].match(/[0-9]+/);
            if (model_number) model_number = model_number[0];
            pos = ua.indexOf("Version/") + 8;
            os_version = ua.substring(pos, pos + 3);

            if (os_version === '6.0' && model_number === '9300') {
                // do what you need specifically for this
            }
        }
    }
}

为了更好的通用用户代理解析,请参阅ua-parser

http://jsbin.com/aliwur/1/edit#javascript,live