這不是一個錯誤。
你可能混淆了SelectItem的標籤與選擇的標籤(見下圖)
渲染HTML看起來是這樣的:
<div class="ui-selectonemenu ui-widget ui-state-default ui-corner-all"
id="form:oneMenu" style="min-width: 47px;">
<div class="ui-helper-hidden-accessible">
<input name="form:oneMenu_focus" class="mb-user-select-none"
id="form:oneMenu_focus" role="combobox" aria-disabled="false"
aria-expanded="false" aria-haspopup="true"
aria-describedby="form:oneMenu_2"
aria-activedescendant="form:oneMenu_2"
aria-owns="form:oneMenu_items" aria-autocomplete="list"
onfocus="changeSelectedLabel()" onblur="changeSelectedLabel()" type="text"
autocomplete="off">
</div>
<div class="ui-helper-hidden-accessible">
<select name="form:oneMenu_input" tabindex="-1"
id="form:oneMenu_input" data-p-hl="onemenu">
<option value="100">100</option>
<option value="101">101</option>
<option value="102">102</option></select>
</div>
<label class="ui-selectonemenu-label ui-inputfield ui-corner-all" id="form:oneMenu_label"><u>102</u></label>
<div
class="ui-selectonemenu-trigger ui-state-default ui-corner-right">
<span class="ui-icon ui-icon-triangle-1-s ui-c"></span>
</div>
</div>
一個label
呈現爲所選的標籤。 (見SelectOneMenuRenderer#encodeLabel)
所以,即使你設置SelectItem.escape
屬性false
或添加itemLabelEscaped="false"
屬性f:selectItems
, 選擇的標籤仍然會逃脫。
爲了逃避選擇的標籤,請參閱下面的代碼波紋管:
腳本
<script type="text/javascript">
function changeSelectedLabel() {
console.log('change!!');
var label = $("label[id='form:oneMenu_label']");
var text = label.text();
label.text("");
label.append(text);
}
$(window).bind("load", function() {
changeSelectedLabel();
});
</script>
selectOneMenu用於
<p:selectOneMenu id="oneMenu" onfocus="changeSelectedLabel()" onblur="changeSelectedLabel()">
<f:selectItems value="#{selectOneTestController.formattedSelectItems()}" itemLabelEscaped="false"/>
</p:selectOneMenu>
這將改變在窗口中選定的標籤加載並選擇一個菜單的onfocus
和onblur
事件。
爲什麼我用onfocus
和onblur
而不是onchange
?
使用onchange
會在selectOneMenu展開時將選定標籤返回給其轉義值,如果您沒有更改/選擇某個項目。
隨意玩這個到什麼適合您的要求。
問候,
在現代JSF的版本,它不需要再創造「的SelectItem」的對象...... – Kukeltje