将jQuery自动完成数据附加到textarea内容而不是覆盖它

时间:2015-09-27 16:51:37

标签: javascript jquery jquery-ui coffeescript jquery-ui-autocomplete

我正在尝试在我的rails应用中创建@其他人功能,就像stackoverflow一样:

enter image description here

我差不多完成了这个功能,但是我遇到了问题,jQuery auto-compelete数据替换了我的textarea内容,而不是追加。

enter image description here

CoffeeScript的:

find_at_sign = ->
  if $("#tags").val().split('').pop() == "@"
    id = $("#tags").data("article-id")
    $("#tags").autocomplete
      source:  '/articles/' + id + '/autocomplete.json'
      minLength: 1

$ ->
  $(document).on("input", "#tags",
  -> find_at_sign())

文章管理员:

  def autocomplete
    @articles = Article.find_by(id: params[:article_id])
    @commentor_names = @articles.comments.map(&:name).uniq
    respond_to do |format|
      format.html
      format.json {
        render json: @commentor_names
      }
    end
  end

form_html.erb:

 <div class="form-group ui-widget">
    <div class="col-sm-5">
      <%= f.text_area :content, rows: 5, placeholder: '说点什么...', 
          class: 'form-control', id: "tags", 'data-article-id': @article.id.to_s %>
    </div>
  </div>

我尝试使用append方法,但不起作用:

$("#tags").append(${this).autocomplete
  source:  '/articles/' + id + '/autocomplete.json'
  minLength: 1)

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

基于this example,这是我对此的半心半意的尝试。重要的部分如下:

  • 取消尝试覆盖文本框内的值的内置focus事件
  • 取消内置select事件并将其配置为在文本框中附加所选@name而不是覆盖它
  • 提供自定义source功能,从文本框中提取最后@name并查找该名称并返回匹配的名称

&#13;
&#13;
var namelist = [
  "Adam",
  "Adrian",
  "Andrew",
  "Charles",
  "Daniel",
  "David",
  "Evan",
  "Henry",
  "Ian",
  "Jack",
  "James",
  "John",
  "Joseph",
  "Justin",
  "Kevin",
  "Michael",
  "Parker",
  "Robert",
  "Thomas",
  "William"
];
$(function() {
  $("#message").autocomplete({
    source: function(request, response) {
      var match = request.term.match(/@(\w*)$/);
      var names = match ? $.ui.autocomplete.filter(namelist, match[1]) : [];
      response(names)
    },
    focus: function(event) {
      event.preventDefault();
    },
    select: function(event, ui) {
      event.preventDefault();
      this.value = this.value.replace(/@(\w*)$/, "@" + ui.item.value)
    }
  })
});
&#13;
@import url("https://code.jquery.com/ui/1.11.4/themes/ui-darkness/jquery-ui.min.css");

body {
  font: smaller sans-serif;
}
textarea {
  box-sizing: border-box;
  width: 100%;
  height: 5em;
}
&#13;
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>


<p>Enter some text or @name</p>
<textarea id="message"></textarea>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我正在使用jquery插件:http://yuku-t.com/jquery-textcomplete/

答案 2 :(得分:0)

你可以做以下两件事之一:

  1. 您可以只使用您想要的内容replace @符号,但这可能会让您遇到问题。

  2. 您可以获取光标位置并在光标后添加内容,这可能需要一些工作。

  3. 以下是一个例子:

     function (tid) {
    
            node=$('#'+tid)[0];
    
            try{
            //--- Wrap selected text or insert at curser.
            var oldText         = node.value || node.textContent;
            var newText;
            var iTargetStart    = node.selectionStart;
            var iTargetEnd      = node.selectionEnd;
    
            if (iTargetStart == iTargetEnd)
                newText         = left+right;
            else
                newText         = left + oldText.slice (iTargetStart, iTargetEnd) + right;
    
            //console.log (newText);
            newText             = oldText.slice (0, iTargetStart) + newText + oldText.slice (iTargetEnd);
            node.value          = newText;
            //-- After using spelling corrector, this gets buggered, hence the multiple sets.
            node.textContent    = newText;
            //-- Have to reset selection, since we repasted the text.
            node.selectionStart = iTargetStart + left.length;
            node.selectionEnd   = iTargetEnd   + left.length;
                node.focus ();
    ....
    

    see full code