自从您发布问题以来已经有一段时间了,但它可能会在未来帮助某人。在过去的几天里,我经历了完全相同的过程。
我需要使用 jquery Chosen 插件(1.1.0 版)搜索带有或不带有特殊字符的选择选项。
我有一个葡萄酒生产商的下拉列表,其中包括带有外国字符的名字,比如 Château Bénitey。在这种情况下,自由文本搜索应该找到具有“château bénitey”和“château benitey”关键字的生产者。
这就是我实现它的方式:
我使用 PHP 将特殊字符动态转换为它们的等价物,例如。“一” => “一”。
<option>
我在 html 的标签中创建了一个额外的属性,称为data-search-text="Château Bénitey Chateau Benitey"
.
然后我修补了选择插件来读取data-search-text
值而不是选项文本。
在 SelectParser.prototype.add_option 方法中,我添加了一个新属性来存储属性值。
this.parsed.push({
array_index: this.parsed.length,
options_index: this.options_index,
value: option.value,
text: option.text,
html: option.innerHTML,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
group_array_index: group_position,
classes: option.className,
style: option.style.cssText, // extra comma ;)
searchTextAttribute: option.getAttribute('data-search-text') // this is the line I added
});
然后我修改了 AbstractChosen.prototype.winnow_results 方法:
代替:
option.search_match = this.search_string_match(option.search_text, 正则表达式);
和:
var textToSearch = option.search_text;
if (option.searchTextAttribute) {
textToSearch = option.searchTextAttribute;
}
option.search_match = this.search_string_match(textToSearch, regex);
我的高级搜索中有多个下拉菜单,因此只有data-search-text
填充了属性的选择才会以这种方式运行。
我还必须删除突出显示选项文本匹配部分的功能,因为它正在破坏它。
if (searchText.length) {
startpos = option.search_text.search(zregex);
text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
}
确保使用以下设置初始化 Chosen 插件,否则它将仅从搜索的开头搜索,并且转换后的文本将不匹配。
$('.your-select').chosen({search_contains: true});