为什么';JQuery UI自动完成样式减号(-)在选项中正确 安装程序
我使用jQueryUI创建一个自动完成列表。它会弹出焦点选项。我不决定这些选择。有些是用户从数据库配置的,有些是由第三方标准设置的。我正在使用jQuery1.11.1和jQueryUI1.11.1。我正在使用chrome电脑(Windows8.1)和mac。版本/os/浏览器似乎没有什么不同。我使用的是默认的jquery样式表 问题 其中一个预先指定的选项列表仅包含加号(+)和减号(-)。我想把这些改成“肯定”和“否定”之类的文字,但这不是一个选项。减号(-)的格式不正确。它在选项列表中始终显示为空行。在下图中,两个空行是负号(-) 代码 它非常简单,很容易复制。我有一本书 基本上是带有js代码的文本字段类型输入:为什么';JQuery UI自动完成样式减号(-)在选项中正确 安装程序,jquery,jquery-ui,autocomplete,Jquery,Jquery Ui,Autocomplete,我使用jQueryUI创建一个自动完成列表。它会弹出焦点选项。我不决定这些选择。有些是用户从数据库配置的,有些是由第三方标准设置的。我正在使用jQuery1.11.1和jQueryUI1.11.1。我正在使用chrome电脑(Windows8.1)和mac。版本/os/浏览器似乎没有什么不同。我使用的是默认的jquery样式表 问题 其中一个预先指定的选项列表仅包含加号(+)和减号(-)。我想把这些改成“肯定”和“否定”之类的文字,但这不是一个选项。减号(-)的格式不正确。它在选项列表中始终显示
var $input = $('input');
$input.autocomplete(
{
source: ['+', '-', '-', '+'],
minLength: 0
});
$input.autocomplete('search', '');
解决方案
减号(-)似乎是某种标记字符,在列表中创建分隔符。这在其他用例中似乎很有用,但对我来说,它破坏了一切。我试图做一个encodeURIComponent
,但当然没有效果。我不想覆盖任何js或jquery ui css来显示此字符,因为如果我合法地需要分隔符,它可能会破坏站点上的其他行为
问题
如何让jQueryUIAutoComplete将这个减号(-)显示为正常选项
更新1
似乎自动完成实际上使用ui.menu.\u isDivider函数来确定该值是否为除法器。我黑了jqueryui来证实这一点。显然,对图书馆进行黑客攻击并不理想。在附加autocomplete之前,他们是否可以覆盖菜单ui功能?也许是一个可以编辑widgets初始化脚本的函数?回答我自己的问题。
明白了
因此,我找到了菜单。_isDivider
函数用于定义自动完成中的除法器。当autocomplete创建菜单实例以存储其值时
我试图覆盖autocomplete实例的\u isDivider
函数,但似乎初始化后对于初始搜索来说太晚了。也许我可以在更新后添加这些值,但我还没有尝试过
因此,我必须在初始化之前找到覆盖函数的方法。这是:
jQuery.ui.menu.prototype._isDivider = function(){return false}
工作实例
当然,您可以将其替换为任何正则表达式或其他类型的搜索,以将其他特定值设置为除法器
直接从jquery ui(匹配空格或破折号):
当然,这个解决方案在设置之后会影响所有jQueryUI元素。所以要当心。虽然OP已经在问题的更新中以及在中找到了许多细节,但我发现我认为解决问题的方法更加可控 正如OP所指出的,问题在于,根据菜单默认实现的规范,创建和: 默认情况下,仅包含空格和/或破折号的任何项目都被视为分隔符 然而,jQueryUI提供了一种很好的解决方法,它允许访问所有必要的组件。一个例子是:
$('some selector')。自动完成('widget')。菜单('instance')。\u isDivider=function(){
返回false;
};
该部分获取与autocomplete元素关联的菜单元素。该部分获取菜单实例,该实例是创建菜单时返回的对象。从那里,您可以随意覆盖
\u isDivider
方法。问题在于jQueryUI使用-
作为将除法器插入下拉列表的键。这是没有办法的。甚至不能使用字符实体(例如
)代替-
,因为jQuery使用text()
填充项目。您可能最好使用另一个自动完成库,而不是绕过这种短视。这是jQueryUI不太好的另一个原因。@RoryMcCrossan我已经使用jquery多年了,仅仅因为一个疏忽而随意说“它不太好”是一种无知。除此之外,它的精益,灵活,强大,性能和全面。在这里留下有用的评论,并在您的意见博客中创建jQueryUI。这不是随机的——jQueryUI中有很多类似的问题。我还花时间诊断了你的问题,所以欢迎你这么做。@Rorymcrossan我已经在我的问题中指出了这个问题。谢谢你的阅读,但“只是不要使用那个真正强大的库”并不是一个有用的评论。我将离开你去寻找解决方案,并祝你好运。由于这是一个特定于实例的覆盖,我认为这是一个更好的解决方案。现在标记为已接受的答案,而不是我自己的答案。
return !/[^\-\u2014\u2013\s]/.test( item.text() );