我已阅读Detect Mobile Browsers的代码。
我对此感到困惑,并希望有人能解释它是如何运作的:
(对不起,我发现只有一个最小化的版本,我添加了一些换行符以提高可读性,希望不会破坏代码。)
(function (a,b) {
if(/(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)|
... and many more patterns ...
|zeto|zte\-/i.test(a.substr(0,4)))
window.location=b
})(
navigator.userAgent || navigator.vendor || window.opera, // argument a
'http://detectmobilebrowser.com/mobile' // argument b
);
我的问题是:
正则表达式针对navigator.userAgent
或navigator.vendor
或window.opera
(第一个真值)的前4个字符进行测试。
令我困惑的是:
Mozilla/5.0 (Linux; U; Android 4.1.1; ...
,因此在很多情况下前4个字符都是'Mozi'。它如何运作?
我在Chrome控制台中的简单测试:
/android|blackberry/i.test('Mozilla/5.0 (Linux; U; Android 4.1.1; ...'.substr(0,4))
// -> false
/android|blackberry/i.test('Mozilla/5.0 (Linux; U; Android 4.1.1; ...')
// -> true
答案 0 :(得分:2)
你被缩小的代码误导了。它实际上是这样的:
if (/(android|bb\d+|meego).../i.test(a) ||
/1207|6310|6590|3gso.../i.test(a.substr(0, 4))) {
window.location = b
}