attachEvent(addEventListener)の使い方

このQ&Aのポイント
  • JavaScriptのattachEventを使用してイベントハンドラを追加する方法について説明します。
  • addFocus関数の引数に複数のテキストフィールドのname属性値を指定する方法について説明します。
  • attachEventを使用する場合、thisを使用して現在のオブジェクトを参照することができません。Arg変数を使用して名前属性を参照する方法について説明します。
回答を見る
  • ベストアンサー

attachEvent(addEventListener)の使い方

--- HTML部 --- <form name="f"> <input type="text" name="i1" /> <input type="text" name="i2" /> <input type="text" name="i3" /> </form> --- JavaScript部 --- function doFocus (node) { alert(node.name); } function addFocus () { for (var i = 0; i < arguments.length; i++) { var Arg = eval("document.f." + arguments[i]); Arg.attachEvent("onfocus", function(){doFocus(this);}); } } addFocus("i1","i2","i3") 上記スクリプトを実行したときこちらの期待する結果は テキストフィールドにフォーカスがあたると それぞれのname属性値が表示されることなのですが 現状では何も表示の無いアラートが帰ってきます。 また「this」と指定している箇所を「Arg」と変更してみたのですが この場合はどのテキストフィールドにフォーカスがあたっても 「i3」と返ってきてしまいました。 addFocusの引数をひとつにし、「this」と記述している箇所を 「Arg」とすればうまくいくことは確認しているのですが できれば上記のようにaddFocusに複数の引数を渡して対応したいと 考えております。 通常はINPUTタグのonfocusイベントハンドラに 「dofocus(this);」と書けば済む話ではあるのですが attachEventを利用した場合の記述がうまくできなかったので 質問させていただきました。 前置きが長くなりましたが、addFocusの仕様(引数)を変更せずに 期待する結果を得るにはどのようにすればよいでしょうか?

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

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

・ IEのattachEvent()は動作は、特異で、この場合   addFocus()関数の中でも   イベントハンドラの中でも   thisキーワードは、グロバルなwindowオブジェクトを指しているようです。 ・ 「テキストフィールドにフォーカスがあたるとそれぞれのname属性値が表示されることなのですが」とするには、window.eventオブジェクトを利用してください。ただしバブリングのない簡単な構成の場合とします。 function doFocus (node) { alert(window.event.srcElement.name); }

kyonn2008
質問者

お礼

解答ありがとうございます。 上記ソースコードを一部改変してFFやNN、Operaでこの場合の「this」が 利用できるか確認してみたところ、 うまく動作することを確認しました。 auty様のおっしゃられた通りで、確かにIEだけ特異なのですね。 「srcElement」というものがあることも初めて知りました。 よって、ブラウザがIEの場合はsrcElementを使うようにソースを改変して解決いたしました。 適切な解説をいただきまして本当にありがとうございました。

関連するQ&A

  • Enterで指定のテキストボックスにフォーカスを・・・

    Enterを押すと指定のテキストボックスにフォーカスを移動させたいのですがやり方がわかりません・・・。 例えば以下の様なフォームで TB1→TB2→TB3→TB5→TB6 という具合に移動させたいです。 どうか皆さんのお知恵をお貸しください。 <form name = "textbox"> <input type = "text" name="TB0" onFocus="this.blur()"> <input type = "text" name="TB1"> <input type = "text" name="TB2"> <input type = "text" name="TB3"><br> <input type = "text" name="TB4"onFocus="this.blur()"> <input type = "text" name="TB5"> <input type = "text" name="TB6"> </form>

  • 変更のかかったテキストフィールドに再度フォーカスを設定するには?

    お世話になります。 テキストフィールドを複数用意し、 1つのフォームに対して変更が掛かった時にフィールド名をアラートで表示し、 再びフォーカスを変更したテキストフィールドに戻すソースを組みたいと考えています。 (結果、ループのような形になりますが、、、例として捕らえてください。。) 下記のソースを組んだのですが、?の部分の指定がうまくいかず、苦戦しております。 上記のことを行うには、?の部分をどう記述すべきかご教示いただけませんでしょうか。 皆様のお力を御貸しください。どうぞよろしくお願い致します。 <script type="text/javascript" > function fnc_OnChangeFields(Fieldname,Fieldvalue){ with(document.f1){ alert(Fieldname); ?????????.focus(); } } </script> <body> <form method="post" name="f1"> <tr> <td> \<input TYPE="text" NAME="field1" onchange="return fnc_OnChangeFields(this.name,this.value)"></td> <td> \<input TYPE="text" NAME="field2" onchange="return fnc_OnChangeFields(this.name,this.value)"></td> <td> \<input TYPE="text" NAME="field3" onchange="return fnc_OnChangeFields(this.name,this.value)"></td> </tr> </body>

  • INPUTタグのselectについて

    INPUTタグのselectについて いつもお世話になりますm(__)m <input type="text" name="hoge" onfocus="this.select()"> 上記のようにすると、フォーカスされた時に、入力されている値が選択状態になりますが、これをフォーム上の全てのINPUTとTEXTAREAに適用できるような方法はありませんでしょうか? 既に作成済みのフォーム(HTML)に一つずつ「onfocus="this.select()"」を入れるのは、非常に手間がかかります。 一気にスタイルシート等で設定できればと思い、質問させて頂きました。 ご存じのかた、ご教授頂けますようお願い致しますm(__)m

    • ベストアンサー
    • HTML
  • 値の取得について

    IPアドレス入力欄のように以下のソースのような流れを作成したのですが、エリアに3文字入力をして、入力したものの最後の文字が数字であったら、キーボードのTabを使っても、onKeyUpで呼んだ関数でも、その入力した3文字が数字だと認識してすぐ横のエリアに移りたいのですが、その入力をした際の3文字目の値を取得することは可能なのでしょうか?Whichを使ってString.fromCharCodeを使って押されたキーを取得しようとしたのですが、構文エラーになってしまい、困っています。 例 入力したものが1a1→数字と認識されて横のエリアに飛ぶ         11a→三文字目が"a"だから数字でないので飛ばない <script language="JavaScript"> <!-- var str; var data; function tobu1(){ str = document.form1.txt3.value; data = str.match(/[^0-9]/g); if( str.length >= 3 && !data ) document.form1.txt4.focus(); } ・・・ <body> <INPUT type="text" name="txt2" size="3" value="" maxlength="3" onKeyUp="tobu1()" onFocus="this.select()">. <INPUT type="text" name="txt3" size="3" value="" maxlength="3" onKeyUp="tobu2()" onFocus="this.select()">. <INPUT type="text" name="txt4" size="3" value="" maxlength="3" onKeyUp="tobu3()" onFocus="this.select()">. <INPUT type="text" name="txt5" size="3" value="" maxlength="3" onFocus="this.select()">

  • FireFoxでfocus()が上手く動かない

    javascriptを使って、 フォームのテキストエリアの入力文字数をチェックし、 オーバーしていれば、アラートを出し、テキストエリアにフォーカスを移動させる。 ようにしようとしています。 IEでは動いてのですが、FireFoxだと上手くフォーカスが移動してくれません。 どこがまずいのか、教えてください。 コード <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> <!-- function checkText(aText) { if (aText.value.length > 1) { alert('サイズオーバーです'); aText.focus(); } } //--> </script> </head> <body> <form method="post" action="#"> <input type="text" name="fmTitle" onBlur="checkText(this)"> <input type="text" name="dummy"> </form> </body> </html>

  • テキストエリアにvalue以外で文字列

    <input id="name" name="name" type="text" value="name" onblur="if(this.value == '') this.value='name';" onfocus="if(this.value == 'name') this.value='';" /> フォームにnameという文字列が表示されていてクリックすると文字列が消える。フォーカスを外すと再びnameが表示される。 それだけならば上記のコードで問題ないんですが、フォームに何も入力せず投稿ボタンを押すと、内容が「name」のまま投稿されてしまいます。 何か解決する良いアイデアはないでしょうか。 どうかよろしくお願いします。

    • ベストアンサー
    • HTML
  • focus()が上手くいかない

    困っています、助けてください。 フォームのテキストボックスの入力された文字数をチェックし、 サイズオーバーなら、アラートを表示し、テキストボックスにフォーカスを移動させたい。 のですが、上手く動いてくれません。 コードは次の通りです。どこがおかしいのか?どうすれば改善できるのか? 教えてください。 <form method="post" action="#"> <input type="text" name="fmTitle" onBlur="checkText(this)"> </form> <script type="text/javascript"> <!-- function checkText(aText) { if (aText.value.length > 100) { alert('サイズオーバーです'); aText.focus(); } } //--> </script>

  • for文の使い方について

    こんばんはpiyottiと申します。 forループを使用してtextの値を取得したいと思っています。 「document.myFORM.namei・・・」の「i」をループカウンターとして 「name1、name2・・・」と増やしていきたいのですがうまくいきません。 どうかよろしくお願いいたします。 <script Language="JavaScript"><!-- function calc(form) { n = 0; for (i=0; i<4; i= i+;) n += eval(document.myFORM.namei.value); } // --></script> <form name="myFORM"> 数値1:<input type="text" onChange="calc(this.form, this)" name="name1"> 数値2:<input type="text" onChange="calc(this.form, this) name="name2"> 数値3:<input type="text" onChange="calc(this.form, this) name="name3"> 数値4:<input type="text" onChange="calc(this.form, this) name="name4"><br> </form>

  • bodyタグのfocus

    jqueryで $('body').focus(function() { alert('focus'); }); などと記述しても、フォーカス時にうまくアラートが表示されません。 Bodyタグにonfocusとして直接書くと動作するのですが、何か違いがあるのでしょうか? よろしくお願いします。

  • テキストボックスのフォーカス移動

    こんにちは。 htmlページで<input type="text"/>に既定の桁数を入力したら次のinputにフォーカスを 移動させたいと考えています。 下の例の場合、1番目のテキストボックスに既定の桁数5ケタを入力したら、フォーカス を2番目のテキストボックスに移動させ、2番目のテキストボックスに4ケタ入力したら 3番目のテキストボックスにフォーカスを移動させるようにしたいと思っています。 スクリプトの再利用ができるよう、たとえば同じname属性を与えればその範囲内で 簡単にフォーカスを移動させられるようなものにしたいと思うのですが、うまくいきません。 何か良い書き方はありませんでしょうか? <div>  <input type="text" name="hoge" maxlength="5" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="4" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="5" onkeyup="test(this)"/>  <input type="text" name="hoge" maxlength="2" onkeyup="test(this)"/> </div>  ・  ・ <script type="text/javascript"> function test(elm) {  if (elm.value.length >= elm.maxLength) {   /*(気持ちとしては、ここにこのような感じのことを書きたいのですが・・・)     var arr_elm = document.getElementsByName(elm.name);     var n = elm.index + 1     arr_elm[n].focus();   */   } } </script>

専門家に質問してみよう