Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript计算,包括null_Javascript_Html - Fatal编程技术网

Javascript计算,包括null

Javascript计算,包括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; //

我试图让我的变量等于一个对象值(这部分工作),但如果对象不存在,我希望变量值等于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']);