从移动设备上的CDN加载库JS脚本(Paddle Payments)时发现错误:
paddle.js:94 Uncaught TypeError: Cannot read property '1' of null
奇怪的是,相同的代码在任何桌面浏览器上加载并按预期工作,但无法在任何移动设备上加载。
Fiddle here。要获得实际错误,您可以在手机上打开它或使用移动模拟器。
您认为我是否错误地加载了脚本或者它是否是支付系统缺陷(我怀疑他们有太多客户没有注意到这一点)。
代码:
<script src="https://cdn.paddle.com/paddle/paddle.js"></script>
<script type="text/javascript">
Paddle.Setup({
vendor: 20000,
debug: true
});
</script>
答案 0 :(得分:1)
Paddle脚本中的第94行是这个switch语句:
switch(os){
case'Mac OS X':
osVersion=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
break;
case'Android':
osVersion=/Android ([\.\_\d]+)/.exec(nAgt)[1];
break;
case'iOS':
osVersion=/OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
osVersion=osVersion[1]+'.'+ osVersion[2]+'.'+(osVersion[3]|0);
break;
}
似乎正在尝试确定适用于Android,iOS和Mac OS X设备的操作系统版本。
变量nAgt
是浏览器的用户代理字符串(取自navigator.userAgent
)。这些正则表达式假定,如果用户代理标头包含字符串&#39; Mac OS X&#39; Android,则&#39;或者&#39; OS&#39;,然后它会立即跟随版本号。
如果这些正则表达式匹配中的任何一个失败,那么exec
将返回null,null[1]
将抛出您正在看到的TypeError。
您使用的是哪种手机或模拟器?你能把它放在设备上的JS Fiddle中,看看它说的是什么吗?
document.body.innerHTML = "<p>" + navigator.userAgent + "</p>";
我想你会有一个字符串满足上面的一个切换条件,但不会返回正则表达式匹配。
这只是来自Paddle的编写错误的代码的结果,它不应期望用户代理字符串采用特定格式,因为它们可以被各种事物(用户,插件,设备,代理等)覆盖。
如果您可以覆盖您正在使用的设备或模拟器的用户代理,那么它会匹配其中一个正则表达式模式,那么这样做就不会再出现错误。