循环遍历键:数组中的值对以匹配javascript中的useragent字符串

时间:2012-08-19 10:35:08

标签: javascript regex arrays loops key-value

我有一个key:value对数组,其中包含在useragent字符串中找到的关键字。我需要遍历这些对并匹配每个值以匹配navigator.userAgent字符串。我知道浏览器嗅探是不受欢迎的,但这不取决于我。而不是Ext.each(我不是那么熟悉),我可以使用for循环。这是我第一次解决这个问题的方法 http://jsfiddle.net/tagZN/83/但我被告知要以其他方式这样做。

<script type="text/javascript"> 

var deviceProfiles = 
[ 
    '{match:Macintosh, name:Mac Desktop}',
    '{match:Windows NT, name:Windows Desktop}',
    '{match:Ubuntu, name:Ubuntu,layout:desktop}',
    '{match:Silk, name:Kindle Fire,layout:tablet}'

];     

var ua = navigator.userAgent;
var re = new RegExp(deviceProfiles.join("|"), "i");    
var identifyDevice = function( ua )
{
    Ext.each(
        deviceProfiles,
        function( profile )
        {
            return ua.match( profile.match ) == nil;
        }

    );
}    

</script>    

我最初也被赋予了deviceProfile(并告诉我填写匹配和名称的值):

var deviceProfiles =
[
    { 
        match: 'user agent regular expression here', 
        name: 'name of device here',        
    },

    { 
        match: 'user agent regular expression here', 
        name: 'name of device here'             
    },

    { 
        match: 'user agent regular expression here', 
        name: 'name of device here',            
    }
];​

但它没有用,所以我把它改成你上面看到的。这是一个糟糕的电话。我试图破译我给的东西。我也创造了

var re = new RegExp(deviceProfiles.join("|"), "i");    

即使它还没有被使用,我相信它是必要的。我已经通过设置ua等于我复制并粘贴的实际用户代理字符串进行了测试,其中关键字包含在数组deviceProfiles中,但仍然没有运气。

真正感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你是正确的,浏览器嗅探是除了休闲娱乐之外的任何其他方面的有缺陷的策略。

您的代码存在许多问题,其中最重要的是 deviceProfiles 是一个字符串数组,而不是对象。此外,代码试图检测用户代理,然后猜测平台。它实际上与设备无关,例如在非Windows笔记本电脑上的虚拟机中运行IE会返回“Windows桌面”,这是完全错误的。对于不匹配的用户代理字符串应该怎么做?

手机,笔记本电脑,游戏机和电视等设备上有数以千计的浏览器。每天有更多的设备访问互联网和网页,你能嗅到所有吗?

无论如何,这是如何做你想做的事情:

function getDevice() {
  var deviceProfiles = [ 
      {match: 'Macintosh', name: 'Mac Desktop'},
      {match: 'Windows NT', name: 'Windows Desktop'},
      {match: 'Ubuntu', name: 'Ubuntu', layout:'desktop'},
      {match: 'Silk', name: 'Kindle Fire', layout:'tablet'}
  ];     

  var ua = navigator.userAgent;
  var profile, re;

  for (var i=0, iLen=deviceProfiles.length; i<iLen; i++) {
    profile = deviceProfiles[i];

    if (ua.match(profile.match)) {
      return profile.name;
    }
  }
}

alert(getDevice());