Primefacesp:selectOneMenuコンポーネントは、レンダリングされた HTML<select>タグを div でラップし、選択したアイテムを別のラベルとして表示しているようです。ユーザーが行った変更は、おそらくjavascriptによって元に反映され<select>、onchangeイベントがバインドされて機能し<select>なくなります。したがって、すべての s に対する onchange イベントの次のバインドは、:inputs に対して機能しません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>