Выделите автозаполнение jQuery UI

Я использую функцию автозаполнения в jQuery UI 1.8.6. И я хочу выделить соответствующие результаты. Но по какой-то причине, когда я использую регулярное выражение для добавления "сильных" тегов вокруг совпадающих символов, строка сбрасывается. Поэтому я вижу [strong]matching chars[/strong] вместо помеченного текста.

Это javascript, который я использую в настоящее время:

 $(function () {

    $("#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, "<strong>$1</strong>"),
                                 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" /]

Результат выглядит следующим образом:

[{ "Описание": "Ничего значимого", "ИД": 3, "Имя": "Джо публично" }]

Ответы

Ответ 1

Исходный код автозаполнения jQuery является виновником. Если вы посмотрите в фактических файлах javascript, вы найдете это определение для отображения элементов в списке автозаполнения:

_renderItem: function( ul, item) {
    return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( $( "<a></a>" ).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 $( "<li></li>" )
            .data( "item.autocomplete", item )
            .append( '<a>' + item.label + '</a>' )
            .appendTo( ul );
    };
});

Обновление: с версией >= 1.10 из jQuery существуют небольшие модификации:

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

Ответ 2

$.extend($.ui.autocomplete.prototype, {
    _renderItem: function (ul, item) {
        var searchMask = this.element.val();
        var regEx = new RegExp(searchMask, "ig");
        var replaceMask = "<b style=\"color:green;\">$&</b>";
        var html = item.label.replace(regEx, replaceMask);

        return $("<li></li>")
            .data("item.autocomplete", item)
            .append($("<a></a>").html(html))
            .appendTo(ul);
    }
});

Ответ 3

Обычный javascript alert() не отображает html. Посмотрите на использование модального или что-то еще. Или, как говорили другие, опубликуйте определенный ввод/вывод.