【问题标题】:jquery autocomplete special char triggerjquery自动完成特殊字符触发器
【发布时间】:2014-08-23 09:19:34
【问题描述】:

我有以下问题:

我必须使用 char "@" 触发的 jquery 进行特殊的自动完成

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

它必须如何工作: -我写了一些文字,我想从“utilizatoriJson”中添加某人, - 要从“utilizatoriJson”中添加某人,我必须按@键并且必须出现自动完成下拉菜单, - 在我从下拉列表中选择某人或从下拉列表中输入完整标签后,它必须放置空间并让我继续我的消息

我该怎么做?

我写的代码:

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

});

【问题讨论】:

  • 您希望“@”符号实际打印在搜索框中吗?
  • 是的,“@”符号仍然保留在搜索框中,utilizatoriJson 的标签也包含“@”符号,位于每个字符串的开头
  • 嘿@Stefan ...你解决了你的问题吗?我已经回答了,想知道你的案子到底想要什么……
  • 如果问题得到解决,为什么不接受答案:P

标签: javascript jquery autocomplete jquery-ui-autocomplete


【解决方案1】:

如前所述,您需要在这里使用多个单词。

上面已经提供了原始来源的链接。所以,我想展示一下我从你的疑问中理解的内容。

但首先让我知道您是否想在“@”之后进行自动补全,所有以“a”开头的标签都应该给出只以“a”开头的结果,而不是那些包含“a”的结果。

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

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

$(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;
      }
    });
});
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.0/jquery-ui.js"></script>

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

如果你不想像我说的那样,那么就不需要正则表达式匹配,但是你需要看看单词是否以'@'开头。

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

$(function() {
  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);
          if(lastword[0] != '@')
              return false;
          // Get all labels
          var labels = utilizatoriJson.map(function(item){return item.label;});
          response( $.ui.autocomplete.filter(
          labels, 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;
      }
    });
});
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.0/jquery-ui.js"></script>

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

【讨论】:

  • 这解决了我的问题,非常感谢你! :) 但我注意到,如果我输入 @ 然后我删除 @ 自动完成保持打开状态,直到我按下退出键
  • 这是因为 minLength 设置为 0。我认为这是正常行为。将其设置为 1。我将编辑我的答案。
  • 完成,再次感谢您,抱歉耽搁了,我是新来的 :) 我接受了答案,但图标没有保持绿色
  • 你能告诉我,如何在列表中显示没有'@'符号的标签
  • @Komal 如果您根据您的具体要求创建一个新问题会更好:)
【解决方案2】:

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

这应该可以满足您的需求,您可以将过滤器更新为仅执行“开始于”搜索

这是我的意思的 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;
        }
    });
});

【讨论】:

  • 它不工作,它没有显示任何东西。 utilizatoriJson 是一个对象数组,对象有 2 个字段,“label”和“id”,我有兴趣显示“label”
  • 唯一的问题是选择结果后显示的id?这仍然很容易。
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多