为什么一个表单按钮会执行所有表单按钮的操作?

问题描述 投票:0回答:2

我正在使用 Flask 制作一个带有 3 个表单按钮的简单网页。其中两个按钮“绘制”和“重置”具有 javascript 函数,这些函数应该在按下每个相应按钮时执行;绘制应执行

RegenDivs()
,而重置应执行
ResetPath

HTML

<form method="post" action="{{ url_for('checkButtons') }}">
    <input class="dbtn" type="submit" value="Draw" name="drawbtn"/>
    <input class="hbtn" type="submit" value="Home" name="homebtn"/>
    <input class="rbtn" type="submit" value="Reset" name="resetbtn"/>
</form>

Javascript

        document.getElementsByClassName('dbtn').onlick = setTimeout(function regenDivs(){
            console.log("starting regen");
            var storedPath = JSON.parse(sessionStorage.getItem("path"));
            var storedRawPath = JSON.parse(sessionStorage.getItem("rawPath"));
    
            if(storedRawPath == null){
                console.log("path null");
                storedRawPath = [[0, 160]];
                return 0;
            }else{
                console.log(storedRawPath.toString());
            }

            for(let i = 0; i < storedRawPath.length; i++){
                createDiv(storedRawPath[i][0], storedRawPath[i][1]);
                console.log("Created div at: " + storedRawPath[i][0] + ", " + storedRawPath[i][1]);
            }
             
            path = storedPath;
            rawPath = storedRawPath;

        }, 1000);

        document.getElementsByClassName('rbtn').onclick = setTimeout(function resetPath(){
            clearDivs();
            sessionStorage.removeItem("rawPath");
            sessionStorage.removeItem("path");
            sessionStorage.removeItem("numDivs");
            path = [];
            rawPath = [];
            divArray = [];
            numDivs = 0;

        }, 1000);

Flask/Python

@app.route('/', methods=['POST', 'GET'])
def index():    
    return render_template("index.html")

@app.route('/buttton', methods=['POST', 'GET'])
def checkButtons():
    if request.method == 'POST':
        if request.form.get('homebtn') == 'Home':
            print("Starting Homing...")
            #p.home()            
            print("Successfully Homed.")
            return redirect(url_for('checkButtons'))

        if request.form.get('drawbtn') == 'Draw':
            print("starting draw")
            p.draw()
            print("drawing done")
            return redirect(url_for('checkButtons'))

        if request.form.get('resetbtn') == 'Reset':
            print("reset")
            p.reset_path()
            return redirect(url_for('checkButtons'))

    elif request.method == 'GET':
        return render_template('index.html')

现在,按“绘制”按钮不仅会执行

regenDivs()
功能,还会执行
resetPath()
功能,该功能只应在我按“重置”按钮时执行。为什么会出现这种情况?我对 html/css/javascript 还很陌生,所以我可能做了一些非常错误的事情,但我不知道是什么。

javascript python html flask
2个回答
0
投票

这个问题已由@robin-zigmond 回答。 将他的评论转录到正确的答案文本区域:

您正在将“setTimetout”返回值分配给 onClick...

在初始化超时时将其设置为等于超时ID [...] (yourElement).onclick = () => setTimeout(theFunction, the 间隔)应该更接近你想要的


0
投票

将移至https://stackoverflow.com/questions/78416871/multiply-all-elements-of-an-array-by-a-scalar-until-they-all-add-up-to-a-确定一旦OP取消删除该问题...

您只需要计算需要缩放一次的数字:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

void ScaleArrayToSum(std::vector<float> &array, float target_sum) {
  auto current_sum = std::accumulate(array.begin(), array.end(), 0.0f);
  float scalar = target_sum / current_sum;
  std::for_each(array.begin(), array.end(),
                [scalar](float &value) { value *= scalar; });
}

int main() {
  std::vector<float> array = {0.1, 0.2, 0.4, 0.8, 0.4, 0.2, 0.1};
  float target_sum = 10.0;
  std::cout << "Target sum: " << target_sum << '\n';
  std::cout << "Original array: ";
  for (auto value : array) {
    std::cout << value << " ";
  }
  std::cout << '\n';
  std::cout << "Original sum: "
            << std::accumulate(array.begin(), array.end(), 0.0f) << '\n';
  ScaleArrayToSum(array, target_sum);
  std::cout << "Scaled array: ";
  for (auto value : array) {
    std::cout << value << " ";
  }
  std::cout << '\n';
  std::cout << "Scaled sum: "
            << std::accumulate(array.begin(), array.end(), 0.0f) << '\n';
  return 0;
}

输出:

Target sum: 10
Original array: 0.1 0.2 0.4 0.8 0.4 0.2 0.1 
Original sum: 2.2
Scaled array: 0.454545 0.909091 1.81818 3.63636 1.81818 0.909091 0.454545 
Scaled sum: 10
© www.soinside.com 2019 - 2024. All rights reserved.