始终显示自动完成列表,即使搜索不匹配

Posted

技术标签:

【中文标题】始终显示自动完成列表,即使搜索不匹配【英文标题】:Always show autocomplete list, even if search doesn't match 【发布时间】:2018-11-09 07:44:14 【问题描述】:

我有一个自动完成字段,在输入类型时我会转到 php/数据库以检索匹配选项。

问题是,我的建议列表与文本不完全匹配。我解释一下:

假设我输入“Jon”。我的列表将从数据库“John Doe”、“Jonatan”等中获取。只有“Jonatan”作为输入的建议可见,但我确实需要它们,因为它考虑了近似值(我的上有一个 soundex 元素后端搜索)。

我的 javascript/Ajax 代码:

function prePatientsList()
      //I'm limiting search so it only starts on the second character
    	if (document.getElementById("name").value.length >= 2)  

            try
            
            	listExecute.abort();
        	catch(err) 
        	   null;
        	
            var nome= $("#name").val();
            var nomeList = "";
            listExecute = $.ajax(
                    url: '/web/aconselhamento/Atendimento/PrePacientesAutocomplete',
                    type: "POST",
                    async: true,
                    datatype: 'json',
                    data:  nome: nome
             ).done(function(data)
            	 source = JSON.parse(data);
             );
            
            
            $(function() 
            	$("input#nome").autocomplete(
                    source: source,
                    // I know I probably don't need this, but I have a similar component which has an URL as value, so when I select an option, it redirects me, and I'll apply you kind answer on both.
                    select: function( event, ui )                     	
                        ui.item.label;
                    
                );
            );
    	     

    

谢谢。

【问题讨论】:

我唯一的建议是使用正则表达式。 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/… 仍然需要做很多工作来分解字符串等。祝你好运:) 没有看到你的后端代码,很难确定,但我猜你需要研究更好的文本搜索实现。例如,如果没有 Levenshtein 距离或 n-gram 索引,您可能会发现很难找到相近的匹配。也许看看 Elasticsearch 或 Apache Solr? 我的后端已经给了我正确的 JSON。如果我键入 Jon,我的建议列表变量(在本例中为源)将获得正确的值(John Doe 等)。问题是:自动完成文本输入只会显示完全匹配的列表项目。我的列表与我的 soundex 匹配,所以我需要一直显示整个列表。 @ryuzakixd 请提供一个正在返回的 JSON 数据的示例。由于您是从返回的数据中本地过滤源,因此它非常基本。如果这个词是Jon,它不会命中John。您必须为此创建自己的算法。 【参考方案1】:

我认为您必须将远程端点直接设置为自动完成的源(例如,类似于https://jqueryui.com/autocomplete/#remote),以便它是执行所有过滤的后端。现在,自动完成功能实际上认为您已经为它提供了一个静态选项列表,应该从中进行进一步过滤,因此它决定自己处理过滤。

您的代码可以像我想的那样简单,无需在自动完成范围之外有单独的处理程序或 ajax 请求。

$(function() 
  $("input#nome").autocomplete(
    minLength: 2, //limit to only firing when 2 characters or more are typed
    source: function(request, response) 
    
      $.ajax(
        url: '/web/aconselhamento/Atendimento/PrePacientesAutocomplete',
        type: "POST",
        dataType: 'json',
        data:  nome: request.term  //request.term represents the value typed by the user, as detected by the autocomplete plugin
     ).done(function(data)
         response(data); //return the data to the autocomplete as the final list of suggestions
     );
    ,
    // I know I probably don't need this, but I have a similar component which has an URL as value, so when I select an option, it redirects me, and I'll apply you kind answer on both.
    select: function( event, ui )                      
      ui.item.label;
    
  );
);

请参阅http://api.jqueryui.com/autocomplete/#option-source 了解更多信息。

【讨论】:

非常感谢!我很抱歉我的回复迟到了。我无法立即验证它,因为我有一段时间无法访问我的环境。我唯一需要做的改变是:response(JSON.parse(data)); @ryuzakixd 你不应该这样做 - 我只是打错了。 datatype: "json" 应该是 dataType: "json" - 然后 jQuery 会为您处理解析。那么你就不需要额外的JSON.parse 电话了。我已经更新了答案以修复错字。

以上是关于始终显示自动完成列表,即使搜索不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使 jQuery 自动完成列表显示所有选项 onfocus 并在选择选项后隐藏?

jQueryUI自动完成在没有匹配时在下拉列表中显示“其他”并让用户能够选择它

jQuery UI 自动完成 - 输入与结果集不匹配时不显示结果

Jquery UI自动完成列表不刷新

使用 React Material-UI 自动完成始终显示默认选项

有没有办法通过使用自动完成来缓存和显示搜索列表