【问题标题】:JSF invoke backing bean method and reRender components on ENTER keyJSF 在 ENTER 键上调用支持 bean 方法和重新渲染组件
【发布时间】:2011-01-20 00:52:29
【问题描述】:

我有一个带有搜索字段的数据表。我希望在按下 ENTER 键时调用支持 bean 上的方法,以及重新渲染 DataTable。

到目前为止,我的方法仅适用于 IE 6 和 7,不适用于 FF。这是输入文本:

<h:inputText
 value="#{applicantProductListBean.applicantNameFilterValue}"
 id="applicantNameFilterValue" onkeypress="submitByEnter(event)">
</h:inputText>

这是我调用的 Javascript 方法:

 function submitByEnter(e){
 if(e.keyCode==13){
      // alert("Enter was pressed");
      e.returnValue=false;
      e.cancel=true;
      document.getElementById("applicantProductListForm:refreshButton").click();
 } 
}

可以看到,Javascript方法点击按钮刷新,页面存在:

<a4j:commandButton value="Refresh" id="refreshButton"
 action="#{applicantProductListBean.refreshData}"
 image="/images/icons/refresh48x48.gif"
 reRender="table, scroller">
</a4j:commandButton>

refreshData 方法不返回任何内容。如前所述,这只适用于 IE 6 和 IE 7。

有谁知道为什么它在 FF 中不起作用?

我正在考虑的一个替代方案是 HotKey,它确实可以捕获 ENTER 事件,它只能调用 Javascript,因此不合适。

是通过 RichFaces 还是纯 JSF 执行此操作的正确方法?

干杯!

更新:

稍微修改了BalusC的答案,有效的脚本是:

if (event.preventDefault) {
// Firefox
event.preventDefault(); 
} else {
// IE 
event.returnValue = false; 
}

【问题讨论】:

    标签: javascript events jsf richfaces


    【解决方案1】:

    以下确实对我有用:

    <h:panelGrid onkeypress="searchByEnterAndReturn(event)">
        <b:aCustomComponent value="#{evolutionBackingAction.value}" id="someID"/>
    </h:panelGrid>
    
    <a4j:commandButton value="Search Now" action="search" id="searchButton"/>
    
    <script type="text/javascript">
        function searchByEnterAndReturn(e){ 
            if(e.keyCode==13){
                document.getElementById("generalForm:pageHeader:searchButton").click(); 
            }  
         }
    </script>
    

    这可行,但要找到我的搜索按钮的 ID,我必须搜索我的页面的源代码,因为无法找到 searchButton id 本身!

    我可以在 customComponent 上执行此操作,但我可以控制此组件的源代码,并且未实现 onkeypress 方法。

    【讨论】:

      【解决方案2】:

      尝试将 JS 块替换为:

      function submitByEnter(e){
          if (e.keyCode == 13) {
              e.preventDefault();
              document.getElementById("applicantProductListForm:refreshButton").click();
          } 
      }
      

      或更好,

      function submitByEnter(e){
          if (e.keyCode == 13) {
              document.getElementById("applicantProductListForm:refreshButton").click();
              return false;
          } else {
              return true;
          }
      }
      

      和输入的onkeypress by

      onkeypress="return submitByEnter(event)"
      

      如果不行,运行Firebug的JS调试器,看看JS代码是否按预期运行。

      【讨论】:

      • 不客气。但是,它不适用于(非常)旧的浏览器。在您应该支持的所有浏览器中进行测试。
      • 我进行了更新(我检查 preventDefault 是否存在并调用它或将 returnValue 设置为 false)。我在IE6、IE7、FF中测试过。
      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2018-04-04
      • 2011-02-06
      • 1970-01-01
      • 2015-10-06
      • 2012-08-03
      相关资源
      最近更新 更多