在页面呈现之前运行 JavaScript 和控制器操作

Run Javascript and Controller Actions Before Page Renders

本文关键字:JavaScript 运行 控制器 操作      更新时间:2023-09-26

我有一个简单的rails应用程序,可以在用户到达网站时对用户进行地理定位(此代码位于我的应用程序.html.erb文件的head标签中):

<script>
  var x=document.getElementById("demo");
  function getLocation()
    {
    if (navigator.geolocation)
      {
      navigator.geolocation.getCurrentPosition(showPosition);
      }
    else{x.innerHTML="Geolocation is not supported by this browser.";}
    }
  function showPosition(position)
    {
    var lat = position.coords.latitude;
    var log = position.coords.longitude;
    document.cookie = "cl=" + lat + "&" + log + ";";
    }
  getLocation()
</script>
<p id="demo"></p>

坐标将保存为饼干。根据这些坐标,它们用于从控制器中的数据库中检索一组特定的数据。然后,这些结果将显示在视图中。

目前,当用户第一次到达站点时,页面是空白的,当页面刷新时,位置信息通过控制器并显示相应的数据。

我正在尝试做的是在初始页面加载时完成地理位置和控制器操作,以便在用户首次到达站点时显示数据。或者更简单地说:

  1. 获取用户位置的坐标
  2. 将坐标传递给控制器并检索数据
  3. 然后在视图中显示数据

我认为我问题的根源是 javascript 和控制器事件的排序,但我不确定如何解决这个问题。

由于 javascript 在浏览器中运行并且页面呈现在服务器端,因此您需要重新加载整个页面或在 showPosition 中进行一些 ajax 更新。否则,坐标将始终落后一步:如果您移动到另一个位置,cookie 中的坐标将来自最后一个位置,而不是当前位置。