如何基于我的 jinja for 循环创建多个动态选择器?
How do i create multiple dynamic selectpicker based on my jinja for loop?
目前,我正在尝试根据用户输入创建多个动态 select 选择器下拉列表。此输入将在 for 循环中通过 jinja 传递到我的 HTML 页面。
基于for循环,我将创建相应数量的下拉列表对。
除此之外,我还计划重新配置每个下拉列表的 ID,以便我可以轻松地在我的 Flask 代码中检索它们的值。我尝试在 javascript 中编写 for 循环来修改 id。
我曾尝试编写一些 javascript 来实现这些功能,但似乎没有用。其实对javascript不是很熟悉
HTML代码
<form method="POST">
{% for i in no_of_filters: %}
<select id="col" class="selectpicker" onchange='refreshList(event,'{{ i+1|string }}')';>
{% for c in cols: %}
<option value="{{c}}">{{c}}</option>
{% endfor %}
</select>
<select id ="val" class="selectpicker" multiple data-live-search="true">
{% for uv in unique_val: %}
<option value="{{uv}}">{{uv}}</option>
{% endfor %}
</select>
{% endfor %}
<input type="submit">
</form>
<script>
console.clear()
var colElements = document.querySelectorAll('#col');
var valElements = document.querySelectorAll('#val');
for (var i = 0; i < colElements.length; i++)
colElements[i].id = 'col' + (i+1);
for (var j = 0; j < valElements.length; j++)
valElements[i].id = 'val' + (j+1);
function refreshList(event, i){
var col_select = document.getElementById('col'.concat(i));
var uv_select = document.getElementById('val'.concat(i));
column = col_select.value;
fetch('/col/' + column).then(function(response) {
response.json().then(function(data) {
var optionHTML = ' ';
for (var uv of data.unique_val) {
optionHTML += '<option value="' + uv.id + '">' + uv.value + '</option>';
}
uv_select.innerHTML = optionHTML;
$('#val'.concat(i)).on('change', function() {
$('#val'.concat(i)).selectpicker('refresh');
});
})
});
}
</script>
预期:如果 no_of_filters = 7,for 循环应创建 7 对动态 select 选择器下拉字段,并按 javascript
配置 ID
实际:仅创建 1 对 select 选择器下拉列表,没有配置 id
select 具有相同的 ID。尝试为每个 select 添加不同的 ID,如下所示:
Html:
<form method="POST">
{% for i in no_of_filters: %}
<select id="col-{{i}}" class="selectpicker col"
onchange='refreshList(event,'{{ i+1|string }}')';>
{% for c in cols: %}
<option value="{{c}}">{{c}}</option>
{% endfor %}
</select>
<select id ="val-{{i}}" class="selectpicker val"
multiple data-live-search="true">
{% for uv in unique_val: %}
<option value="{{uv}}">{{uv}}</option>
{% endfor %}
</select>
{% endfor %}
<input type="submit">
</form>
js:
<script>
console.clear()
var colElements = document.querySelectorAll('select.col');
var valElements = document.querySelectorAll('select.val');
for (var i = 0; i < colElements.length; i++)
colElements[i].id = 'col-' + (i+1);
for (var j = 0; j < valElements.length; j++)
valElements[i].id = 'val-' + (j+1);
function refreshList(event, i){
var col_select = document.getElementById('col-'.concat(i));
var uv_select = document.getElementById('val-'.concat(i));
// same logic
}
</script>
目前,我正在尝试根据用户输入创建多个动态 select 选择器下拉列表。此输入将在 for 循环中通过 jinja 传递到我的 HTML 页面。
基于for循环,我将创建相应数量的下拉列表对。
除此之外,我还计划重新配置每个下拉列表的 ID,以便我可以轻松地在我的 Flask 代码中检索它们的值。我尝试在 javascript 中编写 for 循环来修改 id。
我曾尝试编写一些 javascript 来实现这些功能,但似乎没有用。其实对javascript不是很熟悉
HTML代码
<form method="POST">
{% for i in no_of_filters: %}
<select id="col" class="selectpicker" onchange='refreshList(event,'{{ i+1|string }}')';>
{% for c in cols: %}
<option value="{{c}}">{{c}}</option>
{% endfor %}
</select>
<select id ="val" class="selectpicker" multiple data-live-search="true">
{% for uv in unique_val: %}
<option value="{{uv}}">{{uv}}</option>
{% endfor %}
</select>
{% endfor %}
<input type="submit">
</form>
<script>
console.clear()
var colElements = document.querySelectorAll('#col');
var valElements = document.querySelectorAll('#val');
for (var i = 0; i < colElements.length; i++)
colElements[i].id = 'col' + (i+1);
for (var j = 0; j < valElements.length; j++)
valElements[i].id = 'val' + (j+1);
function refreshList(event, i){
var col_select = document.getElementById('col'.concat(i));
var uv_select = document.getElementById('val'.concat(i));
column = col_select.value;
fetch('/col/' + column).then(function(response) {
response.json().then(function(data) {
var optionHTML = ' ';
for (var uv of data.unique_val) {
optionHTML += '<option value="' + uv.id + '">' + uv.value + '</option>';
}
uv_select.innerHTML = optionHTML;
$('#val'.concat(i)).on('change', function() {
$('#val'.concat(i)).selectpicker('refresh');
});
})
});
}
</script>
预期:如果 no_of_filters = 7,for 循环应创建 7 对动态 select 选择器下拉字段,并按 javascript
配置 ID实际:仅创建 1 对 select 选择器下拉列表,没有配置 id
select 具有相同的 ID。尝试为每个 select 添加不同的 ID,如下所示:
Html:
<form method="POST">
{% for i in no_of_filters: %}
<select id="col-{{i}}" class="selectpicker col"
onchange='refreshList(event,'{{ i+1|string }}')';>
{% for c in cols: %}
<option value="{{c}}">{{c}}</option>
{% endfor %}
</select>
<select id ="val-{{i}}" class="selectpicker val"
multiple data-live-search="true">
{% for uv in unique_val: %}
<option value="{{uv}}">{{uv}}</option>
{% endfor %}
</select>
{% endfor %}
<input type="submit">
</form>
js:
<script>
console.clear()
var colElements = document.querySelectorAll('select.col');
var valElements = document.querySelectorAll('select.val');
for (var i = 0; i < colElements.length; i++)
colElements[i].id = 'col-' + (i+1);
for (var j = 0; j < valElements.length; j++)
valElements[i].id = 'val-' + (j+1);
function refreshList(event, i){
var col_select = document.getElementById('col-'.concat(i));
var uv_select = document.getElementById('val-'.concat(i));
// same logic
}
</script>