我正在尝试在我的rails应用中创建@
其他人功能,就像stackoverflow一样:
我差不多完成了这个功能,但是我遇到了问题,jQuery auto-compelete数据替换了我的textarea内容,而不是追加。
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)
感谢任何帮助!
答案 0 :(得分:1)
基于this example,这是我对此的半心半意的尝试。重要的部分如下:
focus
事件select
事件并将其配置为在文本框中附加所选@name
而不是覆盖它source
功能,从文本框中提取最后@name
并查找该名称并返回匹配的名称
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;
答案 1 :(得分:1)
我正在使用jquery插件:http://yuku-t.com/jquery-textcomplete/
答案 2 :(得分:0)
你可以做以下两件事之一:
您可以只使用您想要的内容replace
@符号,但这可能会让您遇到问题。
您可以获取光标位置并在光标后添加内容,这可能需要一些工作。
以下是一个例子:
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 ();
....