【发布时间】:2021-03-17 17:35:09
【问题描述】:
我对 jQuery 和 javascript 还很陌生,很难理解我在网上找到的各种示例和代码 sn-ps。
我的 Flask 网站的主要功能之一是一个表单,它允许用户根据需要动态添加任意数量的字段,并且每个字段都提供基于数据库的自动完成选项。
使用网上找到的示例,我已经能够创建一个动态添加选项的表单(但是我对其工作原理的理解非常差)。
我还找到了自动完成的示例,在调整后适用于各个字段。但是,我有一个问题,当它们放在一起时(自动完成和动态添加的字段),表单的第一个字段是唯一自动完成的字段。谁能让我深入了解如何解决这个问题或我做错了什么?几天来我一直在尝试解决这个问题,但我觉得自己已经碰壁了。
这是目前允许我自动完成单个字段的代码的 sn-p:
<script type="text/javascript">
$(function() {
$("#autocomplete").autocomplete({
source:function(request, response) {
$.getJSON("{{url_for('fruit.autocomplete')}}",{
q: request.term,
}, function(data) {
response(data.matching_results);
});
},
minLength: 2,
select: function(event, ui) {
console.log(ui.item.value);
}
});
})
</script>
getJSON调用fruit.autocomplete如图:
@fruit.route('/autocomplete', methods=['GET'])
def autocomplete():
search = request.args.get('q')
query = Fruit.query.filter(Fruit.name.like('%' + str(search) + '%'))
results = []
for fruit in query:
result = fruit.as_dict()
results.append(result)
return jsonify(matching_results=results)
要自动完成,可以在表单的字段中添加:id="autocomplete"。
另外,这里是 sn-p 的代码,目前允许我向表单动态添加字段(但随后无法自动完成除第一个字段之外的其他字段),但经常出现两个错误:
“未捕获的类型错误:this.source 不是函数”
"Uncaught (in promise) TypeError: Cannot read property 'toString' of undefined"
<script>
$(document).ready(function(){
var max_input_fields = 20;
var add_input = $('.add-input');
var input_wrapper = $('.input-wrapper');
var new_input = '<div><input class="form-control" id="autocomplete" type="text" name="field[]" value=""/><a href="javascript:void(0);" class="remove-input" title="Remove input">-</a></div>';
var add_input_count = 1;
$(add_input).click(function(){
if(add_input_count < max_input_fields){
add_input_count++;
$(input_wrapper).append(new_input).autocomplete();
}
});
$(input_wrapper).on('click', '.remove-input', function(e){
e.preventDefault();
$(this).parent('div').remove();
add_input_count--;
});
});
</script>
<form action="" method="POST" enctype="">
<div class="input-wrapper">
<div>
Fruit: <br/>
<input class="form-control" id="autocomplete" type="text" name="field[]" value="" autocomplete="off"/>
<a href="javascript:void(0);" class="add-input" title="Add input">+</a>
</div>
</div>
<input class="btn btn-outline-info" type="submit" name="cmdsubmit">
</form>
我只是在寻找一种可以同时实现这两个功能的简单方法,并且我对如何实现它的不同方法/建议非常开放,上面的代码示例纯粹是我找到的资源在线似乎有效
非常感谢任何帮助!谢谢!
【问题讨论】:
-
我认为问题在于您为生成的所有字段分配了相同的 id (
autocomplete)。尝试为每个字段生成不同的 id,并在管理自动完成的函数中考虑到它。 -
@Tobin 感谢您的意见!我真的很抱歉问,但你能给我一些关于我如何做到这一点的指示吗?我主要是后端开发人员,我发现 javascript 很混乱。非常感谢您的帮助:)
-
嗨,你试过下面的答案吗?
标签: javascript html jquery flask