我想使用<select>
替换自定义文本格式jQuery UI Selectmenu
。
这个小提琴中的第三和第五选择是我想要实现的好例子:
http://jsfiddle.net/fnagel/GXtpC/
在小提琴中,定义了函数addressFormatting()
,它接受原始选项文本并返回将用于呈现选择菜单的html输出。此函数在selectmenu初始化中作为回调传递:
$('select').selectmenu({
format: addressFormatting
});
我正在使用jQuery UI Selectmenu 1.11.4
。问题是此版本中不存在format
回调选项。
这是来自jQuery UI Selectmenu version 1.5.0pre
的代码的一部分,在提供的小提琴中使用:
$.widget("ui.selectmenu", {
options: {
appendTo: "body",
typeAhead: 1000,
style: 'dropdown',
positionOptions: null,
width: null,
menuWidth: null,
handleWidth: 26,
maxHeight: null,
icons: null,
format: null, // <<<<<<<<<<<< FORMAT OPTION IS PRESENT <<<<<<<<<<<<
escapeHtml: false,
bgImage: function() {}
},
这是我正在使用的较新版本的代码部分:
var selectmenu = $.widget( "ui.selectmenu", {
version: "1.11.4",
defaultElement: "<select>",
options: {
appendTo: null,
disabled: null,
icons: {
button: "ui-icon-triangle-1-s"
},
position: {
my: "left top",
at: "left bottom",
collision: "none"
},
width: null,
// callbacks
change: null,
close: null,
focus: null,
open: null,
select: null
},
format
选项在此处不存在,并且在初始化中使用它无效。
在API documentation中,有_renderItem()
方法,其名称建议可以用于向select添加自定义格式,但它具有私有范围,因此我无法使用它来自小部件的外部。还有公共create()
方法,但我不确定我是否可以或者是否应该使用它来更改已创建的selectmenu的结构。
答案 0 :(得分:0)
如上所述,格式选项在它是jquery-ui库的一部分之前已从selectmenu中删除。有一种方法可以将自定义代码注入selectmenu小部件并覆盖处理此功能的函数。
// Create objects that you want inside the menu list
var RenderItem = function(item) {
return $('<div/>')
.addClass('ui-menu-item-wrap')
.append(
$('<span/>')
.addClass('ui-menu-item-header')
.text(item.label + ' (' + item.km + " km)")
).append(
$('<span/>')
.addClass('ui-menu-item-description')
.text(item.desc)
);
};
// Extend functions in the selectmenu plugin
$.widget("ui.selectmenu", $.ui.selectmenu, {
// Input middleware to the _setText function, that will build
// jQuery objects to render
_renderItem: function( ul, item ){
var li = $( "<li>" ),
wrapper = $( "<div>", {
title: item.element.attr( "title" )
} );
if ( item.disabled ) {
this._addClass( li, null, "ui-state-disabled" );
}
// Insert middleware
this._setText( wrapper, RenderItem(item));
return li.append( wrapper ).appendTo( ul );
},
// Overwrite this function to add custom attribute values from the option
_parseOption: function( option, index ) {
var optgroup = option.parent( "optgroup" );
return {
element: option,
index: index,
value: option.val(),
label: option.text(),
desc: option.attr('data-desc'), // Custom <option> value saved to item
km: option.attr('data-km'), // Custom <option> value saved to item
optgroup: optgroup.attr( "label" ) || "",
disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
};
},
// Overwrite this function to append a value, instead of inserting text
// So that the jQuery element is handled correctly.
_setText: function(element, value) {
if (value) {
element.append(value);
} else {
element.html(" ");
}
}
});