JSF は、設計上、HTML のレンダリング時にすべてのカスタム属性を無視します。
すでに JSF 2.2+ を使用している場合は、単純にpassthrough 属性として指定します。
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:autoComplete a:x-webkit-speech="x-webkit-speech" ... />
まだ JSF 2.2 を使用していない場合は、カスタム レンダラーが必要です。これは、<p:autoComplete>
幸いなことに、PrimeFaces (および他のすべてのコンポーネント) の場合は比較的単純です。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
アノテーションは、それ自体で既に .xml ファイルに登録されているカスタム レンダラーをオーバーライドすることが目的の場合、単に機能しませんfaces-config.xml
。