初心者のためのJavaScriptプログラム作成方法

このQ&Aのポイント
  • 初心者の方に向けて、JavaScriptを使用したプログラム作成方法を解説します。
  • HTMLにinput type="button"を配置し、ボタンクリックでvalueをアラート表示するプログラムを作成します。
  • プログラムを実行すると、アラートが表示される問題が発生するため、原因と解決方法について説明します。
回答を見る
  • ベストアンサー

〔初心者〕クリックで答えをアラート表示

初めてのjavascriptでプログラムを作成します。 HTMLにinput type="button"をいくつか設置し、ボタンクリックでそのvalueをアラートで表示するプログラムを作りたいのですが、以下のソースを実行するとプログラムを読み込んだ時点でアラートが表示されてしまいます。 onclickにしているのですが、なぜこうなってしまうのでしょうか。 いまいち関数にパラメーターを設定する(?)という意味がわかっていないので、そこが問題なのかなとも思っているのですが、どうでしょうか。 よろしくお願いいたします。 window.onload = initAll; function initAll(){ var allButtons = document.getElementsByTagName("input"); for (var i=0; i<allButtons.length; i++){ if(allButtons[i].type == "button"){ allButtons[i].onclick = ansQue(allButtons[i].value); } } } function ansQue(thisAns){ alert("あなたは" + thisAns + "と答えました"); }

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5066/13239)
回答No.1

hoge.onclick = XXX でイベントをセットする場合、=の右辺(XXX部分)には関数名だけを渡さなければいけません。 引数を付けて書いてしまうと、関数の実行結果が onclick イベントとしてバインドされるため、初期化時に関数が実行されてしまいます。 以下のようなプログラムにすると良いのではないでしょうか。 window.onload = initAll; function initAll(){ var allButtons = document.getElementsByTagName("input"); for (var i=0; i<allButtons.length; i++){ if(allButtons[i].type == "button"){ allButtons[i].onclick = ansQue; } } } function ansQue(){ alert("あなたは" + this.value + "と答えました"); }

kotaron8
質問者

お礼

とてもわかりやすく説明していただき、ありがとうございます! 知らなかった重要なことがわかって、とてもすっきりしました! thisの使い方がいまいちだったとわかれてよかったです!

関連するQ&A

  • アラートを出したいのですが・・

    以下のような感じでラジオボタンのリンクで、何も選択していない状態でGOボタンを押すと アラートが出るようにしたいのですが、どうしたらよいのかわからなくて困っています。 できれば、フルーツを選んでない場合は「フルーツを選んでください」と、価格を選んでない場合は 「価格を選んでください」と、両方選んでない場合は上記の2つとも出るようになれば理想なんですけど・・・ どうか宜しくお願い致します。m(_ _"m)ペコリ <script language=javascript> <!-- window.onload = function(){ document.forms[0]["GO"].onclick = function(){ var fruits2 = document.forms[0]["fruits"]; var price2 = document.forms[0]["price"]; function getCheckedElement(nl){ for(var i=0;i<nl.length;i++){ if(nl[i].checked) return nl[i]; } } var fruits = getCheckedElement(fruits2).value; var price = getCheckedElement(price2).value; URL = '/' + fruits + '/' + price; window.location = URL; } } --> </script> <form action="javascript:void(0)"> <input type="radio" name="fruits" value="APPLE">リンゴ<br> <input type="radio" name="fruits" value="ORANGE">ミカン <BR><BR> <input type="radio" name="price" value="100.html">100円均一商品<BR> <input type="radio" name="price" value="300.html">300円均一商品<BR> <input type="radio" name="price" value="500.html">500円均一商品<BR> <BR><BR> <input type="button" value="GO" name="GO" onclick="check()"> </form>

  • alert表示で計算結果がうまく表示しません

    alert表示で計算結果がうまく作動しません。 全問正解しても『0』と表示されてしまいます。 for文がうまくいっていないのだと思いますが どう解決していいのか、まったく解りません。 おわかりになる方がいらっしゃいましたら教えて下さい。 <script language="JavaScript"> <!-- function func() { $A = new Array(6); $A[1] = "n"; $A[2] = "n"; $A[3] = "n"; $A[4] = "n"; $A[5] = "n"; var $q_no; var $i_end; var $i = parseFloat($i); var $ans= parseFloat("0"); $i_end = parseFloat($q_no); $i_end = $i_end + 1; for($i; $i < $i_end; $i++){ if ($A[$i] == document.Frm_Q.Q[$i].value){ $ans= $ans + 10; } } alert($ans); } // --> </script> <form name="Frm_Q"> <input type="radio" name="Q[1]" value="Y">はい<input type="radio" name="Q[1]" value="n">いいえ<br>###Q5まで続く### <input type="button" value=" 採 点 " onClick="func()"> <input type="reset" value="リセット"> </form>

  • 入力した文字をalertで表示するスクリプトを作っています。

    入力した文字をalertで表示するスクリプトを作っています。 以下、IEとOperaでは動作しますが、FirefoxとGoogle Chromeでは動作しません。 書き方が悪いのでしょうか? <html> <head> <script language=JavaScript> <!-- function test(){ alert(input1.value); } // --> </SCRIPT> </HEAD> <BODY> <input type="text" name="input1"> <input type="button" value="テスト" onClick="test()"> </html>

  • onclickの中のvar i

    天才のプログラマーの皆様に質問です。 要素にonclickイベントを設定したいのですが、下記のコードの問題の行★★★について ご説明をいただけないでしょうか? htmlファイル---------------------------- <input type="button" id="card_0" value="?"> <input type="button" id="card_1" value="?"> <input type="button" id="card_2" value="?"> <input type="button" id="card_3" value="?"> jsファイル------------------------ var el=document.getElementsByTagName("input"); for(var i=0;i<el.length;i++){ console.log(i); // 0,1,2,3 el[i].onclick=function(){ flip(this.id.replace(/^card_/,"")); //関数を設定  正しく設定されている console.log(this.id.replace(/^card_/,"")); // 0,1,2,3 console.log(i); //★★★ 0,1,2,3ではなく、なぜか4が表示されてしまう flip(i)では動作しない flip(this.id.re...略)のthisはel[i]でも動作しません }; } function flip(n){ 略 }

  • localStorageでのcheckbox制御

    下記サイトを参考に、テキストボックスとチェックボックスをlocalStorageに保存するプログラムを作ってみました。 http://jsdo.it/twi_masa/hx8D 質問ですが、チェックやテキストを書いて保存ボタンを押すとlocalStorageに値が保存されることはchromeのデベロッパーツールで確認しました。 値がある状態でロードを押すとその保存された状態に復元されますが、それをロードボタンを押さずにページが読み込まれた直後に表示させる方法が知りたいです。 window.onload = function(){ 処理 } だと思い、 load : functionをwindow.onload = functionへ単純に変更しましたが、それでは保存もロード出来なくなってしまいました。 自分では全く書けないので、出来ましたらソースを書いていただけるとありがたいです。 よろしくお願いします。 <table> <tr> <td>テキスト</td> <td><input type="text" id="text1" /></td> </tr> <tr> <td>チェックボックス</td> <td> <input type="checkbox" id="checkbox1" value="0">チェック1 <input type="checkbox" id="checkbox2" value="0">チェック2 </td> </tr> </table> <input type="button" value="保存" onclick="hx8D.save();"> <input type="button" value="ロード" onclick="hx8D.load();" /> <script> var hx8D = function(){ var HX8D = function(){}; HX8D.prototype = { save : function(){ var elements = document.getElementsByTagName("input"); for(var i=0; i<elements.length; i++){ var type = elements[i].type; var key = elements[i].id; if(type == "text"){ localStorage[key] = elements[i].value; }else if(type == "checkbox"){ localStorage[key] = elements[i].checked; } } }, load : function(){ var elements = document.getElementsByTagName("input"); for(var i=0; i<elements.length; i++){ var type = elements[i].type; var key = elements[i].id; if(type == "text"){ elements[i].value = localStorage[key]; }else if(type == "checkbox"){ elements[i].checked = localStorage[key] == "true" ? true : false; } } }, }; return new HX8D(); }(); </script>

  • javascript 乱数が取得できない

    はじめまして。 一月ほど前から「パズルネット ソフィア」 http://www.pori2.net/js/number/4.html というサイトでjavascriptの基礎を学んでいるのですが、乱数 を扱う段階になって自分の作成したプログラム(以下) <html> <head> </head> <body onload="Mondai()"> <form name="quiz"> <input type="text" value="" > <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- var col=new Array("red","bleu","yellow","green","white"); var Rnd; function Mondai(){ Rnd=Math.floor(Math.random() * 5 ); document.quiz.element[0].value=col[Rnd]; } function Push(num){ var n=parseInt(num); if( n==Rnd ){ Mondai(); }else{ alert("違います。"); } } // --></script> </body> </html> を実行してもテキストボックス内に何の値も表示されず 、ボタンを押しても「違います。」とだけしか出てきません。 ブラウザはfirefoxを使用しており、javascriptの設定もonに なっています。 カンマや鍵括弧などの記号にも打ち間違いがないかサンプル プログラムを参考にしながら確認してみたのですが、どこにも おかしな点はありませんでした。 サンプルプログラムは下記のとおりで、こちらは正常に実行されます。 <body onload="Mondai()"> <form name="quiz"> <input type="text" value=""> <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- //色名の英単語を配列に入れる var col=new Array("red","blue","yellow","green","white"); //乱数を入れる変数 var Rnd; //テキストボックスに問題文(色名)を表示する関数 function Mondai(){ //0~4までの乱数を発生させる Rnd=Math.floor( Math.random() * 5 ); document.quiz.elements[0].value=col[Rnd]; } //正誤判定関数 function Push(num){ //引数を数字に変換 var n=parseInt(num); //正解なら次の問題を表示、間違っていたらアラートを表示する if ( n == Rnd ){ Mondai(); }else{ alert("違います!"); } } // --> </script> どなたかアドバイスをいただけないでしょうか? よろしくお願いします。

  • alert閉じた時、htmlに文章を追加表示したい

    下記プログラムは、自分の勉強用で作ったものですが、 解答ボタンを押して正解し、alertウィンドウを閉じた瞬間に 説明文のsm1,sm2,sm3をhtml上に追加表示するには どこをどう直したらいいのでしょうか? よろしくお願いいたします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <script language="JavaScript"> <!-- var sm1; var sm2; var sm3; function kaitou1(){ if(document.myForm.ans1.value == "number"){ alert("正解です"); sm1 = "number型とは~"; }else{ alert("違います"); } } function kaitou2(){ if(document.myForm.ans2.value == "string"){ alert("正解です"); sm2 = "string型とは~"; }else{ alert("違います"); } } function kaitou3(){ if(document.myForm.ans3.value == "boolean"){ alert("正解です"); sm3 = "boolean型とは~"; }else{ alert("違います"); } } //--> </script> </head> <body> <p style="width:330px; padding:5px; background-color:#ddd">変数の基本的なデータ型には3つあります。<br> それら3つは何でしょう?<br> 下記○○に半角英数字で入力して下さい。</p> <form name="myForm"> <p>数値を表す○○型 ⇒  <input type="text" size="20" name="ans1"> <input type="button" value="解答" onclick="kaitou1()"> </p> <p>文字列を表す○○型 ⇒  <input type="text" size="20" name="ans2"> <input type="button" value="解答" onclick="kaitou2()"> </p> <p>真偽を表す○○型 ⇒  <input type="text" size="20" name="ans3"> <input type="button" value="解答" onclick="kaitou3()"> </p> </form> <script language="JavaScript"> <!-- document.write("<p>"+sm1+"</p>"); document.write("<p>"+sm2+"</p>"); document.write("<p>"+sm3+"</p>"); //--> </script> </body> </html>

  • 複数ボタンのクリックイベント

    JavaScriptのイベントなのか変数のスコープなのかで質問がございます。 (一番下に全ソースを貼りました。見づらくて申し訳ありません。) htmlに複数の似た名前のボタンがあります。 名前:button_n (n = 0 to 9) 押されたボタンに応じた処理を登録しようと思い、下記を 9個書いたところ 望んだ動きをしました。 document.getElementById('button_'+0).onclick = function() { clicked(0); } document.getElementById('button_'+1).onclick = function() { clicked(1); } ...... document.getElementById('button_'+9).onclick = function() { clicked(9); } これでは芸がないので、添字の部分を変数にし、下記のようにしたところ for (i=0; i<10; i++) {    document.getElementById('button_'+i).onclick = function() { clicked(i); } } どのボタンを押しても動きません。 私の認識、以下です。  ・0~9のイベントは正しく登録されている。  ・しかし、全てがchecked(10)を呼んでいる 質問1  これを回避する方法と、その対処理由を教えて頂きたくお願い致します。   質問2(オプション)  参考になる資料を教えていただければ幸いです。  例)サイ本のどこを読めばいいよ。とか、このURLがわかりやすいよ。等 よろしくお願い致します。 ■ソース <!DOCTYPE html><html lang="ja"> <head><meta charset="utf-8"></head> <body> <h2>所望の動きをする</h2> <input type="button" id="button_0" value="0"> <input type="button" id="button_1" value="1"> <h2>所望の動きをしてくれない</h2> <p></p> <input type="button" id="button_2" value="2"> <input type="button" id="button_3" value="3"> <script> (function() { document.getElementById('button_'+0).onclick = function() { clicked(0); } document.getElementById('button_'+1).onclick = function() { clicked(1); } /* 配列の最後の添字が使われる気がする。 */ for (i=2; i<4; i++) {    document.getElementById('button_'+i).onclick = function() { clicked(i); } } function clicked(n) { var btn = document.getElementById('button_' + n); console.log(btn.value); alert(btn.value); } })(); </script> </body><html>

  • javascript getelementsbytagnameについてです。

    var keisan=document.getElementsByTagName('input'); for(i=0;i<=keisan.length;i++){ if(keisan[i].getAttribute('value').match('Click')){ keisan[i].onclick=add(); } } function add() { var a = document.getElementById('number1').value; var b = document.getElementById('number2').value; var c = a - -b; alert(c); } 上のプログラムを入れると、"keisan[i]はnullです"といったエラーがでます。 kaisan.length=0になっているみたいです…。 xhtmlだと作動するのですが、htmlだと作動しません。 対応してないのでしょうか? 宜しくお願いいたします。

  • javascript クイズ

    こちらの http://okwave.jp/qa/q4105194.html 回答のNo.4の回答者様のソースコードなのですが <html> <head><style>.hid{display:none} .disp{display:block}</style></head> <body> <div id="s0">Start!!<input type="button" value="click" onClick="view();$('s0').className='hid';"></div> <div id="mn"></div> <div id="s1" class="hid"> Q1.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s2" class="hid"> Q2.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s3" class="hid"> Q3.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s4" class="hid"> Q4.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s5" class="hid"> Q5.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="hz" class="hid"> はずれでした! <input type="button" value="次に進む" onClick="nextq()"> </div> <div id="sk" class="hid"> 正解です! <input type="button" value="次に進む" onClick="nextq()"> </div> <script> var n=3; var q=5; var f=[]; var l=[]; var c=0; var cntc=0; window.onload=function(){ for(var i=0;i<n;i++){ do x=Math.floor(Math.random()*q)+1; while(f[x]) f[x]=true;l[i]=x; } } function view(){$('s'+l[c]).className='disp';$('mn').innerHTML=c+1+"問目";} function $(o){ return document.getElementById(o); } function hazure(){ $('hz').className='disp';} function seikai(){ $('sk').className='disp'; cntc++;} function nextq(){ $('sk').className='hid'; $('hz').className='hid'; $('s'+l[c]).className='hid'; if(++c>=n) owari(); else view(); } function owari(){ $('mn').innerHTML='正解数は、'+cntc; } </script> このままですと正解と不正解のボタンがそれぞれ一回ずつ押せてしまいます これを正解、不正解のどちらか一回しか押せないようにするにはどうすればよろしいでしょうか? よろしくお願いします。

専門家に質問してみよう