代码之家  ›  专栏  ›  技术社区  ›  Saab

突出显示jQuery UI自动完成

  •  14
  • Saab  · 技术社区  · 15 年前

    我正在使用jQuery UI 1.8.6中的autocomplete函数。我想突出显示匹配结果。但由于某些原因,当我使用正则表达式在匹配字符周围添加“强”标记时,字符串将被转义。所以我明白了 [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”是在文本框中输入的文本(在这种情况下: [input type="text" id="autocompleteinputfield" /]

    输出如下:

    [{"Description":"Nothing meaningful","ID":3,"Name":"Joe Public‎"}]
    
    3 回复  |  直到 8 年前
        1
  •  16
  •   Ben Lee    11 年前

    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 );
        };
    });
    

    $(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
  •  8
  •   user3460922    12 年前
    $.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
  •  0
  •   ryan    15 年前

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