jQuery-chosen - 将所选选项的自定义选项属性推送到列表
jQuery-chosen - Push custom option attribute of selected option to list
我有一个如下所示的选项列表
<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
<option data-user-id="1">User1</option>
<option data-user-id="3">User2</option>
<option data-user-id="6">User3</option>
<option data-user-id="14">User4</option>
</select>
我可以 select 使用 chosen plugin 多个选项。每个 selected 值输入到新的 <li>
元素中,如下所示:
<li class="search-choice"><span>User</span><a class="search-choice-close" data-option-array-index="2"></a></li>
有没有什么办法可以将 data-user-id 从选项推到上面 <li>
.
我可以在不破解所选插件的情况下做到这一点吗?
Below you will find my solution by changing a little bit chosen plugin
我建议使用值属性而不是数据属性。
<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
<option value="1">User1</option>
<option value="3">User2</option>
<option value="6">User3</option>
<option value="14">User4</option>
</select>
然后您可以使用
检索ID
$('select').val(); //use a name or id attribute to make this selector more specific..
在 SelectParser.prototype.add_option
内部,我使用 jquery 获得了我的自定义属性,然后我将其作为一个选项推送。
SelectParser.prototype.add_option
看起来像:
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
if (option.nodeName.toUpperCase() === "OPTION") {
if (option.text !== "") {
if (group_position != null) {
this.parsed[group_position].children += 1;
}
this.parsed.push({
user_id: $(option).attr('data-user-id'),
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
title: option.title ? option.title : void 0,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
group_label: group_position != null ? this.parsed[group_position].label : null,
classes: option.className,
style: option.style.cssText
});
} else {
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
empty: true
});
}
return this.options_index += 1;
}
};
如您所见,我只放了这 user_id: $(option).attr('data-user-id'),
行代码。
然后将数据用户 ID 推送到 <li>
列表,我将这一行 'data-user-id': item.user_id
添加到 Chosen.prototype.choice_build
所以最后它看起来像:
Chosen.prototype.choice_build = function(item) {
var choice, close_link,
_this = this;
choice = $('<li />', {
"class": "search-choice"
}).html("<span>" + (this.choice_label(item)) + "</span>");
if (item.disabled) {
choice.addClass('search-choice-disabled');
} else {
close_link = $('<a />', {
"class": 'search-choice-close',
'data-option-array-index': item.array_index,
'data-user-id': item.user_id
});
close_link.bind('click.chosen', function(evt) {
return _this.choice_destroy_link_click(evt);
});
choice.append(close_link);
}
return this.search_container.before(choice);
};
就是这样!您可以通过这种方式推送任意数量的自定义属性。
我用 chosen_v1.8.7 测试过这个。正如@panagiotis-koursaris 在他的回答中指出的那样,可以将行 user_id: $(option).attr('data-user-id')
添加到第一个函数:
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
if (option.nodeName.toUpperCase() === "OPTION") {
if (option.text !== "") {
if (group_position != null) {
this.parsed[group_position].children += 1;
}
this.parsed.push({
user_id: $(option).attr('data-user-id'),
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
title: option.title ? option.title : void 0,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
group_label: group_position != null ? this.parsed[group_position].label : null,
classes: option.className,
style: option.style.cssText
});
} else {
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
empty: true
});
}
return this.options_index += 1;
}
};
但是你还需要添加这一行 option_el.setAttribute("data-user-id", option.user_id);
到 AbstractChosen.prototype.result_add_option:
AbstractChosen.prototype.result_add_option = function(option) {
var classes, option_el;
if (!option.search_match) {
return '';
}
if (!this.include_option_in_results(option)) {
return '';
}
classes = [];
if (!option.disabled && !(option.selected && this.is_multiple)) {
classes.push("active-result");
}
if (option.disabled && !(option.selected && this.is_multiple)) {
classes.push("disabled-result");
}
if (option.selected) {
classes.push("result-selected");
}
if (option.group_array_index != null) {
classes.push("group-option");
}
if (option.classes !== "") {
classes.push(option.classes);
}
option_el = document.createElement("li");
option_el.className = classes.join(" ");
if (option.style) {
option_el.style.cssText = option.style;
}
option_el.setAttribute("data-option-array-index", option.array_index);
// Add the line below
option_el.setAttribute("data-user-id", option.user_id);
option_el.innerHTML = option.highlighted_html || option.html;
if (option.title) {
option_el.title = option.title;
}
return this.outerHTML(option_el);
};
我有一个如下所示的选项列表
<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
<option data-user-id="1">User1</option>
<option data-user-id="3">User2</option>
<option data-user-id="6">User3</option>
<option data-user-id="14">User4</option>
</select>
我可以 select 使用 chosen plugin 多个选项。每个 selected 值输入到新的 <li>
元素中,如下所示:
<li class="search-choice"><span>User</span><a class="search-choice-close" data-option-array-index="2"></a></li>
有没有什么办法可以将 data-user-id 从选项推到上面 <li>
.
我可以在不破解所选插件的情况下做到这一点吗?
Below you will find my solution by changing a little bit chosen plugin
我建议使用值属性而不是数据属性。
<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
<option value="1">User1</option>
<option value="3">User2</option>
<option value="6">User3</option>
<option value="14">User4</option>
</select>
然后您可以使用
检索ID$('select').val(); //use a name or id attribute to make this selector more specific..
在 SelectParser.prototype.add_option
内部,我使用 jquery 获得了我的自定义属性,然后我将其作为一个选项推送。
SelectParser.prototype.add_option
看起来像:
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
if (option.nodeName.toUpperCase() === "OPTION") {
if (option.text !== "") {
if (group_position != null) {
this.parsed[group_position].children += 1;
}
this.parsed.push({
user_id: $(option).attr('data-user-id'),
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
title: option.title ? option.title : void 0,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
group_label: group_position != null ? this.parsed[group_position].label : null,
classes: option.className,
style: option.style.cssText
});
} else {
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
empty: true
});
}
return this.options_index += 1;
}
};
如您所见,我只放了这 user_id: $(option).attr('data-user-id'),
行代码。
然后将数据用户 ID 推送到 <li>
列表,我将这一行 'data-user-id': item.user_id
添加到 Chosen.prototype.choice_build
所以最后它看起来像:
Chosen.prototype.choice_build = function(item) {
var choice, close_link,
_this = this;
choice = $('<li />', {
"class": "search-choice"
}).html("<span>" + (this.choice_label(item)) + "</span>");
if (item.disabled) {
choice.addClass('search-choice-disabled');
} else {
close_link = $('<a />', {
"class": 'search-choice-close',
'data-option-array-index': item.array_index,
'data-user-id': item.user_id
});
close_link.bind('click.chosen', function(evt) {
return _this.choice_destroy_link_click(evt);
});
choice.append(close_link);
}
return this.search_container.before(choice);
};
就是这样!您可以通过这种方式推送任意数量的自定义属性。
我用 chosen_v1.8.7 测试过这个。正如@panagiotis-koursaris 在他的回答中指出的那样,可以将行 user_id: $(option).attr('data-user-id')
添加到第一个函数:
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
if (option.nodeName.toUpperCase() === "OPTION") {
if (option.text !== "") {
if (group_position != null) {
this.parsed[group_position].children += 1;
}
this.parsed.push({
user_id: $(option).attr('data-user-id'),
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
title: option.title ? option.title : void 0,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
group_label: group_position != null ? this.parsed[group_position].label : null,
classes: option.className,
style: option.style.cssText
});
} else {
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
empty: true
});
}
return this.options_index += 1;
}
};
但是你还需要添加这一行 option_el.setAttribute("data-user-id", option.user_id);
到 AbstractChosen.prototype.result_add_option:
AbstractChosen.prototype.result_add_option = function(option) {
var classes, option_el;
if (!option.search_match) {
return '';
}
if (!this.include_option_in_results(option)) {
return '';
}
classes = [];
if (!option.disabled && !(option.selected && this.is_multiple)) {
classes.push("active-result");
}
if (option.disabled && !(option.selected && this.is_multiple)) {
classes.push("disabled-result");
}
if (option.selected) {
classes.push("result-selected");
}
if (option.group_array_index != null) {
classes.push("group-option");
}
if (option.classes !== "") {
classes.push(option.classes);
}
option_el = document.createElement("li");
option_el.className = classes.join(" ");
if (option.style) {
option_el.style.cssText = option.style;
}
option_el.setAttribute("data-option-array-index", option.array_index);
// Add the line below
option_el.setAttribute("data-user-id", option.user_id);
option_el.innerHTML = option.highlighted_html || option.html;
if (option.title) {
option_el.title = option.title;
}
return this.outerHTML(option_el);
};