如何将JavaScript应用于具有不同ID的文本框数组?

如何将JavaScript应用于具有不同ID的文本框数组?,javascript,html,flask,Javascript,Html,Flask,除此之外,;感谢阿尔肖先生提供了这样一个可解释的答案。在HTML(或使用flask)中,我有以下代码: from flask import Flask, render_template, url_for, request app = Flask(__name__) @app.route('/') def search(): students = ['Mr. A', 'Mr. B', 'Mr. C'] return render_template('dynamic_input.

除此之外,;感谢阿尔肖先生提供了这样一个可解释的答案。在HTML(或使用flask)中,我有以下代码:

from flask import Flask, render_template, url_for, request

app = Flask(__name__)

@app.route('/')
def search():
    students = ['Mr. A', 'Mr. B', 'Mr. C']
    return render_template('dynamic_input.html', students = students)

@app.route('/results', methods = ['GET', 'POST'])
def results():
    if request.method == 'GET':
        return redirect(url_for('/'))
    else:
        # I can handle this here...

if __name__ == '__main__':
    app.run(debug = True)
HTML模板的索引如下所示:

<!-- dynamic_input.html -->
<div class="container">
  <h1>Give the grades</h1>
  <form action="/results" method="post">
    {% for s in students %} 
    <div>
       {{ s }}:
         <input type="text" value="Quiz1" name="quiz1[]">
         <input type="text" value="Quiz2" name="quiz2[]">
         <input type="text" value="Quiz3" name="quiz3[]">
         <input type="text" value="Total" name="total[]">
     </div>
     {% endfor %}
    <input type="submit" value="Select">
  </form>
</div>

评分
{s的%s在学生%}
{{s}}:
{%endfor%}

我们可以写一个JavaScript来添加quiz1-quiz4并显示总数吗。我可以这样做,如果文本框是固定在这里它是动态的,所以我需要专家的帮助

您需要创建一个数组并映射输入字段,例如:

let array = [1, 2, 3, 4, 5]

{ array.map((id) => <input type="number" value={"quiz-" + id} id={"quiz-" + id}>) }
let数组=[1,2,3,4,5]
{array.map((id)=>)}
然后在某个地方:

function getTotal(array) {
  var i = 0, total = 0, el;
  while (i < array.length) {
    el = document.getElementById('quiz-' + array[i++]);
    if (el) total += parseInt(el.value) | 0;
  }
  return total;
}
函数getTotal(数组){
var i=0,总计=0,el;
while(i

希望它能对你有所帮助。

作为JS解决方案的补充,你可以使用
dict
代替
列表

// python
students = {1: 'Mr. A', 2: 'Mr. B', 3: 'Mr. C'}

// html
{% for id, name in students.items() %}
<div>
   {{ name }}:
     <input type="text" value="Quiz1" name="quiz-{{ id }}[]" id="quiz-{{ id }}">
     <input type="text" value="Quiz2" name="quiz-{{ id }}[]" id="quiz-{{ id }}">
     <input type="text" value="Quiz3" name="quiz-{{ id }}[]" id="quiz-{{ id }}">
     <input type="text" value="Total" name="total-{{ id }}[]" id="quiz-total-{{ id }}">
 </div>
{% endfor %}
//python
学生={1:'A先生',2:'B先生',3:'C先生'}
//html
{id为%s,名称为students.items()%}
{{name}}:
{%endfor%}

在模板中,您可以应用JavaScript的
onchange
事件,以获取每个文本框在更改时的值。然后您可以将该值添加到同一学生的总分中

另外,, 我已经更新了Python代码以使用
字典
,而不是
学生姓名列表
。它使用
request.form.getlist()
方法将每个学生的分数作为一个列表来获取。此列表包含3个测验分数和每个学生的总分数

app.py

from flask import Flask, render_template, url_for, request, jsonify, redirect

app = Flask(__name__)

@app.route('/')
def search():
    students = {1: 'Mr. A', 2: 'Mr. B', 3: 'Mr. C'}
    return render_template('dynamic_input.html', students = students)

@app.route('/results', methods = ['GET', 'POST'])
def results():
    if request.method == 'GET':
        return redirect(url_for('search'))
    else:
        data = []
        for student in request.form:
            data.append(request.form.getlist(student))
        return jsonify(data)
动态输入.html

<html>
<head>
  <title>Dynamic calculation using JS</title>
</head>
<body>
  <div class="container">
    <h1>Give the grades</h1>
    <form action="/results" method="post">
      {% for student_id, student_name in students.items() %}
      <div class="student_wrapper">
        {{ student_name }}:
        <input type="text" onchange="update_marks(this);" placeholder="Enter Quiz 1 marks of {{ student_name }}" name="students_{{ student_id }}_marks" id="quiz_1_{{ student_id }}">
        <input type="text" onchange="update_marks(this);" placeholder="Enter Quiz 2 marks of {{ student_name }}" name="students_{{ student_id }}_marks" id="quiz_2_{{ student_id }}">
        <input type="text" onchange="update_marks(this);" placeholder="Enter Quiz 3 marks of {{ student_name }}" name="students_{{ student_id }}_marks" id="quiz_3_{{ student_id }}">
        <input type="text" class="total_marks" value="0" placeholder="Total marks of {{ student_name }}" name="students_{{ student_id }}_marks">
      </div>
      {% endfor %}
      <input type="submit" value="Select">
    </form>
  </div>
  <script>
    function update_marks(current_element){
      var student_element = current_element.closest(".student_wrapper");
      var total_marks_element = student_element.querySelector(".total_marks");
      total_marks_element.value=parseInt(total_marks_element.value)+parseInt(current_element.value);
    }
  </script>
</body>
</html>

用JS进行动力计算
评分
{%对于学生id,学生名在students.items()%}
{{学生姓名}}:
{%endfor%}
功能更新标记(当前元素){
var student\u element=当前的\u元素。最近的(“.student\u包装”);
var total_marks_element=student_element.querySelector(“.total_marks”);
total_marks_element.value=parseInt(total_marks_element.value)+parseInt(current_element.value);
}
如果标记可以是浮点数,请使用
parseFloat
函数而不是
parseInt

图1:在提交表格之前,总分数将在测验分数的一次更改事件中更新

图2:提交表单后,表单值被解析到列表中,其中最后一项是总分


谢谢你,亲爱的。真的很感谢你的时间和努力。@JunaidBaber,如果答案能解决你的问题,请投票并接受它。非常感谢。