【问题标题】:jQuery Autocomplete Multiple Inputs Highlited突出显示的 jQuery 自动完成多个输入
【发布时间】:2012-10-20 00:57:52
【问题描述】:

在 jquery 自动完成中突出显示多个输入时遇到问题。 第一个输入得到突出显示,不幸的是第二个没有:(

所以当我输入 Java 时,这个词会变粗,但之后当我用逗号分隔 java 并输入另一个词时,这个词就不会加粗。

请帮忙

<script>jQuery(document).ready(function() {
    var availableTags=["Java","J2ee","Spring","Hibernate","CSS","HTML","Struts","Struts 2","Maven","Maven 2","Spring Roo","Warszawa","JSF 2.0","EJB"];
    $.extend($.ui.autocomplete.prototype, {
        _renderItem: function( ul, item ) {
            var term = this.element.val(),
                regex = new RegExp( '(' + term + ')', 'gi' );
            html = item.label.replace( regex , "<b>$&</b>" );
            return $( "<li></li>" ).data( "item.autocomplete", item ).append( $("<a></a>").html(html) ).appendTo( ul );
        }
    });

    function split( val ) {
        return val.split( /,\s*/ );
    }

    function extractLast( term ) {
        return split( term ).pop();
    }

    $( "#tags" )
        // don't navigate away from the field on tab when selecting an item
        .bind( "keydown", function( event ) {
            if ( event.keyCode === $.ui.keyCode.TAB &&
                    $( this ).data( "autocomplete" ).menu.active ) {
                event.preventDefault();
            }
        })
        .autocomplete({
            minLength: 0,
            source: function( request, response ) {
                // delegate back to autocomplete, but extract the last term
                response( $.ui.autocomplete.filter(
                    availableTags, extractLast( request.term ) ) );
            },
            focus: function() {
                // prevent value inserted on focus
                return false;
            },
            select: function( event, ui ) {
                var terms = split( this.value );
                // remove the current input
                terms.pop();
                // add the selected item
                terms.push( ui.item.value );
                // add placeholder to get the comma-and-space at the end
                terms.push( "" );
                this.value = terms.join( ", " );
                return false;
            }
        });
});
</script>

【问题讨论】:

    标签: jquery input autocomplete highlight


    【解决方案1】:

    更新

    仔细看代码,问题确实出在这里:

    var term = this.element.val(),
        regex = new RegExp( '(' + term + ')', 'gi' );
    

    您将获得文本框的完整 .val()。像这样修复它:

    regex = new RegExp( '(' + extractLast(term) + ')', 'gi' );
    

    额外

    无论如何,它可能不相关,但我通常会在source:函数中编写它而不是重写_renderItem。像这样:

        source: function (request, response) {
            console.log(request.term);
            var filtered = $.ui.autocomplete.filter(availableTags, extractLast(request.term));
            var regex = new RegExp('(' + extractLast(request.term) + ')', 'gi' );
            var results = [];
            filtered.forEach(function (item) {
                results.push({ label: item.replace(regex , "<b>$1</b>"), value:item });
            });
            response(results);
        },
        html: true, // see below why this is needed.
    

    我已经更新了小提琴中的代码,它现在应该可以工作了:http://jsfiddle.net/95aH7/1/

    重要提示:在加载 jQuery UI 后,您需要在脚本中包含 jquery.ui.autocomplete.html。此外,要使扩展程序正常工作,您需要将 html: true 添加到自动完成选项中(查看小提琴)。

    【讨论】:

    • Tallamaris 感谢您的快速响应。我尝试了您的想法,但没有运气:( 这是链接,可以玩。jsfiddle.net/95aH7 期待收到您的来信,谢谢!
    • 我将拆分更改为抓取逗号和空格,并将最小长度更改为 2 参见 jsfiddle.net/95aH7/3,但此选项仅适用于第一个输入?我如何在所有输入上获得 minlength = 2?
    • minlength 仅用于“激活”,并计入整个文本框。您需要在源函数中检查extractLast(request.term) 的长度,并在这种情况下最终返回一个空数组。看小提琴:jsfiddle.net/95aH7/4
    • 还添加了对原始代码的修复,您的 _renderItem() 只是缺少一点。但是,这也不会修复 minLength 以按您的意愿工作;您需要根据我上面的评论将其编码到 source: 函数中。
    • 大赞!我会记住你未来的付费任务:)
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多