【问题标题】:How to highlight input words in autocomplete jquery ui如何在自动完成 jquery ui 中突出显示输入单词
【发布时间】:2012-03-27 09:45:10
【问题描述】:

您能帮我突出显示自动完成文本框中输入的单词吗?我已经在填充自动完成词,我只需要单独突出显示输入的词。我是 Jquery 自动完成的新手

我得到的输出是像 <Strong>Br</Strong>ijesh 这样的文本 // 被视为文本
而不是单独突出 Br

下面是sn-p

$(document).ready(function () {
$("#studentName").autocomplete({
    source: function (request, response) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "Webservice.asmx/GetStudentNames",
            data: "{'prefixText':'" + request.term + "'}",
            dataType: "json", 
            success: function (data) {
           var regex = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + request.term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi");
                response($.map(data.d, function (item) {
                    return {
                    label: item.split('|')[0].replace(regex, "<Strong>$1</Strong>"),
                    val: item.split('|')[1]
                    }
                }))
            },

            failure: function (response) {
                ServiceFailed(result);
            }
        });
    },
    select: function (event, ui) {
     txtStudent(ui.item.val, ui.item.label); //Student name and id used in this method
    },
    minLength: 2
});
});              // End of ready method

请帮帮我。

【问题讨论】:

  • 再说一句。您使用itemvallabel 属性,但文档(请参阅“数据模型”部分中的here)描述它应该是value(不是val)和label

标签: jquery-ui jquery jquery-autocomplete


【解决方案1】:

在我看来,您应该覆盖 _renderItem 方法以自定义呈现项目。代码大概如下:

$("#studentName").autocomplete({/* all your parameters*/})
    .data("autocomplete")._renderItem = function (ul, item) {
        var newText = String(item.value).replace(
                new RegExp(this.term, "gi"),
                "<span class='ui-state-highlight'>$&</span>");

        return $("<li></li>")
            .data("item.autocomplete", item)
            .append("<div>" + newText + "</div>")
            .appendTo(ul);
    };

在代码中,我使用 jQuery UI CSS "ui-state-highlight" 来突出显示。您可以改用&lt;strong&gt;。此外,我不包括可以转义任何可能位于this.term 内的RegEx 字符的代码。我只想向您解释主要思想。查看the answer 以获取更多信息。

更新:较新版本的 jQuery UI 使用 .data("ui-autocomplete") 而不是 .data("autocomplete")。要使您的代码在(旧版和新版)jQuery 版本中都能正常工作,您可以执行以下操作:

var $elem = $("#studentName").autocomplete({/* all your parameters*/}),
    elemAutocomplete = $elem.data("ui-autocomplete") || $elem.data("autocomplete");
if (elemAutocomplete) {
    elemAutocomplete._renderItem = function (ul, item) {
        var newText = String(item.value).replace(
                new RegExp(this.term, "gi"),
                "<span class='ui-state-highlight'>$&</span>");

        return $("<li></li>")
            .data("item.autocomplete", item)
            .append("<div>" + newText + "</div>")
            .appendTo(ul);
    };
}

更新 2:以同样的方式,名称 "item.autocomplete" 应更改为 "ui-autocomplete-item"。见here

【讨论】:

  • @pal:顺便说一句,我看到你仍然从未使用过你的voting 对。投票是搜索引擎的主要标准。 每天,您可以对大约 30 个问题或答案进行投票(请参阅here)。因此,通过对您在 stackoverflow 上找到的有用信息进行投票,您可以帮助其他访问者找到这些信息。所以我建议你开始使用你的投票权。
  • RegExp(this.term, "gi") 如果搜索词是可以被解析为正则表达式的任何内容,尤其是括号或美元符号之类的内容,则会导致戏剧性(可能引发 JavaScript 错误)。
  • @nness:如果您只需要突出显示文本,您可以使用.toUpperCase().indexOf() 在字符串item.value 中定位子字符串this.term。您可以使用简单的 JavaScript 字符串函数插入 &lt;span&gt;。或者,您可以转义所有特殊字符 before 调用 RegEx(例如,参见 the answer)。我的旧答案的主要思想不是提供完美的解决方案,而只是表明可以使用_renderItem 的自定义实现以自定义方式呈现菜单项。
  • @oleg,绝对明白;我只是想强调任何人在没有正则表达式经验的情况下复制和粘贴代码的潜在问题。
  • 以上代码在我的情况下不起作用我必须使用 $.ui.autocomplete.prototype._renderItem = function (ul, item) {/*其余代码*/}
【解决方案2】:

为了在 jQuery UI 中正确呈现 - v1.12.1 使用“div”,而不是“a”

$.ui.autocomplete.prototype._renderItem = function (ul, item) {        
    var t = String(item.value).replace(
            new RegExp(this.term, "gi"),
            "<strong>$&</strong>");
    return $("<li></li>")
        .data("item.autocomplete", item)
        .append("<div>" + t + "</div>")
        .appendTo(ul);
};

【讨论】:

    【解决方案3】:

    我们也可以这样实现。

     $("#studentName").autocomplete({/* all your parameters*/});
        $.ui.autocomplete.prototype._renderItem = function (ul, item) {        
            var t = String(item.value).replace(
                    new RegExp(this.term, "gi"),
                    "<span class='ui-state-highlight'>$&</span>");
            return $("<li></li>")
                .data("item.autocomplete", item)
                .append("<a>" + t + "</a>")
                .appendTo(ul);
        };
    

    【讨论】:

      【解决方案4】:

      如果你使用的是新的 JQueryUI,你应该替换这个:

      .data("autocomplete")._renderItem
      

      对此:

      .data("uiAutocomplete")._renderItem
      

      【讨论】:

        【解决方案5】:
        $.ui.autocomplete.prototype._renderItem = function (ul, item) {
        item.label = item.label.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(this.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
            return $("<li></li>")
                    .data("item.autocomplete", item)
                    .append("<a>" + item.label + "</a>")
                    .appendTo(ul);
        };
        

        使用这个

        【讨论】:

          【解决方案6】:

          这是我用来使它工作的代码(不区分大小写):

          open: function (e, ui) {
                var acData = $(this).data('ui-autocomplete');
                acData.menu.element.find('li').each(function () {
                   var me = $(this);
                   var keywords = acData.term.split(' ').join('|');
                   me.html(me.text().replace(new RegExp("(" + keywords + ")", "gi"), '<strong>$1</strong>'));
                });
             }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-20
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            • 2013-01-31
            相关资源
            最近更新 更多