【问题标题】:Check for internet connection on Javascript在 Javascript 上检查互联网连接
【发布时间】:2014-08-19 23:55:54
【问题描述】:

好的,我收到了这个案子。我在 angular.js 上构建了这个应用程序,并在 node.js 上构建了后端......它无论如何都可以正常工作。

客户端与互联网的连接很糟糕。它时不时地在线和离线。我需要做的是 ping 我的服务器以检查其连接的例程。如果失败,我需要 ping 到其他东西(比如说:google.com),这样我可以检查两件事:

1.- 我的服务器在线(或不在线) 2.- 客户端没有网络连接。

使用此例程 Ping 到服务器可以正常工作:

function hostReachable(host) {  // 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( "GET", "//" + host + "/?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; }
    }
 }

function check() {
if (!hostReachable(window.location.host)) {
    if (!hostReachable('www.google.co.ve')) {
        alert('No se pudo establecer conexión con el sistema. Revise su conexion a internet.');
    } else {
        alert('Existe un problema con el sistema. Por favor contacto a los administradores.');
    }
} else {
    console.log('Connected...');
}
}

check();

交易是检查 google.com 会出现跨域问题。所以问题很简单。有没有办法像这样检查互联网连接?

【问题讨论】:

  • 对最终用户有什么明显的区别吗?您是否希望他们给您发送电子邮件并告诉您您的服务器已离线,以便您重新启动它?
  • navigator.online 超越了您的第一个任务。
  • @dandavis — 根据MDNnavigator.onLine 不是特别可靠,应采用备份方法(例如,根据 OP)。
  • @RobG:非常可靠的是,如果 navigator.online===false,你没有互联网。如果是真的,那么 OP 的第二步应该处理潜在的误报。
  • 你可以使用 xhr.onerror() 来避免 try/catchy yuckiness。

标签: javascript angularjs


【解决方案1】:

如果您发送一个跨域请求并且您尝试 ping 的服务器不接受它,他们将发回拒绝访问状态。我认为那是403,但您需要检查 firebug / chrome dev 工具以查看实际代码是什么。然后,如果您获得该代码,您至少知道请求已发送并收到响应。

--编辑--

这是我在JSFiddle 上的意思的一个例子。请务必检查 chrome dev tools / firebug 上的网络请求。它正在向www.google.com 发送请求,并在响应中接收404 状态码。

旁注:事实证明,不同的服务器在拒绝跨域请求时会发回不同的代码。似乎401403404 是最受欢迎的。对于将来查看此问题的任何人,您将需要检查您 ping 所针对的站点正在发回哪些代码。

【讨论】:

  • 它不会发送状态。我在 xhr.send().. 之后回到 catch 语句,出现类似“无法在 XMLHttpRequest 上执行发送:无法加载 google.com/?rand=123412”的错误
  • @JanxfromVenezuela 我添加了一个 JSFiddle 示例。如果您收到 40X 响应,它会将错误记录到控制台,但实际上不会中断脚本的流程。
  • 在您的小提琴示例中,您尝试 GET fiddle.jshell.net/_display/www.google.com 并返回 404。如果您将执行 xhr.open 的方式更改为 : ('GET', "//" + url + , true),那么您实际上会 ping google,它会在 xhr.send() 上失败,因为请求的资源上没有“Access-Control-Allow-Origin”标头,因此不允许访问。跨度>
【解决方案2】:

您可以尝试从 google 或其他一些高度可靠的 cdn 请求 javascript 资源。不受跨域限制。

【讨论】:

  • 因为? ...我尝试了 code.jquery.com/jquery-1.11.1.js 而不是 google.com,同样没有“Access-Control-Allow-Origin”标题问题。!
  • 好吧,事实证明你可以请求,比方说来自 netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css。不知道是不是因为是 CSS 文件而不是 JS 文件(真的不这么认为),但无论如何,它可以工作。!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2011-04-15
  • 2017-03-16
  • 2014-02-08
  • 2012-06-12
相关资源
最近更新 更多