JSF 在呈现 HTML 时会忽略所有自定义属性。
如果您已经使用 JSF 2.2+,只需将其指定为 passthrough attribute:
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:autoComplete a:x-webkit-speech="x-webkit-speech" ... />
如果您还没有使用 JSF 2.2,那么您需要一个自定义渲染器。幸运的是,PrimeFaces <p:autoComplete>(和所有其他组件)相对简单。只需覆盖 renderPassThruAttributes() 方法就足够了,在该方法中,您将要呈现的新属性添加到 attrs 参数,最后委托给超级方法。
例如
package com.example;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.autocomplete.AutoCompleteRenderer;
public class MyAutoCompleteRenderer extends AutoCompleteRenderer {
@Override
protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
String[] newAttrs = new String[attrs.length + 1];
System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
newAttrs[attrs.length] = "x-webkit-speech";
super.renderPassThruAttributes(facesContext, component, newAttrs);
}
}
要让它运行,请在你的 webapp 的faces-config.xml 中注册如下:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.AutoCompleteRenderer</renderer-type>
<renderer-class>com.example.MyAutoCompleteRenderer</renderer-class>
</renderer>
</render-kit>
(您可以通过查看AutoComplete类的源代码来了解组件族和渲染器类型,其中指定为COMPONENT_FAMILY和RENDERER_TYPE常量)
不,@FacesRenderer 注释根本不起作用,当其目的是覆盖本身已经在 faces-config.xml 中注册的自定义渲染器时。