外部脚本未在移动设备上加载:未捕获的TypeError

时间:2017-09-30 17:27:34

标签: javascript mobile

从移动设备上的CDN加载库JS脚本(Paddle Payments)时发现错误:

paddle.js:94 Uncaught TypeError: Cannot read property '1' of null

奇怪的是,相同的代码在任何桌面浏览器上加载并按预期工作,但无法在任何移动设备上加载。

Fiddle here。要获得实际错误,您可以在手机上打开它或使用移动模拟器。

Docs on integration

您认为我是否错误地加载了脚本或者它是否是支付系统缺陷(我怀疑他们有太多客户没有注意到这一点)。

代码:

<script src="https://cdn.paddle.com/paddle/paddle.js"></script>

<script type="text/javascript">
  Paddle.Setup({
    vendor: 20000,
    debug: true
  });
</script>

1 个答案:

答案 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的编写错误的代码的结果,它不应期望用户代理字符串采用特定格式,因为它们可以被各种事物(用户,插件,设备,代理等)覆盖。

如果您可以覆盖您正在使用的设备或模拟器的用户代理,那么它会匹配其中一个正则表达式模式,那么这样做就不会再出现错误。