jquery autocomplete特殊字符串触发器

时间:2014-07-02 14:19:14

标签: javascript jquery autocomplete jquery-ui-autocomplete

我有以下问题:

我必须使用由char“@”

触发的jquery进行特殊的自动完成

问题是,如果我用@开始文本框,它可以工作,但如果我在写了一些字符后输入@,它就不起作用。

它必须如何运作: -i写一些文字,我想从“utilizatoriJson”中添加一个人, - 要添加“utilizatoriJson”中的某人,我必须按下@键,并且自动完成下拉列表必须是apear, - 在我从下拉列表中选择某人或从下拉列表中输入完整标签后,它必须放置空格并让我继续留言

我该怎么做?

我写的代码:

var utilizatoriJson = <%=utilizatoriJson%>;

$( '#textarea_mesaj_colaborare').autocomplete({
    source: utilizatoriJson

})            .autocomplete( "instance" )._renderItem = function( ul, item ) {
    return $( "<li>" )
            .append( "<a>" + item.label + "</a>" )
            .appendTo( ul );
}
$( '#textarea_mesaj_colaborare').autocomplete("disable");


$('#textarea_mesaj_colaborare').keyup(function(){
    if ($('#textarea_mesaj_colaborare').val()[$('#textarea_mesaj_colaborare').val().length-1]==='@'){
        var inceput = $('#textarea_mesaj_colaborare').val().length;

        $( '#textarea_mesaj_colaborare').autocomplete("enable");
    }

});

2 个答案:

答案 0 :(得分:8)

如前所述,这里需要多个单词。

上面已经提供了原始来源的链接。所以,我想展示我从你怀疑中理解的东西。

但是首先让我知道你是否希望自动填充像@&#39; @&#39;所有以&#39; a&#39;开头的标签应该给出仅以&#39; a&#39;开头的结果。而不是包含&#39; a&#39;

的那些

因为我认为这会更好用,所以我有代码用于该部分。

您的HTML

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags" size="50">
</div>

你的JS

$(function() {
    //Since you told that labels start with '@'
    var utilizatoriJson = [
        {'label': "@ActionScript",'id':'1'},
        {'label': "@Java",'id':'2'},
        {'label': "@C++",'id':'3'},
        {'label': "@Javascript",'id':'4'},
        {'label': "@Python",'id':'5'},
        {'label': "@BASIC",'id':'6'},
        {'label': "@ColdFusion",'id':'7'},
        {'label': "@Haskell",'id':'8'},
        {'label': "@Lisp",'id':'9'},
        {'label': "@Scala",'id':'10'}
    ];
    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 ).autocomplete( "instance" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        minLength: 1,
        source: function( request, response ) {
            // delegate back to autocomplete, but extract the last term
            var lastword = extractLast(request.term);
            // Regexp for filtering those labels that start with '@'
            var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( lastword ), "i" );
            // Get all labels
            var labels = utilizatoriJson.map(function(item){return item.label;});
            var results = $.grep(labels ,function( item ){
                             return matcher.test( item );
                        });
            response( $.ui.autocomplete.filter(
            results, lastword ) );
        },
        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;
        }
      });
  });

工作演示:http://jsfiddle.net/AJmJt/2/

如果你不想要我说的话,那么就不需要RegExp匹配,但你需要看看是否以&#39; @&#39;或不。

此行为的代码有效:http://jsfiddle.net/rPfY8/1/

答案 1 :(得分:0)

您不想禁用/重新启用自动完成功能,因为这会阻止控件执行任何操作。你可以按照你提出的方式做到这一点,但还有另一种方法。看一下这里的示例:http://jqueryui.com/autocomplete/#multiple

这应该做你正在寻找的东西,你可以更新过滤器只做&#34;以&#34;开头搜索

这是我所说的JSFIDDLE示例:http://jsfiddle.net/UhL5d/

和相应的Javascript:

$(function () {
    var availableTags = [
        {value: 1, label: "@ActionScript" },
        {value: 2, label: "@AppleScript" },
        {value: 3, label: "@Asp" },
        {value: 4, label: "@BASIC" },
        {value: 5, label: "@C" } ];

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

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

    $("#textarea_mesaj_colaborare").autocomplete({
        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.label);
            // add placeholder to get the comma-and-space at the end
            terms.push("");
            this.value = terms.join(" ");
            return false;
        }
    });
});