Primefacesp:selectOneMenu
コンポーネントは、レンダリングされた HTML<select>
タグを div でラップし、選択したアイテムを別のラベルとして表示しているようです。ユーザーが行った変更は、おそらくjavascriptによって元に反映され<select>
、onchangeイベントがバインドされて機能し<select>
なくなります。したがって、すべての s に対する onchange イベントの次のバインドは、:input
s に対して機能しませんp:selectOneMenu
。
function applyChangeHandler() {
$(':input').on('change', function() {
console.log('on change: ' + this.id);
});
}
ただし、の onchange 属性が発生していますp:selectOneMenu
。そのため、Primefaces は内部でこのハンドラーをトリガーします (これも推測です)。
<p:selectOneMenu id="myList" onchange="console.log('selectOneMenu')">
<f:selectItem itemLabel="val1" itemValue="val1"/>
<f:selectItem itemLabel="val2" itemValue="val2"/>
</p:selectOneMenu>
したがって、私の要件は、p:selectOneMenu
上記の applyChangeHandler() 関数から onchange ハンドラーをすべての s にバインドすることです。または、Primefaces 固有の API を使用して手動でトリガーするか、他の方法でトリガーすることもできます。それ以外の場合は、代わりに使用することで簡単に回避できますh:selectOneMenu
。
私の目標は、「ページ上の未保存の変更」を検出することです。したがって、上記のスクリプトは次のように共通のテンプレートに配置されます。
<p:outputPanel id="sc" autoUpdate="true">
<script type="text/javascript">
applyChangeHandler();
</script>
</p:outputPanel>