【问题标题】:Check if Internet Connection Exists with jQuery? [duplicate]使用 jQuery 检查 Internet 连接是否存在? [复制]
【发布时间】:2011-01-23 23:01:00
【问题描述】:

如何使用 jQuery 检查是否有 Internet 连接?这样我可以有一些条件说“在生产过程中使用谷歌缓存的 JQuery 版本,在开发过程中使用该版本或本地版本,具体取决于 Internet 连接”。

【问题讨论】:

  • javascript是如何下载到浏览器的?
  • 有时我去咖啡馆和偏僻的地方,他们没有像样的/任何互联网,所以我想一劳永逸地自动解决这个问题:)。用于测试/辅助项目。
  • 我不确定@viatropos 的目标是什么,但我认为测试与 javascript 的连接是一种使网络应用程序离线工作的有价值的方法,考虑像 gmail 这样的应用程序,不是吗如果它利用客户端存储,这样您就可以编写消息并仍然以有限的方式使用该应用程序,那么当浏览器再次建立连接时,它可以再次发送和接收。
  • Javascript 应用程序如何“离线”工作? javascript从哪里来?我仍然无法弄清楚用例是什么。您能否提供一个更完整的场景来说明 javascript 的来源?
  • @S.Lott Javascripts 可用于构建 html 可执行文件(appjs、tidesdk、nodejs),或者 html 文件可以是本地 web-app,因此可能需要检查互联网连接

标签: jquery browser offline internet-connection


【解决方案1】:

您的具体情况的最佳选择可能是:

就在您关闭</body>标签之前:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

鉴于您的问题围绕 jQuery,这可能是最简单的方法。

如果您想要更强大的解决方案,您可以尝试:

var online = navigator.onLine;

阅读有关W3C's spec on offline web apps 的更多信息,但请注意,这在现代网络浏览器中效果最佳,在旧版网络浏览器上这样做可能无法按预期工作,或者根本无法工作。

另外,对您自己的服务器的 XHR 请求并不是一种测试连接性的方法。考虑到其他答案之一表明 XHR 的故障点太多,如果您的 XHR 在建立连接时存在缺陷,那么无论如何在日常使用期间它也会存在缺陷。如果您的站点因任何原因无法访问,那么您在同一台服务器上运行的其他服务也可能无法访问。这个决定取决于你。

我不建议向其他人的服务发出 XHR 请求,即使是 google.com。向您的服务器发出请求,或者根本不发出请求。

“在线”是什么意思?

关于“在线”的含义似乎有些混乱。考虑到互联网是一堆网络,但有时您使用的是 VPN,无法访问“一般”互联网或万维网。公司通常有自己的网络,与其他外部网络的连接有限,因此您可能被视为“在线”。在线仅需要您连接到一个网络,而不是您尝试连接的服务的可用性或可访问性。

要确定是否可以从您的网络访问主机,您可以这样做:

function hostReachable() {

  // Handle IE and more capable browsers
  var xhr = new ( window.ActiveXObject || XMLHttpRequest )( "Microsoft.XMLHTTP" );

  // 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;
  }

}

您也可以在这里找到 Gist:https://gist.github.com/jpsilvashy/5725579

本地实施详情

有些人评论说,“我总是被退回假”。那是因为您可能正在本地服务器上对其进行测试。无论您向哪个服务器发出请求,您都需要能够响应 HEAD 请求,如果您愿意,当然可以将其更改为 GET。

【讨论】:

  • navigator.onLine,上次我检查,可用于 IE 浏览器,因此对于那些不支持 navigator.onLine 的浏览器,使用您提到的 XHR 请求。
  • 它也可用于 Safari/WebKit/Chrome 和 Opera。但应该指出的是,它不会检查您是否有 Internet 连接 - 仅检查您是否已连接到网络。这是一个非常便宜和肮脏的测试。
  • 问题是不同的浏览器开发者无法确定“在线”是什么意思
  • navigator.onLine 非常不可靠,如果您有一个虚拟网络适配器,例如 kerioVPN,您需要断开该虚拟适配器和所有其他网络适配器才能将 navigator.onLine 更改为 false
  • var online = navigator.onLine;。它是 Firefox 缓存问题的一个非常好的解决方案。如果您不希望您的 html 页面在 firefox 为 offline 时被缓存和显示,请使用它。
【解决方案2】:

好吧,也许游戏有点晚了,但是看看在线图片怎么样? 我的意思是,OP 需要知道他是否需要获取 Google CMD 或本地 JQ 副本,但这并不意味着浏览器无论如何都无法读取 Javascript,对吧?

<script>
function doConnectFunction() {
// Grab the GOOGLE CMD
}
function doNotConnectFunction() {
// Grab the LOCAL JQ
}

var i = new Image();
i.onload = doConnectFunction;
i.onerror = doNotConnectFunction;
// CHANGE IMAGE URL TO ANY IMAGE YOU KNOW IS LIVE
i.src = 'http://gfx2.hotmail.com/mail/uxp/w4/m4/pr014/h/s7.png?d=' + escape(Date());
// escape(Date()) is necessary to override possibility of image coming from cache
</script>

只要我的 2 美分

【讨论】:

  • 甚至认为这是一个 hack,它让我完成了工作。
  • 这非常适合区分我的服务器宕机和互联网宕机。我使用了谷歌的标志,假设如果它无法访问,那么互联网可能已经关闭。
  • 但是如果浏览器已经在缓存中保存了该图像,那么测试不会显示它应该正确的内容怎么办?它只会从本地内存中获取它而不是在线获取它?
  • 嗯,这就是脚本中有escape(Date()) 部分的原因。因此,您将获得具有确切时间戳 (hh:mm:ss) 的缓存图像的可能性非常小......
  • 认为我们可以使用更好的图片网址吗?一个永远向上,永远永远!?或者至少有 99.999% 的时间永远存在?
【解决方案3】:

5 年后的版本:

今天,如果您不想深入了解本页中描述的不同方法的本质,可以为您提供 JS 库。

其中一个是https://github.com/hubspot/offline。它检查预定义 URI 的连接性,默认情况下是您的 favicon。它会自动检测用户的连接何时重新建立,并提供简洁的事件,如 updown,您可以绑定到这些事件以更新您的 UI。

【讨论】:

  • 如果他不能先加载jQuery就不行了,这是他的问题。
  • 你不必通过 CDN 获取 jquery,但可以将它放在你的服务器上......然后这将工作:-)
  • 他首先检查网络,因为他想使用 Google CDN。如果没有网络连接,则加载本地连接。你的解决方案完全绕过了他的问题。
  • @PhilRykoff 这就是为什么我总是用谷歌搜索“isitdown Google.com”这个短语,以确保我不会陷入这样的谬论。 ;)
【解决方案4】:

您可以模仿 Ping 命令。

使用 Ajax 向您自己的服务器请求时间戳,使用 setTimeout 将计时器定义为 5 秒,如果没有响应则重试。

如果 4 次尝试都没有响应,则可以认为 Internet 已关闭。

因此您可以定期检查是否使用此例程,例如 1 或 3 分钟。

这对我来说似乎是一个很好且干净的解决方案。

【讨论】:

    【解决方案5】:

    您可以尝试发送几次 XHR 请求,然后如果出现错误,则表示互联网连接存在问题。

    【讨论】:

    • 这不起作用。他需要在获取 jQuery 之前检查网络是否存在,以便他可以获取 JQUERY。
    • 如果他在页面中,那么他已经得到了 JQuery ...我错过了什么吗?
    • 重新阅读他的问题。他需要在页面加载之前测试连接。如果有连接,他希望获得 Google 托管的 jQuery。如果没有连接,那么他想获取本地 jQuery。这一切都必须在加载 jQuery 之前完成,因为整个过程都是为了加载 jQuery。
    • 关于 JQuery 的好点,不过,XHR 解决方案是有效的。
    • 正如我在帖子中其他地方评论的那样,XHR 的东西有太多的故障点而不是可靠的。缓慢的服务器、繁忙的服务器、滞后的连接等都可能导致 XHR 失败。
    【解决方案6】:

    我为此编写了一个 jQuery 插件。默认情况下,它会检查当前 URL(因为它已经从 Web 加载过一次),或者您可以指定要用作参数的 URL。总是向谷歌发出请求并不是最好的主意,因为它在不同的国家在不同的时间被阻止。此外,您可能会受到那天特定海洋/天气前沿/政治气候之间的联系的摆布。

    http://tomriley.net/blog/archives/111

    【讨论】:

      【解决方案7】:

      我有一个解决方案,可以在这里检查互联网连接是否存在:

      $.ajax({
          url: "http://www.google.com",
          context: document.body,
          error: function(jqXHR, exception) {
              alert('Offline')
          },
          success: function() {
              alert('Online')
          }
      })
      

      【讨论】:

      • 这会检查http://www.google.com 是否可达。
      • google.com 总是会返回这样的错误...
      • 谷歌无法访问的那一天就是互联网死掉的那一天。
      • kuhaku 是正确的,这只是错误
      • 只是出于好奇...为什么会出错?
      【解决方案8】:

      发送 XHR 请求很糟糕,因为如果该特定服务器关闭,它可能会失败。相反,使用 googles API 库来加载他们缓存的 jQuery 版本。

      你可以在加载 jQuery 后使用 googles API 执行回调,这将检查 jQuery 是否加载成功。下面的代码应该可以工作:

      <script type="text/javascript">
          google.load("jquery");
      
          // Call this function when the page has been loaded
          function test_connection() {
              if($){
                  //jQuery WAS loaded.
              } else {
                  //jQuery failed to load.  Grab the local copy.
              }
          }
          google.setOnLoadCallback(test_connection);
      </script>
      

      google API 文档可以在here找到。

      【讨论】:

      • 好吧,你可以检查一下 google 是 up/down :-)
      • 如果 google API 会以更清晰、更易读、更编程的方式来做,为什么要做这样的事情?
      • 使用 google api 你还需要一个 js 文件。您只能将其与 google 提供的 api 密钥一起使用 - 将其放在您自己的服务器上并不是一个好主意,因为如果 api 发生更改,您的代码将不再工作......
      • API 不会改变。 Google 经过实战考验,是目前最可靠的提供商。不使用上面的方法是愚蠢的。
      • mike 你的支票只在页面加载时有效。在现实世界的场景中,您可能希望不止一次检查互联网连接...这就是为什么您必须使用 xhttpr
      【解决方案9】:

      一个更简单的解决方案:

      <script language="javascript" src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>
      

      以及后面的代码:

      var online;
      // check whether this function works (online only)
      try {
        var x = google.maps.MapTypeId.TERRAIN;
        online = true;
      } catch (e) {
        online = false;
      }
      console.log(online);
      

      当不在线时,谷歌脚本将不会被加载,从而导致抛出异常的错误。

      【讨论】:

      • 好可爱的解决方案 :) 初学者的
      • 这是一个非常糟糕的解决方案。
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多