evalを使うinputがある場合も安全に運用するための方法

このQ&Aのポイント
  • evalを使うinputがある場合も安全に運用するための方法として、エスケープを行います。
  • 四則演算子、数字、括弧以外は削除され、式として成立しない文字列は計算できません。
  • エスケープの表記位置はevalを実行する前であればどこでも良いです。
回答を見る
  • ベストアンサー

evalを使うinputがある場合も安全に運用する

https://okwave.jp/qa/q9368497.html のつづき evalを使うinputがある場合も安全に運用するために、エスケープしたいのですが、 下記のご回答で問題ないでしょうか? >>> 「四則演算子、数字、括弧」以外は削除されます。<br> また式として成立しない文字列は計算できません。<br> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> <script type="text/javascript"> <!-- function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/[ ]*([\-\/\*\+])[ \-\/\*\+]*/g, '$1'); r = r.replace(/^([ ]*[\/\*\+][ \-\/\*\+]*)/g, ''); r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([ ]+)/g, ' '); try{ alert(r+' = '+eval(r)); }catch(ex){ alert(ex.message+' : '+r); } } // --> </script> またエスケープの表記位置はevalを実行する前であればどこでも良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.22

>!"#$%&',:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ >をInputに入れてアラートの処理が実行されるか確かめてみます 「catch内が実行されるか(アラートの処理が実行されるか)」ではなく >r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); >r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/([ ]+)/g, ' '); ↑この「r」変数の値が''(ヌル文字)(文字が何も無い文字列)になるか、実際の「r」変数の値を表示してみて下さい。

その他の回答 (21)

回答No.21

>アラートが実行できなかったら他の関数は試さなくても問題ないとわかるということですかね。 (何か実行できるかと言うより)英文字、記号などが除去されていれば良い訳です。 !"#$%&',:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ↑ざっくりと言うと、これを入力して下記の「r」変数の値に何も返って来なければ基本的にOKです。 >r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); >r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/([ ]+)/g, ' ');

okweb12345
質問者

お礼

ありがとうございます。 !"#$%&',:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ をInputに入れてアラートの処理が実行されるか確かめてみます

回答No.20

>これでセキュアに使えるようになったと考えてよろしいでしょうか? >r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); ↑これで「四則演算子、数字、括弧」以外を除去してます。 これで基本的に関数類は実行できません。 ここは簡単なのでバグの入り込む余地はありません。 >r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); ↑これで(四則演算にならない)不正な「四則演算子」を除去してます。 ここはバグの入り込む余地がありますが、それほど複雑でもないので これで問題ないと思われます。 もしバグがあっても不正な「四則演算子」が残るだけなので、基本的に関数類は実行できません。 よって、(ハッキングでもされない限り)安全に「eval」を実行できるでしょう。

okweb12345
質問者

補足

アラートが実行できなかったら他の関数は試さなくても問題ないとわかるということですかね。

回答No.19

>>オブジェクトでも関数でもありません。 >>ざっくり言うと「if」文的な文です、「try」ブロック内で実行文がエラーになると例外が発生し、「catch」ブロック内が実行されます。 >whileなどと同じ構文の一種なのですね。 >tryはうまくいかずエラーが出た場合つまり、偽ならもう一つの処理を行うというものなのですかね。 ループではないので、「if」文的な文と考えて下さい、「try」ブロック内で実行文がエラーになると例外が発生し、「catch」ブロック内が実行されます。 >><input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> >イベントリスナーを使うのでこれが何を示しているかいまいちわからないのですが、 >何かキーボードを押したときに自作のCalculator >関数が実行されるという事でしょうか? >つまり何かキーボードを操作したときに毎回 >>r = a; >>r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); >>r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >>r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >>r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >>r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >>r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); >>r = r.replace(/([ ]+)/g, ' '); >が実行されて、記載した文字が上記でエスケープされるという事でしょうか? 下記で「Enterキー」でない場合は「return」してます。 if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 >エラー処理というものはエラーが起きてうまく計算できなかった時に出るalert()を作ればよさそうですね。 それ以外に「result = '';」とか代入しておかないと「result」変数が「undefined」になり、「Calculator」関数の帰り値が「undefined」になると思います。 >エンターを押した所、undefunedというアラートが出ました。 何か変な事をしてませんか?、例えば「test000.html」と言う新規ファイルを作って下記をコピペして下さい。 「四則演算子、数字、括弧」以外は除去されます。<br> また式として成立しない文字列は計算できません。<br> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> <script type="text/javascript"> <!-- function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/([ ]+)/g, ' '); try{ alert(r+' = '+eval(r)); // ←ここで「eval」を使ってます。 }catch(ex){ alert(ex.message+' : '+r); } } // --> </script>

okweb12345
質問者

お礼

ありがとうございます。 おかげさまでalert();をいれるとエラー時のアラートが表記され、 計算式を入れるとちゃんと計算結果が出るようになりました。 これでセキュアに使えるようになったと考えてよろしいでしょうか? 他にもこんな関数を入れて調べたほうがいいというものがあれば教えていただければ幸いです。

okweb12345
質問者

補足

確認しました r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); の前までは文字列があり、 これ以降に空になりました。 ソースのご質問は別質問にしますので、よろしければ、お付き合いお願いします。

回答No.18

エラー処理に何か書いた方が良いです、下記は一例です、自分に合ったエラー処理を記述して下さい。 >}catch(ex){ >// エラー処理 >} }catch(ex){ // エラー処理 result = ''; }

okweb12345
質問者

お礼

これエラー処理というものはエラーが起きてうまく計算できなかった時に出るalert()を作ればよさそうですね。 結果計算がうまくいかなかった時に処理する部分なのでしょうから、 閲覧者さんにそれがわかるメッセージがあればいいのですね。

回答No.17

>イベントリスナーを使うのでこれが何を示しているかいまいちわからないのですが 実際にコピペして動作させててみれば分かると思います。 >何かキーボードを押したときに自作のCalculator >関数が実行されるという事でしょうか? Enterキーで実行されます。 >私の場合、freeBtnを押したときに計算が実行されるので、freeBtnを押したときに 大体、下記のようになるハズです。 var freeBtn = document.getElementById('freeBtn'); freeBtn.addEventListener('click', function() { var userInput = document.getElementById('freeUserInput').value; var freeResult = Calculator(userInput); freeResult = round(freeResult); if (!(userInput === '')) { } else { } }); function Calculator(a){ var r, result; r = a; r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/([ ]+)/g, ' '); try{ result = eval(r); } }catch(ex){ // エラー処理 } return result; }

回答No.16

>回答No.15 amanojaku1 例えばinputエレメントに「2*3」と入力したらEnterキーを入力してみて下さい。

回答No.15

>回答No.14 amanojaku1 >if (!(13==kcode)){return;} >// ↑「13:Enterキー」でない場合は「return」 Enterキーで「Calculator」関数内の それ以降が実行されます。

okweb12345
質問者

お礼

エンターを押した所、undefunedというアラートが出ました。 if (!(13==kcode))の部分が恐らくエンターを押した場合に内部の処理を実行という意味なのですね。 つまり13がキーボードの数値で他のキーを押しても反応しないようにしているのですね。 これを私の場合はエンターを押したときにエスケープして、私の計算処理をするから、ボタンを押したときにこの二つを行うと変更すれば終了という事とでよろしいでしょうか?

回答No.14

>>try{ >>alert(r+' = '+eval(r)); // ←ここで「eval」を使ってます。 >>}catch(ex){ >>alert(ex.message+' : '+r); >>} >これは、オブジェクトですか? >tryとはなんでしょうか? >関数にも似ていますが、この形は初めて見ました。 オブジェクトでも関数でもありません。 ざっくり言うと「if」文的な文です、「try」ブロック内で実行文がエラーになると例外が発生し、「catch」ブロック内が実行されます。 >結論としては下記でよいのですね >function Calculator(a, kcode){ >var r; >if (!(13==kcode)){return;} >// ↑「13:Enterキー」でない場合は「return」 >r = a; >r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); >r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/([ ]+)/g, ' '); > >try{ >var freeBtn = document.getElementById('freeBtn'); >freeBtn.addEventListener('click', function() { >var userInput = document.getElementById('freeUserInput').value; >var freeResult = eval(userInput); >freeResult = round(freeResult); >if (!(userInput === '')) { >} else { >} >}); >} 「input」タグから「onKeyPress」イベントで「Calculator(this.value, event.keyCode)」を呼ぶように作ってあるのですが?、実際に下記を実行してみましたか? 「四則演算子、数字、括弧」以外は除去されます。<br> また式として成立しない文字列は計算できません。<br> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> <script type="text/javascript"> <!-- function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/([ ]+)/g, ' '); try{ alert(r+' = '+eval(r)); // ←ここで「eval」を使ってます。 }catch(ex){ alert(ex.message+' : '+r); } } // --> </script>

okweb12345
質問者

お礼

>>> オブジェクトでも関数でもありません。 ざっくり言うと「if」文的な文です、「try」ブロック内で実行文がエラーになると例外が発生し、「catch」ブロック内が実行されます。 whileなどと同じ構文の一種なのですね。 tryはうまくいかずエラーが出た場合つまり、偽ならもう一つの処理を行うというものなのですかね。 >>> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> イベントリスナーを使うのでこれが何を示しているかいまいちわからないのですが、 何かキーボードを押したときに自作のCalculator 関数が実行されるという事でしょうか? つまり何かキーボードを操作したときに毎回 >r = a; >r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); >r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); >r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); >r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); >r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); >r = r.replace(/([ ]+)/g, ' '); が実行されて、記載した文字が上記でエスケープされるという事でしょうか? すると関係ないところに入力した場合も実行されてしまいますね。 私の場合、freeBtnを押したときに計算が実行されるので、freeBtnを押したときにだけ上記を実行し、 その下に >var userInput = document.getElementById('freeUserInput').value; >var freeResult = eval(userInput); >freeResult = round(freeResult); >if (!(userInput === '')) { >} else { >} >}); が来ればエスケープされたものがevalに渡されると思うのですが、どうでしょうか? evalに渡される前にevalに渡す入力文字だけを上記のエスケープをすればよいで素よね?

回答No.13

>回答No.12 amanojaku1 >(「try」ブロック内に「eval」を記述した場合)式として成立してない文字列の場合に例外が発生し、「catch」ブロック内の処理が実行されます。 「try~catch」は「eval」以外でも使用できます、「try」ブロック内でエラーが発生すると、「catch」ブロック内の処理が実行されます。

回答No.12

>ただこの記述をどこに記載したらいいのですか?evalを使う直前に記載したらいいのですか? そうです、下記のサンプルを参照して下さい。 (下記のサンプルのように)必ず「try」ブロック内に「eval」を記述して下さい。 (「try」ブロック内に「eval」を記述した場合)式として成立してない文字列の場合に例外が発生し、「catch」ブロック内の処理が実行されます。 実際に式として成立してない文字列を入力してみれば「catch」ブロック内の処理が実行されているのが分かると思います(例として「1.2.3」、「1+」、「2(1」、「3(2)」など)。 「四則演算子、数字、括弧」以外は除去されます。<br> また式として成立しない文字列は計算できません。<br> <input type="text" name="gakunen" value="" onKeyPress="Calculator(this.value, event.keyCode)"> <script type="text/javascript"> <!-- function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/([ ]+)/g, ' '); try{ alert(r+' = '+eval(r)); // ←ここで「eval」を使ってます。 }catch(ex){ alert(ex.message+' : '+r); } } // --> </script>

okweb12345
質問者

お礼

try{ alert(r+' = '+eval(r)); // ←ここで「eval」を使ってます。 }catch(ex){ alert(ex.message+' : '+r); } これは、オブジェクトですか? tryとはなんでしょうか? 関数にも似ていますが、この形は初めて見ました。 結論としては下記でよいのですね function Calculator(a, kcode){ var r; if (!(13==kcode)){return;} // ↑「13:Enterキー」でない場合は「return」 r = a; r = r.replace(/([^0-9\.\-\/\*\+\(\) ]+)/g, ' '); r = r.replace(/([\*\/])[ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2$3'); r = r.replace(/[\+\-][ \+\-\*\/]*([\+\-])[ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*([\+\-])/g, '$1$2'); r = r.replace(/(^|\()[ \+\-\*\/]*[\*\/]/g, '$1'); r = r.replace(/([\+\-\*\/])[ \+\-\*\/]*[\*\/][ ]*([0-9\.\(]+)/g, '$1$2'); r = r.replace(/([ ]+)/g, ' '); try{ var freeBtn = document.getElementById('freeBtn'); freeBtn.addEventListener('click', function() { var userInput = document.getElementById('freeUserInput').value; var freeResult = eval(userInput); freeResult = round(freeResult); if (!(userInput === '')) { } else { } }); }

関連するQ&A

  • 同じFunctionで、同じ計算させたいのですが

    私は今、以下のようにここで教えていただいたプログラムを参考に組んでは見たものの、同じ行をいくつもコピペすると計算されなくなってしまいます。1行だけの計算でしようとするとうまく計算されるのですが・・・ <HTML> <HEAD> <TITLE> タイトルバーに表示されるテキスト </TITLE> <SCRIPT LANGUAGE="JavaScript"> <!--JavaScript function SUM(){ if(!isNaN(document.sum.text1.value) && !isNaN(document.sum.text2.value) && !isNaN(document.sum.text3.value) && document.sum.text1.value && document.sum.text2.value && document.sum.text3.value){ document.sum.text4.value = eval(document.sum.text1.value) + eval(document.sum.text2.value) - eval(document.sum.text3.value) } if( !isNaN(document.sum.text5.value) && !isNaN(document.sum.text6.value) && document.sum.text5.value && document.sum.text6.value){ document.sum.text7.value = eval(document.sum.text4.value) + eval(document.sum.text5.value) + eval(document.sum.tex6.value) } } //--> </SCRIPT> </HEAD> <BODY> <FORM NAME="sum" onSubmit="SUM();return false;"> A<INPUT TYPE="text" NAME="text1" onChange="SUM()" SIZE="10"><BR> B<INPUT TYPE="text" NAME="text2" onChange="SUM()" SIZE="10"><BR> C<INPUT TYPE="text" NAME="text3" onChange="SUM()" SIZE="10"><BR> D=A+B-C<INPUT TYPE="text" NAME="text4" onChange="SUM()" SIZE="10"><BR> E<INPUT TYPE="text" NAME="text5" onChange="SUM()" SIZE="10"><BR> F<INPUT TYPE="text" NAME="text6" onChange="SUM()" SIZE="10"><BR> G=D+E+F<INPUT TYPE="text" NAME="text7" onChange="SUM()" SIZE="10"><BR> </FORM> </BODY> </HTML>

  • Javaで計算結果によって文字色を変えたい

    下記のような計算プログラムを検討しています。 全くの素人なので、ネットで参考になるものを探して、やっとここまで出来ました。 計算結果の値によって文字色を変えたいのですが上手くいきません。 例えば、数値が100以上であれば青、200以上であれば、赤・・・というように設定したいのですが、どのように記述すれば良いでしょうか。 よろしくお願い致します。 <HTML> <HEAD> <TITLE>計算</TITLE> </HEAD> <BODY> <SCRIPT language="JavaScript"> <!-- function keisan1(x1,x2){ a=0.2*(eval(x1)/10)*(eval(x1)/10)*Math.sqrt(eval(x2))*1000; return a.toFixed(0);} function keisan2(x1,x2,x3,x4,s1){ b=eval(x2)+Math.pow((0.2*(eval(x1)/10)*(eval(x1)/10)*Math.sqrt(eval(x2))),2)*eval(document.getElementById('s1').value)*eval(x3)+0.01*eval(x4); return b.toFixed(2);} function keisan3(x1,x2){ c=200*Math.pow((eval(x1)/10),2)*(eval(x2)); return c.toFixed(0);} //--> </SCRIPT> <H3>TEST</H3> <FORM name="fk">※ 条件を入力して下さい <BR> <BR> 条件(1)<SELECT name="s1" id="s1" onchange="b();"> <OPTION value="0.2">A</OPTION> <OPTION value="0.9">B</OPTION> </SELECT> <BR> 条件(2)<INPUT size="10" type="text" name="d1" style="text-align:right"><BR> 条件(3)<INPUT size="10" type="text" name="d2" style="text-align:right"><BR> 条件(4)<INPUT size="10" type="text" name="d3" style="text-align:right"><BR> 条件(5)<INPUT size="10" type="text" name="d4" style="text-align:right"><BR> <BR> <INPUT type="button" value="計算開始" onclick="document.fk.calc1.value=keisan1(document.fk.d1.value,document.fk.d2.value);document.fk.calc2.value=keisan2(document.fk.d1.value,document.fk.d2.value,document.fk.d3.value,document.fk.d4.value,document.fk.s1.value);document.fk.calc3.value=keisan3(document.fk.d1.value,document.fk.d2.value);"> <BR> 回答(1)<INPUT size="10" type="text" name="calc1" style="text-align:right"> <BR> 回答(2)<INPUT size="10" type="text" name="calc2" style="text-align:right"> <BR> 回答(3)<INPUT size="10" type="text" name="calc3" style="text-align:right"> </FORM> </BODY> </HTML>

  • 初めて書いたけど、動かないw

    いろいろjsのサンプルとか見てて 作れそうと思って作ったんですが、動きません もしかしたらjs以前の問題かもしれませんが エラーではdocument.x1.x2がnullだとか・・ めちゃくちゃなものかもしれないですが、見てください おねがいします --------------------------- <html> <head> <script type="text/JavaScript"><!-- function keisan() { n1=document.x1.x2.value; n2=document.x1.x3.value; n1=eval(n1); n2=eval(n2); alert(n1+n2); } // --></script> </head> <body> <form neme="x1"> 計算します<br/> <input name="x2" type="text" value="1"> + <input name="x3" type="text" value="2"> <input type="button" value="=" onClick="keisan()"> </form> </body> </html>

  • javascriptでフォームの値の計算

    javascript1か月目の初心者です。 7つのテキストフィールドに数値を代入させて合計と平均(最後には標準偏差)を計算しようと思ってます。 以下のように考えましたが、うまくいきません。 strが文字列として?扱われてしまっているようです。 strをevalで囲んでみてもダメです。 詳しい方教えてください。 <!--スクリプト1--> <SCRIPT LANGUAGE="JavaScript"> <!-- function f_check() { if(document.F1.num1.value!=""&&document.F1.num2.value!=""&&document.F1.num3.value!=""&&document.F1.num4.value!=""&&document.F1.num5.value!="" &&document.F1.num6.value!=""&&document.F1.num7.value!=""){ str=0 for(var i = 0;i<document.F1.length;i++){ str+=document.F1[i].value; } alert('合計は'+str+"です"); avrg = (str)/document.F1.length; alert('平均は'+avrg+'です'); //ここから標準偏差の計算(略)。 } // --> </SCRIPT> <form method="post" name="F1" onSubmit="return f_check()"> 数値を入れてください<input type="text" name="num1" size="5"><br> 数値を入れてください<input type="text" name="num2" size="5"><br> 数値を入れてください<input type="text" name="num3" size="5"><br> 数値を入れてください<input type="text" name="num4" size="5"><br> 数値を入れてください<input type="text" name="num5" size="5"><br> 数値を入れてください<input type="text" name="num6" size="5"><br> 数値を入れてください<input type="text" name="num7" size="5"><br> <INPUT TYPE=SUBMIT VALUE="平均をとる"></FORM>

  • Evalの正しいソースを教えてください

    <body> <form id="fm"> <input name="t1" value="てすと"> </form> <script language="VBScript"> Function bt_onClick() MsgBox Eval("t" & CStr(1) & ".value") End Function </script> <button name="bt"></button> </body>

  • javascriptをはじめて勉強しているものです。

    javascriptをはじめて勉強しているものです。 すみません。 以下のソースで、フォームがサブミットされたら、 inputの中身の値をチェックするものです。 chkValue()実行時、 emailアドレスの入力形式をチェックする関数をいれていますが、 こちらが、意図した動作をしません。(GETされてしまう) 原因教えていただきたいです。 お手数をお掛けしますが、どうぞよろしくお願いいたします。 <html> <head> <script type ="text/javascript"> <!-- function chkNum(T){ if(T.value.match(/[^0-9]/g)){ T.value=""; alert("数値以外は入力できません。"); } } function chkValue(){ if(document.myform.tboxInt.value.match(/[0-9]{4}/)){ document.myform.tboxInt.style.backgroundColor="#000"; }else{ alert("4桁の数字でないといけません。"); document.myform.tboxInt.style.backgroundColor="#f99"; document.myform.tboxInt.focus(); return false; } if(document.myform.tboxemail.value.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/)){ alert("ok"); }else{ document.myform.tboxEmail.value=""; alert("正しいメールアドレス形式で入力してください。"); document.myform.tboxemail.style.backgroundColor="#f99"; document.myform.tboxemail.focus(); return false; } alert(document.myform.tboxemail.value); alert("ok2") return true; } //--> </script> </head> <body> <form name="myform" onSubmit="return chkValue()"> <table border="1"> <tr> <td>数値フィールド</td> <td><input type="text" name="tboxInt" onkeyup="chkNum(this)"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="tboxemail"></td> </tr> </table> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <input type="submit" value="確認"> </form> </body> </html>

  • Java 計算結果の表示ボックスの書式を変えたい

    計算結果が表示されるボックスの表示(回答(1)(2)(3)のみ)を下記のようなバリエーションで変えたいのですが、どのように記述すれば良いでしょうか。 (1)枠線の色を変えたい (2)枠線の太さを変えたい (3)枠線内(ボックス)を一定の時間で、任意の色で点滅させたい(現在は条件をつけて枠内の色が変わるように記述しています) よろしくお願い致します。 <HTML xmlns="http://www.w3.org/1999/xhtml" lang="ja"> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <TITLE>計算テスト</TITLE> </HEAD> <BODY bgcolor="#FFFFCC"> <FONT SIZE="3"> <SCRIPT language="JavaScript"> <!-- function keisan1(x1,x2){ a=0.2*(eval(x1)/10)*(eval(x1)/10)*Math.sqrt(eval(x2))*1000; return a.toFixed(0);} function keisan2(x1,x2,x3,x4,s1){ b=eval(x2)+Math.pow((0.2*(eval(x1)/10)*(eval(x1)/10)*Math.sqrt(eval(x2))),2)*eval(document.getElementById('s1').value)*eval(x3)+0.1*eval(x4); return b.toFixed(2);} function keisan3(x1,x2){ c=20*(eval(x1)/10)*(eval(x1)/10)*(eval(x2)); return c.toFixed(0);} function calc(){ // ← 計算ボタンが押されたらこの関数が呼ばれる   var d1 = document.fk.d1;   var d2 = document.fk.d2;   var d3 = document.fk.d3;   var d4 = document.fk.d4;   var s1 = document.fk.s1;   var ans1 = keisan1(d1.value, d2.value);   var calc1 = document.fk.calc1;   calc1.value = ans1;   var ans2 = keisan2(d1.value, d2.value, d3.value, d4.value, s1.value);   var calc2 = document.fk.calc2;   calc2 .value = ans2 ;   if(ans2 >= 0) calc2.style.color = "#e60000";   if(ans2 >= 0) calc2.style.backgroundColor = "#ffffff";   if(ans2 >= 1.4) calc2.style.color = "#ffffff";   if(ans2 >= 1.4) calc2.style.backgroundColor = "#e60000";   var ans3 = keisan3(d1.value, d2.value);   var calc3 = document.fk.calc3;   calc3.value = ans3;   if(ans3 <180) calc3.style.backgroundColor = "#D5FFCB";   if(ans3 >=180) calc3.style.backgroundColor = "#FFCC99";   if(ans3 >=270) calc3.style.backgroundColor = "#FF9999"; } //--> </SCRIPT> <FONT SIZE="5"><B>計算</B></font><BR> <FORM name="fk"> <FONT SIZE="3">   ●条件(1):<INPUT size="7" type="text" name="d1" style="text-align:right"><BR>   ●条件(2):<INPUT size="7" type="text" name="d2" style="text-align:right"><BR>   ●条件(3):<SELECT name="s1" id="s1" onchange="b();"> <OPTION value="0.1">A</OPTION> <OPTION value="0.2">B</OPTION> </SELECT> <BR>   ●条件(4):<INPUT size="7" type="text" name="d3" style="text-align:right"><BR>   ●条件(5):<INPUT size="7" type="text" name="d4" style="text-align:right"><BR> <BR>   <INPUT type="button" value="計算開始" onclick="calc()"> <BR> <BR>   ◆回答(1):<INPUT size="7" type="text" name="calc1" style="text-align:right"><BR>   ◆回答(2):<INPUT size="7" type="text" name="calc2" style="text-align:right"><BR>   ◆回答(3):<INPUT size="7" type="text" name="calc3" style="text-align:right"><BR> <BR> </FONT> </FORM> </BODY> </HTML>

  • 『`』がテキストタイプのvalueにある場合にhiddenを追加すると表示が崩れる

    言葉では説明できないためコードを記載致しました。 下記のコードでボタンを押下した場合に表示が崩れるのは何故でしょうか?(IE6,IE7で確認) 又、対策としてはどのような事が考えられるでしょうか?(『`』を入力禁止以外でお願い致します。) 尚、innerHTMLをalertで出すとうまく追加されていないようです。。。 よろしくお願い致します。 <html> <head> <script> function createhidden( name, value, formname ){ str = '<input type="hidden" name="aaa" value="bbb"/>'; document.forms[0].innerHTML += str; } </script> </head> <body> <form action="" name="form1"> <input type="text" name="b"value="`"/><br><br> <input type="button" value="CREATE HIDDEN" onclick="createhidden()"/> <input type="text" name="a"value="`"/><br><br> </form> </body> </html>

  • CFLOOPで計算させたいのですが(2)

    先ほどとの関連になりますが、 <SCRIPT LANGUAGE="JavaScript"> <!--JavaScript function TotalSum(i) { var evalStr = eval("document.sum" + i); with(evalStr) { if(!isNaN(text1.value) && !isNaN(text2.value) && !isNaN(text3.value) && text1.value && text2.value && twxt3.value); { text4.value = eval(text1.value) + eval(text2.value) - eval(twxt3.value); } if( !isNaN(text5.value) && !isNaN(text6.value) && text5.value && text6.value); { text7.value = eval(text4.value) + eval(text5.value) + eval(text6.value); } } } // --> </script> </head> <body> <TABLE BORDER="1"> <FORM name="myform" action="url" method="post" onSubmit="TotalSum(' + i + ');return false;"> <cfloop index="i" from="1" to="10"> <TR> <TD><input type="text" name="text1" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text2" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text3" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text4" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text5" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text6" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text7" onChange="TotalSum('+i+')" value="0"></TD> </TR> </cfloop> </form> </TABLE> </body> また、見当はずれなこと言っていたらすみません。

  • JAVASCRIPTでINPUT

    HTMLとJAVASCRIPTとJSPを使ってシステム構築をしております。 --------------- <html> <head> <SCRIPT Language="JavaScript"> <!-- function send() { alert("<input type=text name=name2>"); } // --> </SCRIPT> </head> <body> <form onSubmit="send(); return false;"> <input type=text name=name1> <input type=submit> </form> </body> </html> --------------- 上記のコードでやりたいことは、 submitボタンが押されたときにJAVASCRIPTを呼び出し JAVASCRIPT上で文字を入力し次画面へ送信するような機能を作りたいと思っているのですが、本を見てもなかなか載っていません。 もしかしたらJAVASCRIPTだけではできないかもしれません。 JSPまたはPHPで出来る機能でも良いので教えてください。

専門家に質問してみよう