【问题标题】:Check Internet connectivity with jquery使用 jquery 检查 Internet 连接
【发布时间】:2013-12-01 08:00:04
【问题描述】:

我正在尝试通过向服务器发送 GET 请求来检查互联网连接。我是 jquery 和 javascript 的初学者。我的代码没有使用navigator.onLine,因为它在不同浏览器中的工作方式不同。到目前为止,这是我的代码:

var check_connectivity={
        is_internet_connected : function(){
            var dfd = new $.Deferred();
            $.get("/app/check_connectivity/")
            .done(function(resp){
                return dfd.resolve();
            })
            .fail(function(resp){
                return dfd.reject(resp);
            })
            return dfd.promise();
        },
}

我在不同的文件中将此代码称为:

if(!this.internet_connected())
        {
            console.log("internet not connected");
            //Perform actions
        }
internet_connected : function(){
        return check_connectivity.is_internet_connected();
},

is_internet_connected() 函数返回一个延迟对象,而我只需要一个真/假的答案。谁能告诉我如何实现这一目标?

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

    这段代码将继续监控互联网连接 单击下面的“运行代码 sn-p”按钮并查看它的实际效果。

    function checkInternetConnection(){
            var status = navigator.onLine;
            if (status) {
                console.log('Internet Available !!');
            } else {
                console.log('No internet Available !!');
            }  
            setTimeout(function() {
                checkInternetConnection();
            }, 1000);
          }
    
    //calling above function
    checkInternetConnection();

    【讨论】:

    • OP 说他们不想使用navigator.onLine。另请注意:"online" does not always mean connection to the internet, it can also just mean connection to some network. 这意味着即使路由器没有互联网也连接到路由器将意味着在线是真的
    • 来自 Mozilla:In Chrome and Safari, if the browser is not able to connect to a local area network (LAN) or a router, it is offline; all other conditions return true. So while you can assume that the browser is offline when it returns a false value, you cannot assume that a true value necessarily means that the browser can access the internet. 在浏览器中检查“互联网”连接是不安全的。它的值仅反映 LAN,我们不能假设这意味着连接到网络。参考:developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine
    【解决方案2】:

    100% 工作:

    function checkconnection() {
        var status = navigator.onLine;
        if (status) {
            alert('Internet connected !!');
        } else {
            alert('No internet Connection !!');
        }
    }
    

    【讨论】:

    • 错了,连接到无法访问互联网的路由器仍将保持true
    • 它不检查互联网是否连接。
    【解决方案3】:

    我只是使用导航器的onLine属性,根据W3C http://www.w3schools.com/jsref/prop_nav_online.asp

    但导航器仅告诉我们浏览器是否具有互联网功能(连接到路由器、3G 等)。 因此,如果返回 false,您可能处于离线状态,但如果返回 true,如果网络出现故障或速度非常慢,您仍然可以离线。 现在是检查 XHR 请求的时候了。

    setInterval(setOnlineStatus(navigator.onLine), 10000);
    
    function setOnlineStatus(online)
    {
        if (online) {
        //Check host reachable only if connected to Router/Wifi/3G...etc
            if (hostReachable())
                $('#onlineStatus').html('ONLINE').removeAttr('class').addClass('online');
            else
                $('#onlineStatus').html('OFFLINE').removeAttr('class').addClass('offline');
        } else {
            $('#onlineStatus').html('OFFLINE').removeAttr('class').addClass('offline');
        }
    }
    
    function hostReachable()
    {
        // Handle IE and more capable browsers
        var xhr = new (window.ActiveXObject || XMLHttpRequest)("Microsoft.XMLHTTP");
        var status;
    
        // Open new request as a HEAD to the root hostname with a random param to bust the cache
        xhr.open("HEAD", "//" + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false);
    
        // Issue request and handle response
        try {
            xhr.send();
            return (xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304));
        } catch (error) {
            return false;
        }
    
    }
    

    编辑:如果端口号不同于 80,则使用端口号,否则失败。

    xhr.open("HEAD", "//" + window.location.hostname + ":" + window.location.port + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false);
    

    【讨论】:

    • 这并不总是有效,这就是我首先问这个问题的原因。
    • 至少你是第一个意识到online实际上并不意味着你在线,只是连接到一个可能有也可能没有互联网的网络。
    【解决方案4】:

    您的意思是检查互联网连接是否已连接?

    如果是这样,试试这个:

    $.ajax({
        url: "url.php",
        timeout: 10000,
        error: function(jqXHR) { 
            if(jqXHR.status==0) {
                alert(" fail to connect, please check your connection settings");
            }
        },
        success: function() {
            alert(" your connection is alright!");
        }
    });
    

    【讨论】:

    • 警报对我不起作用。我必须返回一个真值或假值。
    • 检查连接的无用方法!如果有人知道自己已连接,为什么还要检查网络连接。
    • 连接可能会在一段时间内断开,因此最好检查一下是否是这种情况。
    【解决方案5】:

    $.get() 返回一个 jqXHR 对象,它与 Promise 兼容 - 因此无需创建自己的 $.Deferred

    var check_connectivity = {
        ...
        is_internet_connected: function() {
            return $.get({
                url: "/app/check_connectivity/",
                dataType: 'text',
                cache: false
            });
        },
        ...
    };
    

    然后:

    check_connectivity.is_internet_connected().done(function() {
        //The resource is accessible - you are **probably** online.
    }).fail(function(jqXHR, textStatus, errorThrown) {
        //Something went wrong. Test textStatus/errorThrown to find out what. You may be offline.
    });
    

    如您所见,无法确定您是在线还是离线。所有 javascript/jQuery 都知道资源是否被成功访问。

    一般来说,了解资源是否被成功访问(并且响应很酷)比了解您的在线状态本身更有用。每个 ajax 调用都可以(并且应该)有自己的 .done().fail() 分支,无论请求的结果如何,都可以采取适当的行动。

    【讨论】:

      【解决方案6】:
      try this 
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
      <script>
       if (! window.jQuery) {
       alert('No internet Connection !!');
        }
       else {
       // internet connected
       }
      

      Jquery Plugin for Detecting Internet Connection

      【讨论】:

      • 我将 jquery 库缓存在用户的本地计算机中,这样他每次打开网站时都不需要下载它。所以这个想法对我不起作用。
      • 此检查仅在您第一次加载网站时有效,而不是在每次 AJAX 请求时有效
      【解决方案7】:

      你不能得到简单的真或假作为回报,给他们一个回调处理程序

      function is_internet_connected(callbackhandler)
      {
      $.get({
        url: "/app/check_connectivity/",
        success: function(){
           callbackhandler(true);
        },
        error: function(){
           callbackhandler(false);
        },
        dataType: 'text'
      });
      }
      

      【讨论】:

      • 我认为创建延迟对象是为了避免回调处理程序。无论如何,我的问题无法使用回调处理程序解决。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2023-03-31
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多