我正在使用 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 还很陌生,所以我可能做了一些非常错误的事情,但我不知道是什么。
这个问题已由@robin-zigmond 回答。 将他的评论转录到正确的答案文本区域:
您正在将“setTimetout”返回值分配给 onClick...
在初始化超时时将其设置为等于超时ID [...] (yourElement).onclick = () => setTimeout(theFunction, the 间隔)应该更接近你想要的
将移至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