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

时间:2013-12-13 13:23:45

标签: jsf jsf-2 primefaces focus

有没有办法在使用Primefaces RequestContex调用其他组件的函数后设置我的组件焦点?

我试过了:

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

RequestContex.getCurrentInstance().execute("(((InputText) event.getComponent()).getWidgetVar()).focus();");

我没有收到错误但没有任何反应。

我错过了什么或者这是不可能的?

我使用的是Primefaces 4.0.3和MyFaces 2.0.2

编辑示例代码

import java.io.Serializable;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;

import org.primefaces.context.RequestContext;

public class NavigationBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private String input;

    public NavigationBean() {}

    @PostConstruct
    public void init() {

    }

    public void goNext() {
        Logger.getAnonymousLogger().warning("GONEXT");
        RequestContext.getCurrentInstance().scrollTo("w3");

    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

}

XHTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head>


</h:head>

<h:body >

<h:form id="form">
<h:inputText id="input1" value="#{navigationBean.input}" widgetVar="w1"></h:inputText>
<h:inputText id="input2" value="#{navigationBean.input}" widgetVar="w2"></h:inputText>
<h:inputText id="input3" value="#{navigationBean.input}" widgetVar="w3"></h:inputText>
<h:inputText id="input4" value="#{navigationBean.input}" widgetVar="w4"></h:inputText>
    <p:commandButton value="focus" action="#{navigationBean.goNext()}" />

</h:form>


</h:body>

</html>

4 个答案:

答案 0 :(得分:4)

你可以使用来自primefaces的<p:focus>标签,我用它在运行时设置焦点如下:

.xhtml代码:

<p:focus id="focusID" for="#{yourBean.focusProperty}" />

.java代码:

focusProperty="componentIDToSetFocus";

请勿忘记更新<p:focus>代码

的ID

答案 1 :(得分:2)

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

function focusField(id){
 $(id).focus();
}

然后在你的bean中,假设你想把焦点集中在字段&#34; input4&#34; ,它代表ID而不是Widgetvar

RequestContext.getCurrentInstance().execute("focusField('#input4');");

答案 2 :(得分:1)

使用PrimeFaces 6.1,由于原因未知,我无法获得主要的p:焦点工作。所以,我刚刚实现了一个onload JQuery函数来将焦点设置为p:commandButton。对于onload调用,将jQuery嵌套函数放在&#39; body&#39;中。这是为了确保覆盖任何其他主要的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>

PrimeFaces为所有主要组件创建widgetVar组件。虽然widgetVar可以使用某些功能,例如禁用或启用。但是,我不得不使用getJQ()函数来获取jQuery对象,并使用该对象将焦点设置在命令按钮上。

答案 3 :(得分:0)

看起来你在这里有几个误解:

  1. 您可以在RequestContext API中执行 Java 代码。

    RequestContext.getCurrentInstance().execute("(((InputText) event.getComponent()).getWidgetVar()).Focus();");
    

    你做不到。上面的代码不起作用。 execute仅适用于 JavaScript

  2. 您要查找的函数名称为focus()。 JS区分大小写。所以Focus <> focus。所以我认为你应该拥有的是

    RequestContext.getCurrentInstance().execute("yourClientSideId.focus();");
    

    yourClientSideId应该与您感兴趣的组件的widgetVar属性相对应。我不确定您在代码中引用的PF对象是什么成为。我从未见过它。也许你的意思是PrimeFaces对象?

  3. 如果上述情况失败,您可以随时使用scrollTo上的RequestContext方法:

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