好的,所以我有一个表单,它将项目添加到项目列表中并使用它进行计算,但添加的每个新项目都在用户端完成,然后提交给服务器进行验证和更新数据库。现在,我已经看了其他答案,并没有真正得到答案。如果用户添加新项目并输入数量和费率,则应自动计算金额,如何提取唯一ID标识符以更改金额值?下面的代码和本例中的唯一标识符是19786868.此标识符的长度始终不同,它们不是唯一的模式,长度和值由随机命令生成。
<input class="form-control" type="text" id="list_item_attributes_19786868_quantity" />
<input class="form-control" type="text" id="list_item_attributes_19786868_rate" />
<input class="form-control" type="text" id="list_item_attributes_19786868_amount" />
如何使用JavaScript中的OnChange命令提取此唯一标识符以计算金额值?
答案 0 :(得分:3)
[].forEach.call(document.querySelectorAll(".form-control"), function(el) {
var id = el.id.replace(/\D+/g,"");
console.log( id ); // "19786868"
});
所以基本上使用this.id.replace(/\D+/g,"")
,其中所有非数字\D
都被""
替换
以下是使用input
事件的示例:
[].forEach.call(document.querySelectorAll(".form-control"), function(el) {
el.addEventListener("input", function() {
var id = this.id.replace(/\D+/g,"");
alert( id );
}, false)
});
&#13;
<input class="form-control" type="text" id="list_item_attributes_19786868_quantity" />
<input class="form-control" type="text" id="list_item_attributes_123_foobar" />
&#13;
请注意:asd_123_foo_9
将返回1239
作为结果,因此请确保始终将asd_123_foo
作为ID
值
答案 1 :(得分:2)
<input class="form-control" type="text" id="list_item_attributes_19786868_quantity" onchange="extractId(event);"/>
在javascript中:
function extractId(event) {
var elem = event.target;
var myArr = elem.id.split('_');
var yourUnique_id = myArr[3];
}
答案 2 :(得分:0)
如果用户添加新项目并输入数量和费率,则应该 自动计算金额,如何提取独特金额 用于更改金额值的ID标识符?
您可以使用input
事件; for
循环;属性包含选择器[attributeName*=containsString]
,.nextElementSibling
,.previousElementSibling
,以对包含id
和"quantity"
id
的{{1}}的值进行求和并设置"rate"
的结果包含id
"amount"
&#13;
function calculate() {
this.parentElement.querySelector("[id*=amount]")
.value = +this.value
+ +(/quantity/.test(this.id)
? this.nextElementSibling
: this.previousElementSibling
).value
}
var elems = document.querySelectorAll("[id*=quantity], [id*=rate]");
for (var i = 0; i < elems.length; i++) {
calculate.call(elems[i]); elems[i].oninput = calculate;
}
&#13;
答案 3 :(得分:0)
为了能够响应新添加的输入控件,您需要在某个父元素处捕获change
事件,否则您将不会在新添加的元素上捕获更改。
以下是一些处理文档更改事件的代码。随着这个事件的爆发,它最终会到达那里,所以我们可以回应它:
为了从输入的id中提取数字,我们可以使用正则表达式:
document.onchange = function(e) {
var match = e.target.id.match(/^(list_item_attributes_.*?_)(rate|quantity)$/);
if (!match) return; // not rate or quantity
// read rate and quantity for same ID number:
var rate = +document.querySelector('#' + match[1] + 'rate').value;
var quantity = +document.querySelector('#' + match[1] + 'quantity').value;
// write product as amount:
document.querySelector('#' + match[1] + 'amount').value = rate*quantity;
}
Quantity: <input class="form-control" type="text" id="list_item_attributes_19786868_quantity" /><br>
Rate: <input class="form-control" type="text" id="list_item_attributes_19786868_rate" /><br>
Amount: <input class="form-control" type="text" id="list_item_attributes_19786868_amount" /><br>
<p>
Quantity: <input class="form-control" type="text" id="list_item_attributes_14981684_quantity" /><br>
Rate: <input class="form-control" type="text" id="list_item_attributes_14981684_rate" /><br>
Amount: <input class="form-control" type="text" id="list_item_attributes_14981684_amount" /><br>
正如您要求回复change
事件一样,我保持这种方式,但您可能有兴趣使用input
事件,这会在任何字符发生变化时立即触发在输入中。
上述示例不保护amount
字段不受输入影响。您应该对此做些什么,因为用户可能只是覆盖计算结果。
答案 4 :(得分:0)
document.querySelector(".my-form").addEventListener("change", function(e) {
var changed = e.target;
var matchedId = changed.id.match(/^(list_item_attributes_[^_]*)_/);
if (!matchedId) {
// this isn't one of the relevant fields
return;
}
var uniquePrefix = matchedId[1];
var quantity = document.querySelector("#" + uniquePrefix + "_quantity");
var rate = document.querySelector("#" + uniquePrefix + "_rate");
var amount = document.querySelector("#" + uniquePrefix + "_amount");
var newVal = quantity.value * rate.value;
if (isNaN(quantity.value) || isNaN(rate.value) || isNaN(newVal)) {
amount.value = "";
} else {
amount.value = newVal;
}
});
&#13;
<form class="my-form">
<input class="form-control" type="text" id="list_item_attributes_19786868_quantity" />
<input class="form-control" type="text" id="list_item_attributes_19786868_rate" />
<input class="form-control" type="text" id="list_item_attributes_19786868_amount" />
</form>
&#13;