这个问题在这里已有答案:
我有一个jQuery脚本在Safari 10中出现此控制台错误:
TypeError: undefined is not an object (evaluating 'iOSversion()')
这在Chrome中:
Uncaught TypeError: Cannot read property '0' of undefined
这是有问题的脚本(简化):
$(document).ready(function() {
//detect iOS version
function iOSversion() {
if (/iP(hone|od|ad)/.test(navigator.platform)) {
// supports iOS 2.0 and later
var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
}
// this causes a console error
var ver = iOSversion();
if (ver[0] < 10) {
alert('this is version 9 or below');
}
if (ver[0] >= 10) {
alert('this is version 10 or above');
}
});
问题:我是JavaScript的初学者并且很难理解问题的原因是什么(因为变量看起来是正确定义的?)而且我不知道[0]错误!)。有人可以帮我理解出了什么问题以及如何解决?
(这个页面正在发生的是here)
您的功能仅在iOS平台上返回内容,因此如果您在Chrome或Safari(macOS)上进行测试,则会出现错误。 ver
是undefined
,因此没有[0]
钥匙。
快速解决方法是使函数在所有平台上返回有效的内容。就像是:
function iOSversion() {
if (/iP(hone|od|ad)/.test(navigator.platform)) {
// supports iOS 2.0 and later
var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
return [0]; // Return '0' by default
}
也许更好的解决方案(取决于您的确切问题)将不是操作系统检测,而是feature detection。
你的iOSVersion()函数没有默认情况。如果条件未评估为true,则它需要返回值。
//detect iOS version
function iOSversion() {
if (/iP(hone|od|ad)/.test(navigator.platform)) {
// supports iOS 2.0 and later
var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
else{
return [-1];
}
}
var ver = iOSversion();
if (ver[0] < 10 && ver[0] != -1) {
alert('this is version 9 or below');
}
else if (ver[0] >= 10) {
alert('this is version 10 or above');
}
else{
alert('this is not iOS');
}
当您尝试上述操作时会发生什么?