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

私は3つの解決策を考えることができます:

  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

フォーム フィールドからデータをロードする必要があるため、evalfails が失敗しますが、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 に答える