【问题标题】:Check if connected to a network; jQuery检查是否连接到网络; jQuery
【发布时间】:2012-03-02 01:08:46
【问题描述】:

我在 StackOverflow 上进行了搜索,并看到了有关如何执行此操作的各种主题,但没有任何内容与我的特定情况真正相关。我正在(为一个班级)编写一个移动“应用程序”(使用 HTML5、CSS、jQuery)。它将最终成为一个独立的“应用程序”,其中包含所有需要文件的本地副本。在我的一个页面上,我有一个提交表单,并且由于用户在离线时无法提交表单,因此我希望将页面重定向到自定义 404 页面。

我只是想看看是否有办法在 jQuery 中实现这一点,因为我还没有真正找到任何东西。

谢谢

【问题讨论】:

    标签: jquery html


    【解决方案1】:

    你可以使用

    if (navigator.onLine) {
        // I'm online so submit the form.
    }
    

    【讨论】:

    • 我按照你的规定试过了;在 if/else 中发出警报。 if 像我期望的那样完美地工作,当我禁用我的网络连接来测试 else 时,它​​会失败并仍然显示 if 语句中将显示的内容。
    • 这不是万无一失的,它从浏览器获取数据。
    • 它只显示您是否处于Offline 模式,我正在寻找一种方法来实际检查您是否可以访问互联网。
    【解决方案2】:

    您实际上根本不需要 jQuery。 HTML5 本身为在线/离线条件下运行的应用程序提供了一个简洁的工具 - cache manifest。缓存清单是在<html> 标签的manifest 属性中引用的纯文本文件:

    <html manifest="cache.manifest">
    

    这个清单文件的内容告诉浏览器,哪些资源需要在线条件才能运行(NETWORK),哪些文件需要缓存(CACHE)以及离线请求网络资源时该怎么做(FALLBACK )。

    CACHE MANIFEST
    # the above line is required
    
    NETWORK:
    *
    
    FALLBACK:
    *   error404.html
    
    CACHE:
    index.html
    about.html
    help.html
    # Plus all other resources required to make it look nice
    style/default.css
    images/logo.png
    images/backgound.png
    

    当使用manifest时,浏览器会先查询manifest,无需任何脚本,根据在线或离线进行相应的操作。

    http://dev.w3.org/html5/spec-preview/offline.html#manifests

    更新:

    请注意响应内容类型的关键要求。纯文本根本行不通。

    清单必须使用text/cache-manifest MIME 类型提供。

    http://dev.w3.org/html5/spec-preview/offline.html#writing-cache-manifests

    另外请注意,清单中未列出的所有 URL 都会因此被阻止加载。这就是为什么我使用通配符 (*) 修复了上述清单以允许“其余部分”。这可能会帮助您入门。

    【讨论】:

    • 有趣....这可能是我要找的...假设我有 5 个网页(index.html、contact.html、about.html、rates.html、reserve.html ),无论如何都会显示索引,以及关于页面。我想在离线时链接到自定义 404 页面的联系方式、预订和费率;我该怎么做?
    • 我给了你赏金,因为即使我无法让你的解决方案在我的普通浏览器上运行,但我相信如果我严格地为移动设备编写代码,这是一个不错的选择。跨度>
    • @Brendan,缓存清单也可以在普通桌面浏览器上以相同的方式工作。我已经用常见的内容类型陷阱再次更新了答案,因为我最近发现,缓存清单本质上有点像防火墙,你必须告诉它实际允许哪些网络资源,我使用通配符来允许您的所有资源,否则它们将被阻止。您只需选择要缓存的其中一个并将其列在清单中。
    • @vishwanath 只需仔细检查一下,所有三个链接都可以正常工作。
    • 糟糕,它会在一段时间后进行一些重定向,我没有早点等那么久。感谢您的回复..
    【解决方案3】:

    您可以检查navigator.onLine 属性或监听offline/online 事件:

    $(document).on('offline online', function (event) {
        alert('You are ' + event.type + '!');
    });
    

    来源:http://www.html5rocks.com/en/mobile/workingoffthegrid/

    以下是这些事件的一些 MDN 文档:https://developer.mozilla.org/en/Online_and_offline_events

    我自己对这些事件并不熟悉,但是如果您阅读上面的链接,您应该会发现很多很好的信息。

    【讨论】:

    • 这看起来是一种简洁的方法,但是这些事件是否适用于所有浏览器?
    • 绝对不是:)。这是使用 HTML5 特定事件,这还不是官方规范。这是navigator.onLine的MDN网站链接:developer.mozilla.org/en/DOM/window.navigator.onLine(浏览器支持在底部)
    • @ToddMoses 我必须对其进行测试以确保它有效,但 Todd Moses 的回答似乎是一个不错的选择。但是您可以使用少量资源而不是整个框架来加载。例如,您可以托管自己的 JS 文件,该文件只是将标志添加到全局范围,如果标志存在,则用户在线。为了确保 JS 文件没有被缓存,您必须正确设置文件的标题以始终刷新。
    【解决方案4】:

    我正在使用以下代码来检查连接。注意:上述解决方案均不适用于 Firefox,它依赖于其内部的“离线工作”状态:

    // Register listeners
    window.addEventListener("offline", function(){
        $('#globalDiv').hide();
        $("#message").html('WARNING: Internet connection has been lost.').show();
    });
    window.addEventListener("online", function(){
        $("#message").empty().hide();
        $('#globalDiv').show();
    });
    

    【讨论】:

    • 截至 2015 年,如果您想使用简单的事件,这个答案似乎是最可靠的。
    • 在没有网络连接的情况下浏览页面时,如何在每个页面中重新初始化它。这是可行的,但我需要允许在没有网络的情况下浏览页面。我还需要在每个页面中显示无网络消息。
    • 您可以将“无网络”消息显示为页面顶部的横幅,而不是阻止整个页面,但是在没有网络的情况下允许导航是另一个主题。为此,您需要将页面缓存在本地。 HTML5 有一个机制(缓存清单),请参考:w3schools.com/html/html5_app_cache.asp
    【解决方案5】:

    尝试将 ajaxSetup 设置为每 n 毫秒执行一次请求(我在这里设置了 1000)并检查它是否超时,然后禁用按钮。

    $.ajaxSetup({
        timeout: 1000, 
        error: function(request, status, maybe_an_exception_object) {
            if(status != 'timeout')
                //Code to enable button
            else
                 //Code to disable button
        }
    });
    

    【讨论】:

    • 当您有很多客户端时,这可能会导致一些严重的连接开销
    【解决方案6】:

    使用window.navigator.onLine 本质上是不可靠的,因为用户可能已连接到网络,但该网络无法访问互联网。

    但是,这里是一个准系统示例

    <!DOCTYPE HTML>
    <html>
     <head>
      <title>Online status</title>
      <script>
       function updateIndicator() {
         document.getElementById('indicator').textContent = navigator.onLine ? 'online' : 'offline';
       }
      </script>
     </head>
     <body onload="updateIndicator()" ononline="updateIndicator()" onoffline="updateIndicator()">
      <p>The network is: <span id="indicator">(state unknown)</span>
     </body>
    </html>​
    

    查看实际操作中的小提琴:http://jsfiddle.net/3rRWK/

    【讨论】:

    • 哈哈。对一个有效的 3 岁答案投了反对票。 :)
    【解决方案7】:

    这是我要做的,基于:how to check if the user has the connection to the internet

    首先,使用 javascript 库链接来确定用户是否在线。如果为 true,则将表单的 action 属性更改为在线页面,否则为离线页面。

        <script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js></script>
        <script>
    $('#target').submit(function() {
       if (typeof window.$ !== 'function') {
        $('myform').attr( "action" , "offlinepage.html"  );
       }
       else
       {
        $('myform').attr( "action" , "onlinepage.html"  );
       }
    });
        </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多