【问题标题】:Highlight jQuery UI autocomplete突出显示 jQuery UI 自动完成
【发布时间】:2010-11-05 15:08:59
【问题描述】:

我在 jQuery UI 1.8.6 中使用自动完成功能。我想突出匹配结果。但由于某种原因,当我使用正则表达式在匹配字符周围添加“强”标签时,字符串被转义。所以我看到[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, "<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" /]

输出如下所示:

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

【问题讨论】:

  • 响应中进来ajax数据的时候是什么样子的?

标签: jquery jquery-ui


【解决方案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 被转义。为了解决这个问题,您必须使用 hack 来覆盖此“_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);
        }
    });
    

    【讨论】:

    • 完美覆盖(使用 rails jquery ui gem)
    【解决方案3】:

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

    【讨论】:

    • 我认为他在选择中的“警报”只是一个测试,最终会被实际运行的代码所取代。问题是 jQuery 自动完成插件不支持实际自动竞争列表中标签中的 html - 您必须添加一个 hack 才能使其工作。
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多