Javascript计算,包括null
我试图让我的变量等于一个对象值(这部分工作),但如果对象不存在,我希望变量值等于0Javascript计算,包括null,javascript,html,Javascript,Html,我试图让我的变量等于一个对象值(这部分工作),但如果对象不存在,我希望变量值等于0 function calc(){ var d_r1_qte = document.autoSumForm.d_r1_qte.value; // this work for getting the value is the object exist var d_r1_unitprice = document.autoSumForm.d_r1_unitprice.value || 0; //
function calc(){
var d_r1_qte = document.autoSumForm.d_r1_qte.value; // this work for getting the value is the object exist
var d_r1_unitprice = document.autoSumForm.d_r1_unitprice.value || 0; // this doesn't work for setting the variable to 0 if the document object doesn't exist
document.autoSumForm.d_r1_price.value = d_r1_qte * d_r1_unitprice;
var d_r2_qte = document.autoSumForm.d_r2_qte.value;
var d_r2_unitprice = document.autoSumForm.d_r2_unitprice.value;
document.autoSumForm.d_r2_price.value = d_r2_qte * d_r2_unitprice;
document.autoSumForm.rtotal.value = ((d_r1_qte * d_r1_unitprice) + (d_r2_qte * d_r2_unitprice)); // the goal is to get this value even if there are non existent object in the equation
}
我认为这将是简单的,但我一直在努力使这两天现在的工作。我不习惯JavaScript
任何帮助都是一种启示。我很想知道如何正确地书写它
提前谢谢你
我试过:
var d_r1_qte = document.autoSumForm.d_r1_qte.value ? document.autoSumForm.d_r1_qte.value : 0;
var d_r1_unitprice = document.autoSumForm.d_r1_unitprice.value ? document.autoSumForm.d_r1_unitprice.value : 0;
document.autoSumForm.d_r1_price.value = d_r1_qte * d_r1_unitprice;
var d_r2_qte = document.autoSumForm.d_r2_qte.value ? document.autoSumForm.d_r2_qte.value : 0;
var d_r2_unitprice = document.autoSumForm.d_r2_unitprice.value ? document.autoSumForm.d_r2_unitprice.value : 0;
document.autoSumForm.d_r2_price.value = d_r2_qte * d_r2_unitprice;
document.autoSumForm.rtotal.value = ((d_r1_qte * d_r1_unitprice) + (d_r2_qte * d_r2_unitprice));
以及:
但是
在创建对象之前仍然不会计算
该对象是使用以下php创建的:
<?php
//fetch.php;
$connect = new PDO("mysql:host=localhost; dbname=fmr", "fmr", "creationfmr2020");
$connect->exec("set names utf8");
if(isset($_POST['a1']))
{
$query = "
SELECT DISTINCT aname FROM articles
WHERE aname LIKE '%".trim($_POST["a1"])."%'
";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
$output = '';
foreach($result as $row)
{
$output .= '
<li class="list-group-item contsearcha1">
<a href="javascript:void(0)" class="gsearcha1" style="color:#333;text-decoration:none;">'.$row["aname"].'</a>
</li>
';
}
echo $output;
}
if(isset($_POST['a1s']))
{
$query = "
SELECT * FROM articles
WHERE aname = '".trim($_POST["a1s"])."'
LIMIT 1
";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
$output = '
';
foreach($result as $row)
{
$output .= '
<div class="row">
<div class="apad" style="width:4%">
<label>Qte</label>
<input class="form-control" type="text" name="d_r1_qte" value="" onFocus="startCalc();" onBlur="stopCalc();">
</div>
<div class="apad" style="width:85%" >
<label>Description</label>
<input class="form-control" type="text" name="d_r1_adesc" value="'.$row["adesc"].'" >
</div>
<div class="apad" style="width:5%">
<td><label>Unit.</label>
<input class="form-control" type="text" name="d_r1_unitprice" value="'.$row["unitprice"].'" onFocus="startCalc();" onBlur="stopCalc();">
</div>
<div class="apad" style="width:6%">
<label>Prix</label>
<input class="form-control" type="text" name="d_r1_price">
</div>
</div>
<br />
';
}
$output .= '';
echo $output;
}
?>
但是
在创建这两个项目之前,仍然不计算。
您可以使用运算符(?。
)。如果您试图访问null
或undefined
上的属性,它将短路并返回undefined
var d_r1_unitprice = document.autoSumForm?.d_r1_unitprice?.value || 0;
你没有提供什么和如何对你不起作用的例子,所以我将提供一个一般性的答案,希望它也能涵盖你的情况
foo || 0
如果foo
为falsy,则通常将产生foo和0
让我们看看你的台词:
var d_r1_unitprice=document.autoSumForm.d_r1_unitprice.value | 0
假设document
和document.autoSumForm
都存在,这将起作用<代码>文档存在于浏览器中,因此文档。autoSumForm
不存在。因此,您打算引用的不存在对象的任何成员都会为您产生错误,这就是问题所在。例如,这将起作用:
var d_r1_unitprice = (document.autoSumForm && document.autoSumForm.d_r1_unitprice.value) || 0;
因为它检查对象及其成员的存在。但是很难看。让我们制定一个更一般、更好的方法:
function getInnerMemberOrDefault(obj, keyChain) {
for (let key of keyChain) {
if (!obj[key]) return 0;
obj = obj[key];
}
return obj || 0;
}
这样称呼它:
getInnerMemberOrDefault(document, ['autoSumForm', 'd_r1_unitprice.value']);
您是否尝试过使用
if
语句来检查对象的存在?我尝试过使用isset和typeof,但没有成功。您是否也可以发布一个要检查的对象的示例?我尝试过:var d_r1_unitprice=document.autoSumForm?.d_r1_unitprice?.value | 0;var d_r1_单价=document.autoSumForm?.d_r1_单价?.value | 0;document.autoSumForm.d_r1_price.value=d_r1_qte*d_r1_单价;但是第三行计算了这两个变量,它不再起作用了。有什么想法吗?谢谢你的帮助!您可能希望使用空合并运算符(?
)而不是or(|
),除非您利用了空字符串的错误。@Hereticsmonkey我认为这在这里没有多大区别。是的,空字符串可能应该默认为0
。
foo || 0
var d_r1_unitprice = (document.autoSumForm && document.autoSumForm.d_r1_unitprice.value) || 0;
function getInnerMemberOrDefault(obj, keyChain) {
for (let key of keyChain) {
if (!obj[key]) return 0;
obj = obj[key];
}
return obj || 0;
}
getInnerMemberOrDefault(document, ['autoSumForm', 'd_r1_unitprice.value']);