9

我有一个基本上是计算器的表格。你可以输入一个方程,它会计算它。我还有 2 个内存字段(名为 m1 和 m2 的文本框),您可以在其中输入一些内容,它将保存该值,然后当您在第一个框中输入表达式时,您可以在等式中引用 m1 或 m2 它将使用您在内存字段中输入的数字进行评估。

问题是如果您尝试在方程式中引用 m1 或 m2 并且文本框为空白,则会出现未定义的错误。

我已经旋转了几个小时来尝试进行某种检查,如果等式被评估为未定义,则只显示一个弹出框。我在原始 javascript中需要这个。任何帮助表示赞赏。

function displayResult(thisElement)
{
    thisElement.value = eval(thisElement.value); <!-- this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc -->
    if(!(thisElement.value>0))
    {
        thisElement.value=0;
    }
}

function mem(v) 
{
    v.value = eval(v.value);
    eval(v.name+"="+v.value);
}

<input id="calcFormula" name="calculate" size="40" />
<input type="submit" value="Calculate" onclick="displayResult(this.form.calculate);" />

<input name="m1" id="m1" size="12" onchange="mem(this);" value="0" />
<input name="m2" id="m2" size="12" onchange="mem(this);" value="0" />
4

2 回答 2

11

我可以想到三个解决方案:

  1. 您可以假设空 m1/m2 表示 0,因此永远不会有未定义的值。这确实简化了事情。
  2. 您可以使用正则表达式首先检查方程中是否出现 m1 或 m2,如果存在,则检查是否未定义。
  3. 但最好的方法是使用try...catch

尝试/捕获示例:

try {
    eval('12+3+m1');
} catch (e) {
    alert(e.message);
}
于 2012-06-28T21:50:24.647 回答
1

eval 失败,因为它需要从表单字段加载数据,但 m1 不是表单字段的访问键。并且 m1 不是全局变量,因此失败。创建 2 个全局变量,并让 m1 和 m2 表单在更改时将它们的值存储在其中。

您的原始脚本失败,因为您的函数评估 m1 和 m2,但是当函数结束时它们被销毁,因为它们不是全局范围

 function displayResult(thisElement) {    thisElement.value = eval(thisElement.value); <!--  this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc --> if(!(thisElement.value>0)) { thisElement.value=0; }    }
m1=0;
m2=0;

<input id="calcFormula" name="calculate" size="40" /> <input type="submit" value="Calculate" onclick="displayResult(this.form.calc ulate);" />

<input name="m1" id="m1" onchange="m1=this.value" size="12" value="0" /> <input name="m2" id="m2" size="12" onchange="m2=this.value;" value="0" />

为什么您的原始代码失败:

Step 1. M1 is stored in the form.
step 2. Onchange event is fired
step 3. Function mem(this) is called
step 4. Entering scope of function mem
step 5. Inserting this.name into string
step 6. Inserting this.value into string
Step 7. evalling string
step 7.1 found code m1=1
step 7.1.1 check window object for variable named m1
step 7.1.1.1 failed. Create local variable for function mem called m1
step 7.1.1.2 assign value 1 to scope variable m1
step 7.1.1.3 exit eval
step 7.1.1.4 exit function mem(this)
step 7.1.1.5 check for scoped variables
step 7.1.1.6 scoped variable found m1
step 7.1.1.7 destroy scoped variable and free up memory
step 7.1.2.2 passed. retrieve pointer to window object variable m1
step 7.1.2.3 assign value 1 to window.m1
step 7.1.2.4 exit eval
step 7.1.2.5 exit function mem(this)
step 7.1.2.6 check for scoped variables
step 7.1.2.7 none found, resume other tasks.
于 2012-06-28T21:54:31.610 回答