gpt4 book ai didi

javascript - 使用 JavaScript 在多个 HTML 输入字段值之间进行动态线性插值

转载 作者:行者123 更新时间:2023-12-02 23:04:21 25 4
gpt4 key购买 nike

我正在尝试制作一个动态生成的输入字段数组,其中只有第一个和最后一个是可编辑的。当任一边界字段被修改时,其余的应通过在两个边界值之间线性插值来更新其值。下面的例子。

enter image description here

我编写了一个(Django/Bootstrap)HTML 模板,它会生成输入字段本身,并且只保留边框字段可编辑,并分配“-first”和“-last”id 扩展名。

我还编写了一个基本的 JavaScript,它需要两个输入值在输出数组大小之间进行插值。

这就是输入字段的实例化方式。我开始编写一个 JS 函数“change_values()”,它将在 onchange 事件上激活,但没有任何结果。

<div class="custom-control custom-linspace-field">
<div class="row" id="linspace-field">
{% for field in fields %}
<div class="col p-1">
{% if forloop.first %}
<input type="text" class="form-control" onchange="change_values()" id="linspace-field-first" value="{{ field | floatformat:3 }}" placeholder="min">
{% elif forloop.last %}
<input type="text" class="form-control" onchange="change_values()" id="linspace-field-last" value="{{ field | floatformat:3 }}" placeholder="max">
{% else %}
<input type="text" class="form-control" onchange="change_values()" id="linspace-field" value="{{ field | floatformat:3 }}" readonly>
{% endif %}
</div>
{% endfor %}
</div>
</div>

这是我的线性插值 JS 脚本:

function lerp(value1, value2, amount) {
step = (value2 - value1) / amount;
output = [value1];
var i;
for (i = 1; i < amount; i++) {
output.push(output[output.length - 1] + step);
}
output.push(value2);
output_round = [];
output.forEach(function(item) {
output_round.push(item.toFixed(2));
});
return output_round;
}

我希望找到一种方法以正确的顺序访问输入字段值,并在任一边框输入字段上触发 onchange 事件时更新它们。

基本上我的问题是:onchange 事件上调用的change_values() 函数的代码应该是什么样的?

最佳答案

感谢 @HelgeFox 指出我的 HTML 中不应该有相同的 id 标记。这让我意识到我可以使用它们在创建输入字段时动态分配唯一 ID,然后使用它们分配插值。

{% for field in some_list_with_enumerated_initial_values %}
<div class="col p-1">
{% if forloop.first %}
<input type="number" step="0.05" class="form-control" onchange="change_fields()" id="linspace-field-{{ field.0 }}" value="{{ field.1 }}" placeholder="min">
{% elif forloop.last %}
<input type="number" step="0.05" class="form-control" onchange="change_fields()" id="linspace-field-{{ field.0 }}" value="{{ field.1 }}" placeholder="max">
{% else %}
<input type="text" class="form-control" onchange="change_fields()" id="linspace-field-{{ field.0 }}" value="{{ field.1 | floatformat:3 }}" readonly>
{% endif %}
</div>
{% endfor %}

这是我使用的JS函数。

function lerp(value1, value2, amount) {
// Calculate what the interpolation step will be.
step = (value2 - value1) / amount;
// Create an array where all the interpolated values will be added. Add the first value.
output = [value1];
var i;
// Start with i = 1 so that the last element would not be added.
for (i = 1; i < amount; i++) {
output.push(output[output.length - 1] + step);
}
// The last element is added here, because this way it is certain that the last value will match value2 in arguments.
output.push(value2);
// Round all elements before returning
output_round = [];
output.forEach(function(item) {
output_round.push(item.toFixed(2));
});
return output_round;
}

function change_fields() {
// Create an array with all the "linspace-field" elements.
var fields = $('*[id^="linspace-field"]');
// Create another array with the new set of values. They are stored as strings and need to be parsed.
var lerp_values = lerp(parseFloat(fields[0].value), parseFloat(fields[fields.length - 1].value), fields.length - 1)
var i;
for (i = 0; i < fields.length; i++) {
// Replace each of the values in "linspace-field" elements.
fields[i].value = lerp_values[i];
}
}

关于javascript - 使用 JavaScript 在多个 HTML 输入字段值之间进行动态线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57657080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com