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

该插件使用以下代码

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

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

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

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

有没有人有这个问题的解决方案?

解决方法

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

Unfortunately,we had a build system issue during BlackBerry 6.0 that caused builds to have WebKit touch support enabled,even for non-touch devices. It’s long been fixed,but some public builds do have this issue.

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

> https://github.com/Modernizr/Modernizr/issues/372
> https://github.com/Modernizr/Modernizr/issues/548

同时检查this touch test,browsercope选项卡表示黑莓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设备并借鉴here和here给出的解决方案,我启动了这个小功能,您可以在http://jsbin.com/aliwur/1/edit#javascript,live测试并查看jsbin的工作,它应该解析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],'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],'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

https://github.com/tobie/ua-parser/

javascript – 触摸检测Blackberry 9300 6.0的更多相关文章

  1. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  2. 处理HTML5新标签的浏览器兼容版问题

    HTML5规范毕竟是刚刚才定义完成的规范,还有一些浏览器并不能支持其中的新标签和新属性,尤其是IE8及以下版本浏览器。下面给大家介绍处理HTML5新标签的浏览器兼容版问题,需要的朋友参考下

  3. php – 什么是浏览器/手机检测的可用解决方案

    我正在为各种移动平台创建一个phonegap应用程序,我想知道什么是当前浏览器/手机检测的最佳解决方案?我应该使用服务器或客户端检测,还是可以通过媒体类型屏幕宽度使用css解决方案?

  4. 我可以在Windows7上使用C#.NET开发Blackberry应用程序吗?

    嘿,我非常感兴趣为黑莓操作系统构建一个应用程序,我能用C#做吗?BlackBerry还推出了VisualStudio的插件,但是你如何将它与模拟器一起使用?

  5. 正则表达式 – 黑莓粗体 – 无法识别URL,甚至已注册的自定义模式

    我们在BBBold9700上部署了一个黑莓本机应用程序该应用程序注册一个自定义模式的字符串://[0-9]*.匹配模式的字符串将突出显示,但应用程序不会收到完整的字符串此外,当URL被识别和突出显示时,启动时,BB浏览器只接收一个部分字符串–http://只有BBBold9700才能观察到此错误.几个更多的问题有没有办法找到使用黑莓设备注册的所有系统模式?>如果文本匹配多个模式,黑莓如何解决冲突?

  6. 正则表达式 – 如何匹配每个文件,但一个在grunt concat?

    我使用grunt连接和最小化我的js文件,我使用以下配置为concat部分:它匹配我的js文件夹中的每个文件,但我需要忽略modernizr.js,有没有办法这样做?我认为我需要一些匹配巫术的模式来做,但我不知道如何。基于documentation我会尝试:如果他们没有工作,那么可能你是幸运的…

  7. javascript – 样式表和脚本包在Mono中无法工作

    解决方法在BundleConfig文件中添加以下内容:然后切换到释放模式.这应该是诀窍

  8. javascript – 仅在尚未加载js脚本且仅加载一次时加载js脚本

    解决方法首先,您需要检查脚本是否已在页面上:条件中的代码可用于动态地向页面添加脚本.ES6更新ES6简化了这一点:

  9. javascript – Modernizr.touch在firefox浏览器上返回true

    我写了一个平和的代码,以触摸和不触摸为基础的事件.它的所有其他浏览器和设备,但Firefox.默认FF返回true.有没有办法来管理这个问题.Examplefiddle解决方法代表Modernizr–我们真的很抱歉.Modernizr.touch已被更名为Modernizr.touchevents在尚未发布的3.0版本,因为它是一个更准确的描述检测.基本上,所有这些检测正在检查触摸事件的存在,如果

  10. blackberry – 如何使来电静音

    我正在尝试静音来电并阻止BlackBerry设备响铃.我尝试了Alert.setVolume和一些EventInjector键,但这不起作用.那么如何使来电静音?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部