【问题标题】:Running a web app when user leaves browser当用户离开浏览器时运行 Web 应用程序
【发布时间】:2020-10-18 20:54:01
【问题描述】:

我有一个使用 Ruby on Rails HTML、CSS 和 JS 构建的网络应用程序。这个网站有一个秒表,即使用户不在网站上,我也希望它继续运行。 例如,用户带着他的手机进入网站,启动秒表(用 JS 构建)然后离开浏览器,继续他手机的其他应用程序,然后当他返回时,他应该看到已经过去了多少时间自从他们开始计时。

另外,即使他们关闭浏览器(不是标签页),是否也可以保持运行?

【问题讨论】:

  • 您唯一能做的就是根据登录的用户在数据库中保存计时信息。在这种情况下,您将能够在不依赖客户端的情况下继续跟踪。
  • 同一设备/同一浏览器可以使用localStorage查看

标签: javascript ruby-on-rails ruby


【解决方案1】:

这里有几个选项。

存储在 cookie 中的时间开始

您可以将 started_at 时间存储在 cookie 中,然后读取它并根据它设置计时器。

class TimersController
  def create
    cookies[:started_at] = Time.now
  end

  def show
    cookies[:started_at]
  end
end

这是最简单的实现方式。当然,如果用户删除浏览器中的 cookie 或使用不同的设备,计时器将被重置。

https://api.rubyonrails.org/v5.1.7/classes/ActionDispatch/Cookies.html

存储在数据库中

这是一个更复杂但也不易出错的解决方案。您可以将计时器启动时的信息存储在后端的数据库中。

要将计时器与开始时间相关联,您需要在数据库中创建一个带有 id 或 hash 的记录。

class TimersController
  def create
    Timer.create(started_at: Time.now)
  end

  def show
    @timer = Timer.find(params[:id])
  end
end

显示计时器的 URL 将类似于 timers/1timers/abc

更复杂的解决方案也可以通过用户 ID 获取计时器,但您还需要进行用户身份验证等。

在这两种解决方案中,当用户返回标签页时,您都需要使用 JS 刷新页面。

【讨论】:

  • 我使用了第二种解决方案,将时间存储在数据库中并将其发送到 JS,以便更新秒表。但是,为了看到更新的秒表我需要刷新页面,你知道是否有一种自动查看时间的方法或一种一直重新加载页面的方法?
  • 您可以使用 ActionCable (guides.rubyonrails.org/action_cable_overview.html) 或在超时后使用 JS 进行轮询。更优雅的解决方案是使用 ActionCable。
猜你喜欢
  • 2014-10-23
  • 2011-10-26
  • 2018-08-22
  • 2020-04-26
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多