Jsf 使用带有RequestContex Execute的WidgetVar为Bean中的Primefaces组件设置焦点

Jsf 使用带有RequestContex Execute的WidgetVar为Bean中的Primefaces组件设置焦点,jsf,jsf-2,primefaces,focus,Jsf,Jsf 2,Primefaces,Focus,在使用Primefaces RequestContex调用其他组件的函数后,是否有方法设置组件焦点 我试过: RequestContex.getCurrentInstance().execute("PF('WidgetVar').focus();"); 及 我没有出错,但什么也没发生 我错过了什么,还是这不可能 我使用Primefaces 4.0.3和MyFaces 2.0.2 编辑示例代码 豆子 XHTML 看起来您在这里有一些误解: 您可以在RequestContextAPI中执行Java

在使用Primefaces RequestContex调用其他组件的函数后,是否有方法设置组件焦点

我试过:

RequestContex.getCurrentInstance().execute("PF('WidgetVar').focus();");

我没有出错,但什么也没发生

我错过了什么,还是这不可能

我使用Primefaces 4.0.3和MyFaces 2.0.2

编辑示例代码

豆子

XHTML


看起来您在这里有一些误解:

  • 您可以在
    RequestContext
    API中执行Java代码

    RequestContext.getCurrentInstance().execute("(((InputText) event.getComponent()).getWidgetVar()).Focus();");
    
    你不能。上面的代码不起作用<代码>执行仅为JavaScript构建

  • 您要查找的函数名是
    focus()
    。JS区分大小写。因此,
    聚焦焦点
    。所以我认为你应该有

    RequestContext.getCurrentInstance().execute("yourClientSideId.focus();");
    
    其中,
    yourClientSideId
    应该对应于您感兴趣的组件的
    widgetVar
    属性。我不确定您在代码中引用的
    PF
    对象应该是什么。我从来没见过。也许你指的是
    PrimeFaces
    对象

  • 如果上述操作失败,您可以始终在
    RequestContext
    上使用
    scrollTo
    方法:

    RequestContext.getCurrentInstance().scrollTo("yourComponentWidgetVar");
    

    如果前面的答案不起作用,您可以创建一个js函数,例如:

    function focusField(id){
     $(id).focus();
    }
    
    然后在bean中,假设您希望将焦点设置在字段“input4”上,它表示ID而不是Widgetvar

    RequestContext.getCurrentInstance().execute("focusField('#input4');");
    
    您可以使用primefaces中的
    标记,我使用它在运行时设置焦点,如下所示:

    .xhtml代码:

    
    
    .java代码:

    focusProperty=“componentIDToSetFocus”;
    

    不要忘记使用PrimeFaces 6.1更新
    标记的ID

    ,由于未知原因,我无法使PrimeFaces p:focus正常工作。所以,我刚刚实现了一个onload JQuery函数,将焦点设置为p:commandButton。对于onload调用,将jQuery嵌套函数放在下面的“body”中。这是为了确保覆盖任何其他primefaces onload函数

    <script>
         jQuery(document).ready(function () {
              jQuery(document).ready(function () {
                  // twice in document.ready to 
                  // execute after Primefaces callbacks
                  PF('widget_home_page_form_command_button').getJQ().focus();
              });
         });
    </script>
    
    
    jQuery(文档).ready(函数(){
    jQuery(文档).ready(函数(){
    //文档中有两次。准备好了吗
    //在Primefaces回调后执行
    PF('widget_home_page_form_command_button').getJQ().focus();
    });
    });
    

    PrimeFaces为所有PrimeFaces组件创建widgetVar组件。有些功能通过widgetVar可用,例如禁用或启用。但是,我必须使用getJQ()函数来获取jQuery对象,并使用该对象在命令按钮上设置焦点

    我不确定PF是否代表Primefaces对象,但从4.0开始,他们使用了一种新的语法来访问widgetVars。我是从primefaces页面上的对话示例中得到的,所以我认为尝试一下不会有什么坏处。不幸的是,代码对我不起作用。我尝试了widget和id.@Shibas-你也不能使用
    scrollTo
    ?我添加了我的代码。我想通过一个按钮或bean内部的其他事件在输入框之间切换焦点。scrollTo无法正常工作。RequestContext.getCurrentInstance().scrollTo(“widgetVarName”);不工作,屏幕挂起try
    RequestContext.getCurrentInstance().execute($('#input4').focus();)@jerith2:这个评论与已经给出的答案有什么根本性的不同?你编辑的那个?如果你认为这个答案是最好的,请投赞成票one@Kukeltje,初学者可能会认为,需要创建javascript函数来解决焦点问题,因此为了明确这不是必需的,我在注释中给出了解决方案。编辑答案的原因是#解决方案中未提供标记,因此人们最终会使用ID和Widgetvar进行试错,希望这是清楚的@杰里思2:那就把它作为对答案的评论,而不是问题。您甚至可以改进答案并添加功能。您也可以不使用任何功能来完成。如果您遇到无法使
    p:focus
    正常工作的问题,您可以始终尝试创建自己的问题(并自己回答),而不是提供与您尝试回答的问题仅略微相关的答案。对我来说,
    p:focus
    在6.1中以我使用它的方式工作,因此它肯定不是一个通用问题。
    function focusField(id){
     $(id).focus();
    }
    
    RequestContext.getCurrentInstance().execute("focusField('#input4');");
    
    <script>
         jQuery(document).ready(function () {
              jQuery(document).ready(function () {
                  // twice in document.ready to 
                  // execute after Primefaces callbacks
                  PF('widget_home_page_form_command_button').getJQ().focus();
              });
         });
    </script>