JavaScriptでコンストラクタについて

このQ&Aのポイント
  • JavaScriptのコンストラクタについて質問です。
  • コンストラクタを使って1ページで複数使用する方法を教えてください。
  • JavaScriptで複数のIDを使いまわす方法について教えてください。
回答を見る
  • ベストアンサー

JavaScriptでコンストラクタについて

現在、JavaScriptを勉強中なのですが、 コンストラクタについて質問です。 下記のようなコードの場合、document.getElementByIdで取得したID 以外、使いまわしが出来ませんが、 コンストラクタを使って、1ページで複数使用出来るようにするには、 どのように記述すれば良いのでしょうか? //-----JavaScript----- function addEvent(elm,listener,fn){ try{ elm.addEventListener(listener,fn,false); }catch(e){ elm.attachEvent("on"+listener,fn); } } var c,y,m,d; addEvent(window,"load",function(){ c = document.getElementById("customer_birthday_c"); y = document.getElementById("customer_birthday_y"); m = document.getElementById("customer_birthday_m"); d = document.getElementById("customer_birthday_d"); if(c.options[0].selected == true){ y.disabled = true; m.disabled = true; d.disabled = true; } }); //-----JavaScript----- どなたかご教授ください。 宜しくお願いいたします。

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

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

IEの事を考えるとこうするしかないのか... <script type="text/javascript"> function hoge(doc,parm){  this.c = doc.getElementById(parm.c);  this.y = doc.getElementById(parm.y);  this.m = doc.getElementById(parm.m);  this.d = doc.getElementById(parm.d);  var win = doc.defaultView || window;   if("undefined" !== typeof document.addEventListener)    win.addEventListener("load",this,false);   else if ("undefined" !== typeof document.attachEvent)    win.attachEvent("onload",(function(obj){    return function(){obj.func();};    })(this)); } hoge.prototype.handleEvent = function(event){  if (event.type == "load" && event.target == this.doc)   this.func(); } hoge.prototype.func = function(){  if(this.c && this.y && this.m && this.d){   if(this.c.options[0].selected == true){    this.y.disabled = "disabled";    this.m.disabled = true;    this.d.disabled = true;   }  } }; var fuga_1 = new hoge(document,  {  c:"customer_birthday_c",  y:"customer_birthday_y",  m:"customer_birthday_m",  d:"customer_birthday_d"  } ); </script> 別パターンもきっとあるはずだ。

hunter_999
質問者

補足

ご回答ありがとうございます。 上記のやりかたで上手くいきました。 this.c.onchangeとかイベントを 設定する方法もわかれば教えていただきたい次第です。 よろしくお願いいたします。

その他の回答 (3)

  • aki_mana
  • ベストアンサー率25% (1/4)
回答No.4

「コンストラクタ&使い回し」ってことから、SELECT要素へのアクセスを簡単な記述にしたいと勝手に解釈しました。 もしそうであれば、普通にSELECT要素を包括するクラスを設計すればいいかと思います。 // JSUIselect class. (constructor) function JSUISelect( id ) { this.selectElm = document.getElementById( elementid ); } JSUISelect.prototype = { selected : function() { return this.selectElm.selected == true; }, disable : function() { this.selectElm.disabled = true; } }; 他にもやりたいことがあればメンバ関数を追加の方向で。 (恐らく、OPTION要素を簡単に追加したいなどの要望があるはず) ここでは、質問にあった内容をそのまま実現するコードに置き換えるだけにします。 // omitted addEvent() var c,y,m,d; addEvent(window,"load",function(){ c = new JSUISelect('customer_birthday_c'), y = new JSUISelect('customer_birthday_y'), m = new JSUISelect('customer_birthday_m'), d = new JSUISelect('customer_birthday_d'); if(c.selected()) { y.disable(); m.disable(); d.disable(); } }); ライブラリ依存のフロントエンド開発では一般的じゃないです。 拠って動作確認していませんので悪しからず。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

そのまま、書いてみただけ <script type="text/javascript"> function hoge(doc,parm){  this.c = doc.getElementById(parm.c);  this.y = doc.getElementById(parm.y);  this.m = doc.getElementById(parm.m);  this.d = doc.getElementById(parm.d);  var win = doc.defaultView;   if("undefined" !== typeof doc.addEventListener)    win.addEventListener("load",this.func,false);   else if ("undefined" !== typeof doc.attachEvent)    window.attachEvent("onload",this.func); } hoge.prototype.func = function(){  if(this.c && this.y && this.m && this.d){   if(this.c.options[0].selected == true){    this.y.disabled = true;    this.m.disabled = true;    this.d.disabled = true;   }  } } var fuga_1 = new hoge(document,"load",{  c:"customer_birthday_c",  y:"customer_birthday_y",  m:"customer_birthday_m",  d:"customer_birthday_d" }); </script>

回答No.1

コンストラクタを使って、(という言い方も何かへんですが、とりあえず置いておいて。) 何をしたいのですか? また、何を使い回ししたいのですか?

関連するQ&A

  • 【javascript 】addEventListenerでもattachEventでもないブラウザ

    http://www.dustindiaz.com/top-ten-javascript/ 上記に記載されている、addEvent()について教えてください。 以下は抜粋です。(行頭は全角スペースです。) function addEvent(elm, evType, fn, useCapture) {  if (elm.addEventListener) {   elm.addEventListener(evType, fn, useCapture);   return true;  }  else if (elm.attachEvent) {   var r = elm.attachEvent('on' + evType, fn);   return r;  }  else {   elm['on' + evType] = fn;  } } 質問1 elseになるブラウザって、どのようなブラウザがあるのでしょうか? ご存知でしたら教えてください。 質問2 elseになるような場合、イベントを削除するには下記の様になるのでしょうか? elm['on'+evtType] = function () { return false; }; 以上、よろしくお願いいたします。

  • <body>にwindow.onload = functionを2つ設定すると、最後に書いたイベントだけが実行されてしまいます。

    <body>タグにonloadイベントを実行させる2つの外部jsを<head>内に設置し実行すると、 最後に記述したイベントだけが反映されてしまいます。 http://blog.webcreativepark.net/2008/02/26-185844.html を参考にいろいろといじってはみたのですが、 function addEvent(elm,listener,fn){ try{ elm.addEventListener(listener,fn,false); }catch(e){ elm.attachEvent("on"+listener,fn); } } js初心者でして、上の関数の中にどのように記述をすれば良いのかわかりません。 IE6・IE7・safariで動作させるには、実際にどのようなソースを書けばいいのでしょうか。 どなたかご教授いただけますでしょうか。 <head>内の外部jsは、以下のように記述しました。 <script src="/A.js" type="text/javascript"></script> <script src="/B.js" type="text/javascript"></script> </head> 外部jsのソースは以下になります。 //A.js window.onload = function() { var blur = function () { this.blur() }; for (var i = 0; i < document.links.length; i++) document.links[i].onfocus = blur; } //B.js window.onload = function() { prepZooms(); insertZoomHTML(); zoomdiv = document.getElementById(zoomID); zoomimg = document.getElementById(theID); } 以上になります。宜しくお願い致します。

  • イベントリスナーに設定した関数内で、id属性の値を取得するには

    IEでイベントリスナーに設定した関数で、イベントを発生させた要素のid属性値を取得する方法が分からずに困っています。 記述したコードは下記のようになります。Firefoxではうまく動作しました。 clickHandler内でFirefoxのe.currentTarget.idに対応するような処理はどのように行えばよいでしょうか。 ------------ JavaScript部分 ----------------------- function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; } else { elm['on' + evType] = fn; } } function clickHandler(e) { var id; if (document.all && !window.opera) { // IEの場合に、ここの処理でid属性の属性地 hoge1やhoge2を取得したい。 // id = window.event.srcElement.id; これではだめ } else { id = e.currentTarget.id; } // idに応じた処理 } var elm1 = document.getElementById('hoge1'); var elm1 = document.getElementById('hoge2'); addEvent(elm1,'click',clickHandler,false); addEvent(elm2,'click',clickHandler,false); ------------ HTML部分 ----------------------- <li><a id="hoge1" href="#"><img src="●●" /></a></li> <li><a id="hoge2" href="#"><img src="●●" /></a></li> 先に進むことができずに困っています。よろしくお願いします。

  • Javascriptによるフォームの選択表示について教えてください。

    Javascriptによるフォームの選択表示について教えてください。 概要としてはカートCGIのお客様情報入力欄のカスタマイズを行なっています。 別の場所への発送を希望される場合において(1)、(2)、(3)のラジオボタンを作り、それぞれ選択によって該当のフォームを表示するところまではできました。 問題は、(1)→1箇所、(2)→3箇所、(3)→5箇所とフォームを作ったところ、入力ページが表示された時点で(1)(2)(3)全ての表示がされた状態で表示されます。 ちなみに、その際にラジオボタンを選択すると(1)(2)(3)それぞれに対応したフォームが表示され切り替わります。 実際にやりたいことは、ページが表示された時点で(1)のフォームのみ表示されるようにし、(2)(3)とラジオボタンを選択された際にそこで初めて(2)(3)のそれぞれのフォームを表示したいと思っています。 以下はソースです。 ■Javascript <script type="text/javascript"> function func1() { document.getElementById("sele1").style.display="inline"; document.getElementById("sele1").disabled=false; document.getElementById("sele2").style.display="none"; document.getElementById("sele2").disabled=true; document.getElementById("sele3").style.display="none"; document.getElementById("sele3").disabled=true; } function func2() { document.getElementById("sele1").style.display="none"; document.getElementById("sele1").disabled=true; document.getElementById("sele2").style.display="inline"; document.getElementById("sele2").disabled=false; document.getElementById("sele3").style.display="none"; document.getElementById("sele3").disabled=true; } function func3() { document.getElementById("sele1").style.display="none"; document.getElementById("sele1").disabled=true; document.getElementById("sele2").style.display="none"; document.getElementById("sele2").disabled=true; document.getElementById("sele3").style.display="inline"; document.getElementById("sele3").disabled=false; } </script> ■CGI(HTML)側 <form action="xxx"> <table border=0 cellpadding=5 cellspacing=2 width=500> <p>発送先が2箇所以上の場合はこちらから選択ください。 <input type="radio" value="1" onclick="func1('block')" />1箇所</label> <input type="radio" value="2" onclick="func2('none')" />2箇所</label> <input type="radio" value="3" onclick="func3('none')" />5箇所</label> </p> </table> <table id="sele1"> </table> <table id="sele2"> </table> <table id="sele3"> </table> </form> table内容は省略しています。 説明が下手ですがどうかご教授ください。宜しくお願いします。

  • DOCTYPE宣言とjavascript

    United Statesを選んだ場合、州を選択。 それ以外の国の場合はtextフィールドで県なりを直接書き込む と言うようにしたく、下記の様にページを作成したのですが、 IE、Opera、Safariなど他では全て動作したのですが、 Firefoxのみ動作しませんでした。 但し、DOCTYPE宣言の"http://www.w3.org/TR/html4/loose.dtd" を削除したらFirefoxでも動作しました。 ただ、ここを削除すると全体的にデザインがズレてしまいます。 Firefoxでも動くようにjavascriptの部分を変更すると言う事で解決したいのですが、 良い書き方が解りません。どなたかご教授願えますでしょうか? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <body> <script type="text/javascript"> function changeField(){ index= test_form.country.value; if (index != "UnitedStates"){ document.getElementById("select1").style.display="inline"; document.getElementById("select1").disabled=false; document.getElementById("select2").style.display="none"; document.getElementById("select2").disabled=true; } else { document.getElementById("select1").style.display="none"; document.getElementById("select1").disabled=true; document.getElementById("select2").style.display="inline"; document.getElementById("select2").disabled=false; } } </script> <form name="test_form"> <select name="country" onChange="changeField()"> <option value="Japan" selected="selected">Japan</option> <option value="UnitedStates">United States</option> </select> <input id="select1" name="state" type="text" size="20" /> <select id="select2" name="state" style="display:none" disabled> <option value="CA">California</option> <option value="CO">Colorado</option> <option value="CT">Connecticut</option> </select> </form> </div> </body> </html>

  • javascriptでラジオボタンのが変更できない

    javascriptを勉強中なのですが 練習で下記のような麻雀の計算をしてくれるサイトを作ってみましたがうまく反応しません。 http://tegarude.sakura.ne.jp/mafu/form.html できない点は、例えば、ロンの項目で面前のチェックの時、ツモの項目にいいえが入りますが、 その後、ツモの項目で平和のチェックをいれようとしてもチェックが入りません。 javascriptで操作するようにしたのですがどうもうまくいきません。 単純なこと簡単なことなのかもしれませんが どなたかご教授願えませんでしょうか? ソースコードが長いのでjavascriptの記述のみ載せています。 サンプルのURLを参考にして下さい。 function on(){ //ロン・ツモ・待ち・雀頭の値を取得 function mjk01(m1,m2){ for (j=0; j<m1.length; j++){ if(m1[j].checked){ m2.innerHTML=m1[j].value; } } } mjk01(document.form1.radio2,document.getElementById("a00")); mjk01(document.form1.radio3,document.getElementById("a01")); mjk01(document.form1.radio4,document.getElementById("a02")); mjk01(document.form1.radio5,document.getElementById("a03")); //formプロパティの省略 formt=document.form1; //ロン項目設定 if(formt.radio2[0].checked){ formt.radio3[3].checked=true; formt.radio7[0].checked=true; formt.radio9[0].checked=true; formt.radio11[0].checked=true; formt.radio13[0].checked=true; } if(formt.radio2[1].checked){ formt.radio3[3].checked=true; formt.radio4[0].checked=true; formt.radio5[2].checked=true; formt.radio6[0].checked=true; formt.radio8[0].checked=true; formt.radio10[0].checked=true; formt.radio12[0].checked=true; } if(formt.radio2[2].checked){ formt.radio3[3].checked=true; } //ツモ項目設定 if(formt.radio3[0].checked){ formt.radio2[3].checked=true; formt.radio4[0].checked=true; formt.radio5[2].checked=true; formt.radio6[0].checked=true; formt.radio8[0].checked=true; formt.radio10[0].checked=true; formt.radio12[0].checked=true; } if(formt.radio3[1].checked){ formt.radio2[3].checked=true; formt.radio4[0].checked=true; formt.radio5[2].checked=true; } if(formt.radio3[2].checked){ formt.radio2[3].checked=true; } //面子の設定 function mentsu(m1,m2,m3){ if(m1[0].checked){ m2[1].value=4; m2[2].value=16; m2[3].value=8; m2[4].value=32; } if(m1[1].checked){ m2[1].value=2; m2[2].value=8; m2[3].value=4; m2[4].value=16; } for(i=0; i<m2.length; i++){ if(m2[i].checked){ m3.innerHTML=m2[i].value; } } } mentsu(document.form1.radio7,document.form1.radio6,document.getElementById("a04")); mentsu(document.form1.radio9,document.form1.radio8,document.getElementById("a05")); mentsu(document.form1.radio11,document.form1.radio10,document.getElementById("a06")); mentsu(document.form1.radio13,document.form1.radio12,document.getElementById("a07")); //小計をすべて数字に変換 num0=document.getElementById("a00").innerHTML; num1=document.getElementById("a01").innerHTML; num2=document.getElementById("a02").innerHTML; num3=document.getElementById("a03").innerHTML; num4=document.getElementById("a04").innerHTML; num5=document.getElementById("a05").innerHTML; num6=document.getElementById("a06").innerHTML; num7=document.getElementById("a07").innerHTML; num0 = parseFloat(num0); num1 = parseFloat(num1); num2 = parseFloat(num2); num3 = parseFloat(num3); num4 = parseFloat(num4); num5 = parseFloat(num5); num6 = parseFloat(num6); num7 = parseFloat(num7); //総合計の算出 document.getElementById("total").innerHTML=num0+num1+num2+num3+num4+num5+num6+num7; }

  • JavaScriptでセンター表示で行き詰まってしまいました。

    JavaScriptでセンター表示で行き詰まってしまいました。 どうしてもできません。 現在しようとしているのが、HP全面に画像を表示させ、 そのセンターに日時時間を表示させたいと思っています。 いろいろwebで調べて、センター表示ではないのですが、 下記の形を組み込みました。 IEとsafariでは問題無いのですが、Firefoxでは、画面の左上端に表示されてしまいます。 どなたか、ご教授いただければ助かります! また常に画面のセンター表示も可能なのでしょうか? ↓↓↓↓↓head内 <script language="JavaScript"> <!--// my_width=250; x_iti=450; y_iti=350; function tokei() { a=new Date(); b=a.getFullYear(); c=a.getMonth(); d=a.getDate(); e=a.getHours(); f=a.getMinutes(); g=a.getSeconds(); if(c<10)c="0"+c; if(d<10)d="0"+d; if(e<10)e="0"+e; if(f<10)f="0"+f; if(g<10)g="0"+g; moji="<strong>"+b+"."+c+"."+d+" "+e+":"+f+":"+g+"</strong>"; if(document.layers) { document.layers["lay0"].moveTo(x_iti,y_iti); document.layers["lay0"].clip.width=my_width; document.layers["lay0"].document.open(); document.layers["lay0"].document.write(moji); document.layers["lay0"].document.close(); } else if((document.getElementById) && (!document.all)) { document.getElementById("lay0").style.pixelLeft=x_iti; document.getElementById("lay0").style.pixelTop=y_iti; document.getElementById("lay0").innerHTML=moji; document.getElementById("lay0").style.width=my_width; } else if(document.all) { document.all("lay0").style.pixelLeft=x_iti; document.all("lay0").style.pixelTop=y_iti; document.all("lay0").innerHTML=moji; document.all("lay0").style.width=my_width; } clearTimeout(g); g=setTimeout('tokei()',1000); } //--> </script> ↓↓↓↓↓body内 <body onLoad="tokei();"> <span id="lay0" style="position:absolute;visibility:visible;color:#FFFFFF"></span>

  • ラジオボタンで入力項目の可・不可を切り替える方法

    雑誌やネットを調べ、ラジオボタンで入力項目の可・不可を切り替える JavaScriptを見つけたのですが、思うように動作しません。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>Sample</title> <script type="text/javascript"> <!-- function radioChange() { if(document.form1.radioSelect[0].checked == true) { document.form1.04text.disabled = false; document.form1.04text.style.backgroundColor='#FFFFFF'; document.form1.05text.disabled = false; document.form1.05text.style.backgroundColor='#FFFFFF'; document.form1.06text.disabled = false; document.form1.06text.style.backgroundColor='#FFFFFF'; document.form1.07text.disabled = true; document.form1.07text.style.backgroundColor='#D4D0C8'; document.form1.08text.disabled = true; document.form1.08text.style.backgroundColor='#D4D0C8'; document.form1.09text.disabled = true; document.form1.09text.style.backgroundColor='#D4D0C8'; } else if(document.form1.radioSelect[1].checked == true) { document.form1.04text.disabled = true; document.form1.04text.style.backgroundColor='#D4D0C8'; document.form1.05text.disabled = true; document.form1.05text.style.backgroundColor='#D4D0C8'; document.form1.06text.disabled = true; document.form1.06text.style.backgroundColor='#D4D0C8'; document.form1.07text.disabled = false; document.form1.07text.style.backgroundColor='#FFFFFF'; document.form1.08text.disabled = false; document.form1.08text.style.backgroundColor='#FFFFFF'; document.form1.09text.disabled = false; document.form1.09text.style.backgroundColor='#FFFFFF'; } else { document.form1.04text.disabled = true; document.form1.04text.style.backgroundColor='#D4D0C8'; document.form1.05text.disabled = true; document.form1.05text.style.backgroundColor='#D4D0C8'; document.form1.06text.disabled = true; document.form1.06text.style.backgroundColor='#D4D0C8'; document.form1.07text.disabled = true; document.form1.07text.style.backgroundColor='#D4D0C8'; document.form1.08text.disabled = true; document.form1.08text.style.backgroundColor='#D4D0C8'; document.form1.09text.disabled = true; document.form1.09text.style.backgroundColor='#D4D0C8'; } } //--> </script> </head> <body onload="radioChange()"> <form action="" method="post" name="form1"> <table> <tr> <td> <input name="radioSelect" type="radio" onclick="radioChange()" value="1" /> 国内旅行 <input name="radioSelect" type="radio" onclick="radioChange()" value="0" /> 海外旅行</td> </tr> <tr> <td>&nbsp;</td> </tr> <tr> <td> 国内編:<br /> 希望地 <input type="text" name="04text" /> <br /> 希望日: <input type="text" name="05text" /> <br /> 乗り物: <input type="text" name="06text" /> </td> </tr> <tr> <td>&nbsp;</td> </tr> <tr> <td>海外編:<br /> 希望地 <input type="text" name="07text" /> <br /> 希望日: <input type="text" name="08text" /> <br /> 乗り物: <input type="text" name="09text" /> </td> </tr> </table> </form> </body> </html> テキストボックスの「name」を、英字から始めれば解決するのですが 事情があり、nameを数字で始める必要があります。 この解決方法を教えていただけませんでしょうか。 よろしくお願いいたします。

  • javascript 自動日付更新

    宜しくお願いします。 サイトをアップした日付を、自動で更新したいです。 今までは、こちらのjavascriptを使っていたのですが、これですとブラウザ、クロムに対応していません。 文字化けしてしまいます。 <SCRIPT language="JavaScript"> <!-- renew = new Date(document.lastModified); y=renew.getYear(); m=renew.getMonth() + 1; d=renew.getDate(); if(y<1900) {y=y+1900;} document.write("最終更新日:"+y+"年"+m+"月"+d+"日"); //--> </SCRIPT> クロムでも動くjavascriptのコードはありませんか? 何卒、宜しくお願い致します。

  • javascript 日付自動更新

    以前にもご質問させてもらったのですが、解決にいたらなかったので今一度ご質問させてもらいます。何卒、宜しくお願い致します。 javascriptでサイトをアップした日付を、"最終更新日:2009年12月12日"と自動で更新したいです。 今までは、こちらのjavascriptを使っていたのですが、これですとブラウザ、GoogleChromeに対応していません。 文字化けしてしまいます。 <SCRIPT language="JavaScript"> <!-- renew = new Date(document.lastModified); y=renew.getYear(); m=renew.getMonth() + 1; d=renew.getDate(); if(y<1900) {y=y+1900;} document.write("最終更新日:"+y+"年"+m+"月"+d+"日"); //--> </SCRIPT> こちらのコードですとGoogleChromeで動くのですが、 <script type="text/javascript" charset="utf-8"> <!-- var d = new Date(); if (d.toLocaleDateString) { document.write("最終更新日:" + d.toLocaleDateString(document.lastModified)); } else{ y=d.getYear(); m=d.getMonth() + 1; d=d.getDate(); if(y<1900) {y=y+1900;} document.write("最終更新日:"+y+"年"+m+"月"+d+"日"); } // --> </script> このように表示されてしまいます。 最終更新日:Saturday,December,12,2009 "最終更新日:2009年12月12日"この形で表示させたいです。 どなたかお力を貸して下さい。お願い致します。

専門家に質問してみよう