类型错误“未定义”不是对象(评估“navigator.connection.type”)

Posted

技术标签:

【中文标题】类型错误“未定义”不是对象(评估“navigator.connection.type”)【英文标题】:type error 'undefined' is not an object (evaluating 'navigator.connection.type') 【发布时间】:2015-04-06 07:24:26 【问题描述】:

我正在构建一个 Cordova 应用程序,我正在使用 Cordova 网络信息插件 org.apache.cordova.network-information。从过去几天开始,当我在 safari 中调试时,我在 web-inspector 中遇到了这个奇怪的错误,其中显示“typeerror 'undefined' is not an object (evaluating 'navigator.connection.type')”。在初始加载期间,它工作正常,但在应用程序中进一步导航时,会显示此错误并且应用程序冻结。在 ios 8 中它经常出现,但在 android lollipop 中它偶尔出现。我已经尝试了有关此的所有建议或帖子,但它让我无处可去。我正在使用 Cordova 4.3 版,iOS 8.1。非常感谢任何帮助抱歉无法发布任何有关此的图片,因为我没有足够的声誉来发布它

    function checkConnection()  
    alert(navigator.connection.type);
    var networkState = navigator.connection.type;

   var states = ;
    states[Connection.UNKNOWN]  = 'Unknown connection';
    states[Connection.ETHERNET] = 'Ethernet connection';
    states[Connection.WIFI]     = 'WiFi connection';
    states[Connection.CELL_2G]  = 'Cell 2G connection';
    states[Connection.CELL_3G]  = 'Cell 3G connection';
    states[Connection.CELL_4G]  = 'Cell 4G connection';
    states[Connection.CELL]     = 'Cell generic connection';
    states[Connection.NONE]     = 'No network connection';
    if(networkState == Connection.UNKNOWN || networkState == Connection.NONE)
        navigator.notification.alert('No Network Available',null,"Warning");
        sessionStorage.setItem('UserID',"");
        $.mobile.changePage("#loginPage", 
                            transition: 'none',
                            showLoadMsg: true
                            );
        return false;
    else
        return true;
   

【问题讨论】:

试试看这个***.com/questions/26790729/… 另外,有什么东西被记录到platforms/ios/cordova/console.log吗? 我刚刚尝试了链接,但它也让我无处可去:-( @jonnyknowsbest 抱歉,我在其中找不到 console.log 文件 您是否在文件中添加了cordova.js?您还必须在 onDeviceReady 中检查Connection 【参考方案1】:

就我而言,问题是我从device ready 中调用了该函数 所以这样做解决了我的问题:

document.addEventListener("deviceready", function()
     // do your  navigator.connection.type stuff here 
    , false);

【讨论】:

【参考方案2】:

检查你是否声明了这些

<feature name="NetworkStatus">
         <param name="android-package" value="CDVConnection" />
 </feature>

网络状态将是功能名称,值将是您的类名。

在 Android 清单中,

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Aso 检查cordova_plugin.js

cordova.define('cordova/plugin_list', function(require, exports, module) 
    module.exports = [
        "file": "plugins/org.apache.cordova.dialogs/www/notification.js",
        "id": "org.apache.cordova.dialogs.notification",
        "merges": ["navigator.notification"]
    , 
        "file": "plugins/org.apache.cordova.network-information/www/network.js",
        "id": "org.apache.cordova.network-information.network",
        "clobbers": ["navigator.connection", "navigator.network.connection"]
    ];
    module.exports.metadata = // TOP OF METADATA 
    
        "org.apache.cordova.device": "0.2.8",
        "org.apache.cordova.network-information": "0.2.7"
    
);

【讨论】:

【参考方案3】:

我在使用 cordova-plugin-network-information 时遇到了同样的问题。我注意到的是,尽管在“deviceready”被触发后被调用,但 navigator.connection.type 对象仍然是未定义的。我的解决方法是将调用延迟 200 毫秒,之后对象就可以使用了。

function checkConnection()
    try
        console.log(navigator.connection.type);
    
    catch(e)
        alert("error : "+e);
    

    setTimeout(function()
        var networkState = navigator.connection.type;
        console.log(networkState);

        var states = ;
        states[Connection.UNKNOWN]  = 'Unknown connection';
        states[Connection.ETHERNET] = 'Ethernet connection';
        states[Connection.WIFI]     = 'WiFi connection';
        states[Connection.CELL_2G]  = 'Cell 2G connection';
        states[Connection.CELL_3G]  = 'Cell 3G connection';
        states[Connection.CELL_4G]  = 'Cell 4G connection';
        states[Connection.CELL]     = 'Cell generic connection';
        states[Connection.NONE]     = 'No network connection';

//        alert('Connection type: ' + states[networkState]);
        if(states[networkState] == "No network connection")
            window.location.assign("lostConnection.html");
        
    , 200);

因此,“try/catch”序列将因未定义对象而失败,但 200 毫秒后,对 navigator.connection.type 的调用成功,无论如何对我来说都很好!

【讨论】:

以上是关于类型错误“未定义”不是对象(评估“navigator.connection.type”)的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:未定义不是对象(评估“data.graphics.dvd”)

类型错误未定义不是对象(正在评估'Wu.getRandomValues')

错误:未定义不是对象(评估 \'RCTWebSocketManager.connect\')

TypeError:未定义不是一个对象(评估'_app.firebase.apps')

如何在本机反应中修复“TypeError:未定义不是对象(评估'_reactNativeCamera.default.constants')”错误?

EXPO:未捕获的错误:未定义不是对象(评估's.STANDARD_EVENT_ADD_TO_CART')