突出显示jQuery UI自动完成

我在jQuery UI 1.8.6中使用自动完成function。 我想强调匹配的结果。 但出于某种原因,当我使用正则表达式在匹配字符周围添加“强”标签时,字符串将被转义。 所以我看到[strong]matching chars[/strong] ,而不是标记文本。

这是我目前正在使用的javascript:

 $("#autocompleteinputfield").autocomplete({ source: function (request, response) { $.ajax({ url: "someservice", type: "GET", dataType: "json", data: { filter: request.term, maxResults: 10 }, success: function (data) { response($.map(data, function (item) { // return { label: item.ID + ' - ' + item.Name, id: item.ID, value: item.Name } var regex = new RegExp("(?![^&;]+;)(?!<[^]*)(" + request.term.replace(/ ([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/ gi, "\\$1") + ")(?![^]*>)(?![^&;]+;)", "gi"); return { label: (item.ID + ' - ' + item.Name).replace(regex, "$1"), id: item.ID, value: item.Name } })) } }); }, select: function (event, ui) { alert(ui.item ? ("You picked '" + ui.item.label + "' with an ID of " + ui.item.id) : "Nothing selected, input was " + this.value); } }); 

更新:

“输入”是在文本框中输入的文本(在这种情况下: [input type="text" id="autocompleteinputfield" /]

输出看起来像这样:

 [{"Description":"Nothing meaningful","ID":3,"Name":"Joe Public‎"}] 

jQuery自动完成源代码是罪魁祸首。 如果你查看实际的javascript文件,你会发现这个定义在自动完成列表中显示项目:

 _renderItem: function( ul, item) { return $( "
  • " ) .data( "item.autocomplete", item ) .append( $( "" ).text( item.label ) ) .appendTo( ul ); }

    你会看到它附加了“.text(item.label)”,这会导致html被转义。 要解决这个问题,你必须放弃一个黑客来覆盖这个“_renderItem”方法,将标签附加为明文的行替换为将标签附加为html的行。 所以像这样更新你的代码:

     $(function () { $("#autocompleteinputfield").autocomplete({ // leave your code inside here exactly like it was }) .data('autocomplete')._renderItem = function( ul, item ) { return $( "
  • " ) .data( "item.autocomplete", item ) .append( '' + item.label + '' ) .appendTo( ul ); }; });

    更新:对于jQuery的版本> = 1.10,有一些小的修改:

     $(function () { $("#autocompleteinputfield").autocomplete({ // leave your code inside here exactly like it was }) .data('ui-autocomplete')._renderItem = function( ul, item ) { return $( "
  • " ) .data( "ui-autocomplete-item", item ) .append( '' + item.label + '' ) .appendTo( ul ); }; });
     $.extend($.ui.autocomplete.prototype, { _renderItem: function (ul, item) { var searchMask = this.element.val(); var regEx = new RegExp(searchMask, "ig"); var replaceMask = "$&"; var html = item.label.replace(regEx, replaceMask); return $("
  • ") .data("item.autocomplete", item) .append($("").html(html)) .appendTo(ul); } });

    普通的javascript alert()不显示html。 考虑使用模态或其他东西。 或者像其他人说的那样,发布一些特定的输入/输出。