首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型错误“未定义”不是对象(计算“navigator.connection.type”)

类型错误“未定义”不是对象(计算“navigator.connection.type”)
EN

Stack Overflow用户
提问于 2015-04-06 15:24:26
回答 3查看 5.2K关注 0票数 3

我正在构建一个Cordova应用程序,其中我正在使用Cordova网络信息插件org.apache.cordova.network-information。在过去的几天里,我在safari中调试web-inspector时发现了这个奇怪的bug,里面写着“类型错误‘未定义’不是一个对象(计算'navigator.connection.type')”。在初始加载期间,它工作得很好,但在应用程序中进一步导航时,会显示此错误,并且应用程序冻结。在iOS 8中,它经常出现,但在安卓棒棒糖中,它偶尔会出现。我已经尝试了所有关于这方面的建议或帖子,但都无济于事。我使用的是科尔多瓦4.3版,iOS 8.1。非常感谢任何人的帮助,很抱歉不能发布任何关于这方面的图片,因为我没有足够的声誉来发布它

代码语言:javascript
运行
复制
    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;
   }
}
EN

回答 3

Stack Overflow用户

发布于 2017-09-20 21:55:38

在我的例子中,问题是我在device ready之外调用函数,所以这样做解决了我的问题:

代码语言:javascript
运行
复制
document.addEventListener("deviceready", function(){
     // do your  navigator.connection.type stuff here 
    }, false);
票数 2
EN

Stack Overflow用户

发布于 2015-04-06 16:50:43

请检查您是否已声明这些内容

代码语言:javascript
运行
复制
<feature name="NetworkStatus">
         <param name="android-package" value="CDVConnection" />
 </feature>

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

在Android Manifest中,

代码语言:javascript
运行
复制
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Aso检查cordova_plugin.js

代码语言:javascript
运行
复制
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"
    }
});
票数 1
EN

Stack Overflow用户

发布于 2018-04-28 03:26:50

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

代码语言:javascript
运行
复制
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“序列将会因为一个未定义的对象而失败,但是200ms之后,对navigator.connection.type的调用就成功了,这对我来说是件好事!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29467123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档