如果“不可用”,是否需要重新加载页面?

4
我有一台独立的树莓派,它显示另一台服务器上的网页。该页面通过JavaScript在30分钟后重新加载。
在某些情况下,服务器有时会短暂不可达,并且Chromium会显示常见的“此网页不可用”消息,并停止重新加载(因为来自页面的任何JavaScript都没有触发重新加载)。
在这种情况下,我如何在几秒钟后仍然重新加载网页?
现在我想通过AJAX获取网站结果,如果结果可用,则将其替换当前页面。

1
如果无法访问网站且Chromium显示错误,我认为无法通过代码进行任何操作。其他解决方案可能是使用插件,该插件可以在一定时间间隔内重新加载网站,或者通过自动化脚本加载网站。 - Sotiris Kiritsis
4个回答

5
不必每隔几分钟刷新网页,你可以使用JavaScript对服务器进行ping操作(pingjs是一个很好的库可以实现这个操作)
现在,如果ping操作成功,则重新加载页面。如果不成功,则等待30秒并再次ping。持续这样做,基本上会让你等到服务器再次开启(即可以进行ping操作)。
我认为这比制作自己的Java浏览器和浏览器插件要简单得多。
额外信息: 为避免不必要的处理开销,您应该使用指数函数或超时检查。即第一次超时失败后,等待30秒,第二次等待30*(2^1)秒,第三次等待30*(2^2)秒,以此类推,直到达到最大值。

注意 - 这假设您的服务器确实无法访问...而不是仅仅是HTML页面不可用(这有一点小但值得注意的区别)


有这个想法,但为什么不通过AJAX加载内容呢?如果服务器有响应,它将返回结果,否则您可以再次尝试。如果您获得了一些输出,请用获取的内容替换当前内容,这样每个人都会很高兴。 - fechnert
那肯定是可能的 - 但ping请求更简单。通过AJAX,1)如果数据有效,则可以使用请求数据,或者2)如果数据成功获取,则只需重新加载页面。如果您不熟悉JavaScript,第一种选项会很复杂。(2)意味着与我建议的方法相比,您的数据使用量将增加一倍。因此,我更喜欢pings以保持简单 :) - AbdealiJK
这是我自己使用的方法。 - Timothy Jeffcoat

2
我推荐的方法是使用一个脚本每30分钟本地复制网页,并将浏览器指向本地副本。
优点是脚本可以每30秒运行一次,并检查最近30分钟是否成功拉取了页面。如果是,则不进行任何操作。如果没有,您可以继续尝试拉取它。同时,浏览器将设置为每5秒刷新一次页面,但由于它正在拉取本地页面,因此每次刷新几乎不耗费时间和资源。然后您可以检测所拉取的内容是否包含所需内容。
此方法假定您的目标是避免每隔几秒钟刷新页面,从而降低远程页面的负载。
使用以下选项获取整个页面...
# exit if age of last reload is less than 1800 seconds (30 minutes)
AGE_IN_SECS=$(( $( perl -e 'print time();' ) - $(stat -c "%Y" /success/directory/index.html) ))
[[ $AGE_IN_SECS -lt 1800 ]] && exit

# copy whole page to the current directory
cd /temporary/directory
wget -p -k http://www.example.com/

然后您需要以某种方式测试页面,以确保您拥有所需的内容,例如(使用bash脚本)....

RESULT=$(grep -ci "REQUIRED_PATTERN_MATCH" expected_file_name )
[[ $result -gt 0 ]] && cp -r /temporary/directory/* /success/directory
rm -rf /temporary/directory/*

注意:

这只是你需要的基本要素,因为我不知道你需要什么具体内容。但你也应该考虑尝试...

  • 确保你在wget上设置了超时时间,以便你不会有多个wget同时运行。
  • 创建某种形式的后退,以便在远程服务器遇到问题时不会影响它。
  • 最好在页面上显示一些消息,如果它超过40分钟,那么观看者就知道正在经历问题。
  • 你可以使用Chromium刷新插件从本地拉取页面。
  • 如果你想添加额外/更改格式(例如替换CSS文件),你可以使用你的脚本来修改页面。

1
我看到有三种解决方案:
  1. 在 iframe 中加载页面(如果没有被阻止),并检查内容/响应。

  2. 使用 java 创建简单的浏览器(即使您不知道这种语言,也不难,使用 webview)

  3. 为您的浏览器创建插件。

0

通过JavaScript重新加载页面非常容易:

function refresh() {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status === 200)
      document.body.innerHTML = this.responseXML.body;
    else
      setTimeout('refresh', 1500);
  };

  xhr.open('GET', window.location.href);
  xhr.responseType = "document"
  xhr.send();
}

setInterval('refresh', 30*60*1000);

这应该按照您的要求工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接