2013-02-19 5 views
1

Мне нужно достоверно определить часовой пояс пользователя в JavaScript. Большая часть пользовательской базы будет на низкой пропускной способности & старых браузерах, поэтому я должен поддерживать обратную совместимость и поддерживать передачу данных до минимума. В идеале я хотел бы получить часовую зону пользователя только в начале сеанса (я использую CAS для входа, так что нет страницы входа), а затем отправьте ее обратно на сервер, где я смогу сохранить его в базе данных. Я посмотрел в библиотеке jsTimezoneDetect, а также различные геолокации (API для получения местоположения/часового пояса по IP пользователя), но каждый из них имеет свои недостатки:Как надежно определить часовой пояс

  1. jsTimezoneDetect не большой, но я предпочел бы не включать 5K дополнительных JS код на всех своих страницах (нет одной страницы Войти!)
  2. геолокации API (например, IPInfoDB) ввести зависимость от внешних услуг, может быть медленным, и не всегда гарантирует мне результаты

Что такое простейший способ надежного и эффективного определения часового пояса пользователя и отправки его обратно в мое приложение JSF при использовании минимальной полосы пропускания и br Ресурсы owser?

+2

Re 1: Обратите внимание, что он будет кэшироваться, поэтому нет сети накладные расходы для клиента или сервера для его включения на каждую страницу, только для JS-клиента для клиента. –

+4

Я не вижу, как вы будете делать лучше, чем jsTimezoneDetect, не жертвуя точностью. – Pointy

+0

Это не проблема JSF. Это просто проблема JS. JSF находится в контексте этого вопроса «просто» генератор кода HTML/CSS/JS. У вас все еще была бы такая же проблема при использовании другого языка на стороне сервера или фреймворка, генерирующего такой же HTML/CSS/JS, как Spring MVC, PHP, ASP.NET-MVC и т. Д. – BalusC

ответ

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-код только один раз за сеанс, а также

+0

Я бы предложил такое же решение –

Смежные вопросы