1

我需要在 JavaScript 中可靠地确定用户的时区。大多数用户群将使用低带宽和旧浏览器,因此我必须保持向后兼容性并将数据传输保持在最低限度。理想情况下,我只想在会话开始时获取用户的时区(我使用 CAS 登录,因此没有登录页面),然后将其发送回服务器,在那里我可以将其存储在数据库中。我查看了 jsTimezoneDetect 库以及各种地理定位 API(通过用户的 IP 检索位置/时区),但每个都有其缺点:

  1. jsTimezoneDetect 不大,但我宁愿不在我的所有页面上包含 5K 额外的 JS 代码(没有单个登录页面!)
  2. 地理位置 API(例如 IPInfoDB)引入了对外部服务的依赖,可能会很慢,并且并不总是能保证我的结果

在使用最小带宽和浏览器资源的同时,可靠有效地确定用户时区并将其发送回我的 JSF 应用程序的最简单方法是什么?

4

1 回答 1

0

阅读评论后,我最终得到以下代码:

<h:panelGroup layout="block" rendered="#{!applicationBean.timeZoneSet}">
    <h:outputScript name="timezone.js" library="js"></h:outputScript>
    <h:form style="display:none;">
        <p:inputText value="#{applicationBean.currentTimeZone}" widgetVar="wTZ" style="display:none;"></p:inputText>
        <p:remoteCommand autoRun="true" name="setTZ" onstart="var tzone=jstz.determine();wTZ.getJQ().val(tzone.name())" process="@form"></p:remoteCommand>
    </h:form>
</h:panelGroup>  

支持豆:

public boolean isTimeZoneSet() {
    return getELValue(EL_TIMEZONE_FLAG, Boolean.class);
}

public void setTimeZoneSet(boolean val) {
    setELValue(EL_TIMEZONE_FLAG, val);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void setCurrentTimeZone(String val) {
    User _user = getCurrentUser();
    _user.setTimeZone(val);
    _usersDAO.merge(_user);
    setTimeZoneSet(true);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public String getCurrentTimeZone() {
 User _user = getCurrentUser();
     return _user.getTimeZone();
    }

其中 EL_TIMEZONE_FLAG 是会话范围的 EL 表达式。上面的方法确保我在用户上设置了一个时区,每个会话只执行一次,并且每个会话也只加载一次任何额外的 JS 代码

于 2013-02-19T18:48:26.587 回答