如何刷新JFS中<h:head>中的脚本?</h:head>

时间:2013-07-26 13:39:21

标签: javascript jquery jsf web-notifications

早上好

我正在使用Google Chrome中的Web API Notifications,问题是:我的xhtml页面头部有一个脚本,它通过托管bean从数据库中检索值,此过程必须在计时器上完成(间隔)每隔10秒,它第一次工作正常,但有时不会在数据库中返回以下值,而是继续显示第一次恢复的值。我怎样做才能使间隔越来越大这些值从数据库中的托管bean开始再次恢复我的代码如下所示我希望能提供帮助。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:ice="http://www.icesoft.com/icefaces/component"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ace="http://www.icefaces.org/icefaces/components">
<h:head>
   <script>

    if (!window.webkitNotifications) 
    {
        alert('Lo sentimos, su navegador no soporta notificación de escritorio. Trabaje con Google Chrome.');
    }

    function RequestPermission (callback)
    {
        window.webkitNotifications.requestPermission(callback);
    }

    function getNroCasosPendientes()
    {
        var nroCasosPendientes = '#{ControladorBk.getNroCasosPendientes()}';

        return nroCasosPendientes;
    }

    function getNroRecordatoriosPendientes()
    {
        var nroRecorPendientes = '#{ControladorBk.getNroRecordatoriosPendientes()}';

        return nroRecorPendientes;
    }

    function abrirVentana(url) 
    {
        var height = screen.availHeight-30;
        var width  = screen.availWidth-10;
        var left   = 0;
        var top    = 0;

        settings   = 'fullscreen=no,resizable=yes,location=no,toolbar=no,menubar=no';
        settings   = settings + ',status=no,directories=no,scrollbars=yes';
        settings   = settings + ',width=' + width +',height=' + height;
        settings   = settings + ',top=' + top +',left=' + left;
        settings   = settings + ',charset=iso-8859-1';
        var win    = window.open(url, '', settings);

        win.outerHeight = screen.availHeight;
        win.outerWidth  = screen.availWidth;

        win.resizeTo(screen.availWidth, screen.availHeight);

        if (!win.focus)
        {
            win.focus();
        }

        return win;
    }

    function notification ()
    {               
        if (window.webkitNotifications.checkPermission() > 0) 
        {
            RequestPermission(notification);
        }

        var icon               = 'http://entidades.com/images/img999.png';
        var title              = 'AVISO'; 
        var nroCasosPendientes = getNroCasosPendientes();
        var nroRecorPendientes = getNroRecordatoriosPendientes();

        if(nroCasosPendientes != '0' || nroRecorPendientes != '0')
        {
            var body               = 'Tienes '+nroCasosPendientes+' Casos y '+nroRecorPendientes + ' Recordatorios pendientes.';
            var popup              = window.webkitNotifications.createNotification(icon, title, body);
            popup.show();
            setTimeout(function()
            {
                popup.cancel();
            }, '5000');

            popup.onclick = function() 
            {
                abrirVentana('http://localhost:8080/Proyect/faces/Page.xhtml');
            };
        }       
     }

     var timer = setInterval(function() 
     {
        notification();
     }, 10000);

    </script>
</h:head>

1 个答案:

答案 0 :(得分:0)

普通的javascript正在客户端执行。

表达式如   "#{ControladorBk.getNroCasosPendientes()}" - 在服务器端。

因此,您需要拨打服务器以更新&#34; nroCasosPendientes&#34;和&#34; nroRecorPendientes&#34;

您可以通过以下方式实现这一目标:

  1. 将值放入隐藏字段
  2. 通过ajax调用
  3. 更新它们
  4. 在javascript中获取更新值

  5. 所以,在html中你需要添加以下代码:

    <h:form>
        <h:inputHidden id="hiddenCasos"
            value="#{ControladorBk.getNroCasosPendientes()}"/>
        <h:inputHidden id="hiddenRecordatorios"
            value="#{ControladorBk.getNroRecordatoriosPendientes()}"/>
    
        <h:commandLink id="btnUpdate"
            style="display: none">
            <f:ajax render="hiddenCasos hiddenRecordatorios"
                onevent="performNotification"/>
        </h:commandLink>
    </h:form>
    

    如你所见:

    1. 添加了两个隐藏字段,用于从bean
    2. 获取值
    3. 添加了用于执行ajax请求的隐藏按钮

    4. <script>中,您需要进行一些更改:

          <script>
          //your code
      
          //add this...
          function updateBean() {
              document.getElementById("btnUpdate").click();
          }
      
          //...and this
          function performNotification(data) {
          if(data.status === 'success') {
              notification();
              }
          }
      
          //...change this
          function notification() {
              //your code
      
              //get values from hidden fields
              var nroCasosPendientes = document.getElementById("hiddenCasos").value;
              var nroRecorPendientes = document.getElementById("hiddenRecordatorios").value;
          }
      
          //...and change this
          var timer = setInterval(function{
              updateBean();
          }, 10000);
      </script>
      

      所以,改变是:

      1. 计时器现在将执行点击按钮,这将导致ajax请求
      2. 隐藏字段由ajax更新
      3. ajax成功后notification()将被称为
      4. notification()nroCasosPendientes的{​​{1}}值 {隐身字段
      5. 将取消nroRecorPendientes