Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解控制台错误“;TypeError:undefined不是对象;及;未捕获类型错误:无法读取属性';0';“未定义”的定义;_Javascript_Jquery_Ios_Feature Detection - Fatal编程技术网

Javascript 理解控制台错误“;TypeError:undefined不是对象;及;未捕获类型错误:无法读取属性';0';“未定义”的定义;

Javascript 理解控制台错误“;TypeError:undefined不是对象;及;未捕获类型错误:无法读取属性';0';“未定义”的定义;,javascript,jquery,ios,feature-detection,Javascript,Jquery,Ios,Feature Detection,我有一个jQuery脚本,它在Safari 10中给出了这个控制台错误: TypeError: undefined is not an object (evaluating 'iOSversion()') 这是镀铬的: Uncaught TypeError: Cannot read property '0' of undefined 这是正在讨论的脚本(简化): $(文档).ready(函数(){ //检测iOS版本 函数版本(){ if(/iP(hone | od | ad)/.test(

我有一个jQuery脚本,它在Safari 10中给出了这个控制台错误:

TypeError: undefined is not an object (evaluating 'iOSversion()')
这是镀铬的:

Uncaught TypeError: Cannot read property '0' of undefined
这是正在讨论的脚本(简化):

$(文档).ready(函数(){
//检测iOS版本
函数版本(){
if(/iP(hone | od | ad)/.test(navigator.platform)){
//支持iOS 2.0及更高版本
var v=(navigator.appVersion).match(/OS(\d+)\uD+)\uD+(\d+)/);
返回[parseInt(v[1],10),parseInt(v[2],10),parseInt(v[3]| | 0,10)];
}
}
//这会导致控制台错误
var-ver=iOSversion();
如果(版本[0]<10){
警报(“这是第9版或更低版本”);
}
如果(版本[0]>=10){
警报(“这是版本10或更高版本”);
}
});
问题:我是JavaScript的相对初学者,很难理解问题的原因(因为变量似乎定义正确?),我不知道[0]错误!)。有人能帮我了解出了什么问题以及如何修复吗


(发生这种情况的页面是)

您的函数将仅在iOS平台上返回某些内容,因此如果您在Chrome或Safari(macOS)上进行测试,您将得到一个错误
ver
未定义,因此没有
[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
}
也许更好的解决方案(取决于您的具体问题)是不进行操作系统检测,而是。

您的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');
    }
//检测iOS版本
函数版本(){
if(/iP(hone | od | ad)/.test(navigator.platform)){
//支持iOS 2.0及更高版本
var v=(navigator.appVersion).match(/OS(\d+)\uD+)\uD+(\d+)/);
返回[parseInt(v[1],10),parseInt(v[2],10),parseInt(v[3]| | 0,10)];
}
否则{
返回[-1];
}
}
var-ver=iOSversion();
如果(版本[0]<10和版本[0]!=-1){
警报(“这是第9版或更低版本”);
}
否则如果(版本[0]>=10){
警报(“这是版本10或更高版本”);
}
否则{
警报(“这不是iOS”);
}

当您尝试上述操作时会发生什么情况?

问题:如果if条件不正确,您的
iOSversion
函数会返回什么…?您好,感谢您的建议-我尝试了这个方法,但它会导致在MacOS上触发第一个if语句?(即,不是iOS-我遗漏了什么吗?)我犯了一个错误,请再试一次。版本[0]的评估结果为-1,该版本通过了该版本的检查。谢谢!(我更新了原始代码笔)它看起来像@this.lau在上面的帖子中建议的类似修复。我感谢你解释为什么第一个IF声明不起作用。正如我在上面的评论中所说,在测试过程中,我尝试添加
return false
(而不是
[0]
[-1]
),控制台错误停止了–我用一支新笔在这里显示了这一点:)。如果你不介意帮我理解的话——这种方法有什么问题吗?我建议不要让函数返回两种不同的类型——在这种情况下,可以返回数组或布尔值。最好只使用一种类型,这样您就可以始终保证函数返回的类型。谢谢@Our_Benefactors–非常有用!Hi@this.lau uuu感谢您对发生的事情提出的建议和有用的解释–我尝试了一下,但与下面建议的其他解决方案一样,使用此选项会导致在MacOS上触发第一个IF语句(即不是iOS-但我希望触发“这不是iOS”警报?),我将其插入了笔中:(顺便说一句,我需要检测iOS,而不是使用功能检测来处理iOS9上自动播放在线视频的属性的一些怪癖)@matt_50,你的第一个
if
条件应该是
if(ver[0]>0&&ver[0]<10){
很有效,谢谢!在测试时,我尝试添加了
returnfalse
,这似乎可以防止控制台错误的发生——这种方法有什么问题吗?
//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');
    }