• 締切済み

イベントevt?evt.target:event.srcElement;の意味合い

以下の理解で合っているのでしょうか? よくイベントの取得で エレメント.onclick = function(evt){ var e = evt?evt.target:event.srcElement; } でeにイベントオブジェクトの発生元要素をセットしているのを見かけますが、 これは、ブラウザーの違いの吸収なのでしょうか? firefoxでは、イベントハンドラー関数にイベントオブジェクトが渡されるので、渡されたイベントオブジェクトよりevt.targetで発生元要素をセットし、一方IEでは、eventという名前のオブジェクトが存在している(?)ので、イベントハンドラー関数にイベントオブジェクトが渡されず、event.srcElementで発生元要素をセットする。  ※Opera、Safariは何でも良い IEの場合、後から、イベントが追加されたらeventオブジェクトはどうなるのでしょうか?ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

#1です。 > なぜ、後ろの()の中身が前の()の中の関数の引数に渡されるのでしょうか? 匿名関数(無名関数)に関しては、私も完全に理解できているわけではないので、私の理解している範囲での説明になりますが…。 まず、名前付きの関数定義をしてみます。 ------- function test(str){ alert(str); } test('Hello'); ------- 関数名 "test" を取り除きます。 ------- function(str){ alert(str); } ('Hello'); ------- このままでは、エラーになります。 function部分を括弧で括り、エラーを回避します。(どういう理屈かはわかりません) ------- (function(str){ alert(str); }) ('Hello'); ------- 改行を取り除きます。 ------- (function(str){ alert(str); })('Hello'); ------- 「なぜfunctionを括弧でくくるのか?」 この点はずっと疑問に思っていて、いつか質問しようと思っていました。 いい機会なので質問してみます。 匿名関数の定義と実行 - 昼間のメモ http://blog.goo.ne.jp/hiuchida/e/431b5beb4adeb313a49b35c055f02df3 匿名関数と (function(){ ... })(); について : JavaScript 備忘録 http://blog.livedoor.jp/jsmemo/archives/767707.html エレガントな JavaScript を作成するための関数型プログラミングの使用 http://www.ibm.com/developerworks/jp/web/library/wa-javascript.html JavaScript講座 : 関数の定義 http://www.openspc2.org/JavaScript/kouza2007/function/definition/index.html

yyr446
質問者

お礼

代わりに別途質問していただいてありがとうございました。 その解答をみて納得できたような気がします。 functionもオブジェクトであるから、それを踏まえて var hoge = function(str){alert(str);}; hoge("Hello"); と (function(str){alert(str);})('Hello'); を良く眺めると同じに見えました。

回答No.3

document.onclick = (function(INT) {  return function(e) {   var tmp = INT(1.41421356237);   var e = e ? e.target: event.srcElement;   alert([tmp, e.tagName]);  }; })(Math.floor); ごみか?

回答No.2

>これは、ブラウザーの違いの吸収なのでしょうか? じぶんてきには。そのつもり。 うるおぼえなのでくわしいせつめいは、するーします。 「いべんとばぶりんぐ」で、けんさくすればかいけつのいとぐちが? http://www.tagindex.com/kakolog/q4bbs/1601/1871.html ここをよんで、いべんとは、おおもとで、かんしするだけで いいじゃん!ってことで、じぶんでは、documentのいべんとを かんしすることがおおいです IEのいべんとは、ぐろーばるなので、そのときのいべんとが、 さんしょうしたときに、それとはかぎらない。 なので、attachEventをつかったり・・・。 ここのいたでは、わかりやすさをゆうせんさせているひとが おおいのか(?)そのかきかたが、ふきゅうしないというか・・・。 じぶんで、じしんをもってせつめいできないのがいたい!? だからいつまでたっても、かいとうのこーどをとうこうするときは、 「いっぱんじん」でなおかつ、「さんこういけん」なんだよね~^^; 「せんもんか」といえるひとたちの、いけんをまとう!

yyr446
質問者

お礼

解答ありがとうございます。 イベントバブリングとかキャプチャリングとか とても参考になりました。

  • think49
  • ベストアンサー率59% (285/482)
回答No.1

> ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか? attachEvent() を使えば、複数のイベントハンドラを定義できそうです。(未検証) また、attachEvent() の第一引数からイベントオブジェクトを取得できる、とbabu_babooさんに教わりました。 http://okwave.jp/qa5081024.html?ans_count_asc=1 ただ、attachEvent は実行順が不定という欠点があるので、現実的には「出来ない」という結論になると思います…。 addEventListenerとattachEventでは実行される順番が違う at HouseTect, JavaScripter Blog http://hisasann.com/housetect/2008/09/addeventlistenerattachevent.html IEのイベント実行順序は不定? - inamenaiの日記 http://d.hatena.ne.jp/inamenai/20080915/p1 IEが addEventListener() に対応してくれればいいのですが…。

yyr446
質問者

お礼

解答ありがとうございます。 eventについて基礎的な知識が不足しているので、あらためて学習してみようと思っているしだいです。

yyr446
質問者

補足

ところで、think46様の「イベントリスナに登録される function(e){} の "e" はeventオブジェクト?」 http://okwave.jp/qa5075946.html の中で、前から気になってて、ちょっと解らないところがあるのですが、 質問に関係ないjavascriptの基本的な事かも知れませんが、 匿名関数を (function(str){ alert(str); })('Hello'); というふうに書いていますが、 なぜ、後ろの()の中身が前の()の中の関数の引数に渡されるのでしょうか? これは、 エレメント.onclick = (function(e){ alert(e);   //eはalertできませんが })(); と エレメント.onclick = function(e){ alert(e); } と書くのは同じですか?

関連するQ&A

  • evtとは

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>イベント情報の取得</title> </head> <body> <script type="text/javascript"> <!-- // ページのロード時に呼び出される関数initをセット window.onload=init; // ページのロード時に呼び出される関数 function init(){ // onclickイベントハンドラを定義 document.getElementById("txt").onclick=msg; } // onclickイベントハンドラ関数 function msg(evt){ // W3C DOMとIEの両方のイベントオブジェクトに対応 evt = (evt) ? evt : ((event) ? event : null); alert(evt.type+"されました"); } //--> </script> <div id="txt">クリックしてください</div> </body> </html> 上記のコードで【MozillaやOperaなどのブラウザでは、イベントハンドラ関数を設定した場合にも、関数の引数としてイベントオブジェクトが渡される】とのことですが、イベントハンドラ関数msgに渡されているevt【function msg(evt){】はいきなり出て、何を意味しているのかよくわかりません。 このコードを見て推測できる方、アドバイスをお願い致します。

  • JSのイベントターゲット が難しい

    JSのイベントターゲット (EventTarget)が難しくてよくわからないのですが初心者にもわかるように解説していただけるとありがたいです。 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget イベントターゲット(EventTarget)は、DOMイベントを受け取り、それらへのリスナーを持つことが出来るオブジェクトによって実装されるDOMインターフェースです。 Elementと、 documentと、 windowは、ほとんどの共通イベントターゲットですが、 例えば、XMLHttpRequest、AudioNode、AudioContextなど、 他のオブジェクトもエベントターゲットになることが可能です。 多くのイベントターゲット(Element、document、windowを含む)は、 onXXXプロパティと属性を介して、 イベントハンドラの設定もサポートします。 メソッド .addEventListener() 要素にイベントハンドラを登録します。 .dispatchEvent() DOM内のノードのイベントを実行します。 .removeEventListener() EventTarget.addEventListenerを使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • イベントハンドラを外部ファイルに分離させた時のevent.target

    イベントハンドラを外部ファイルに分離させた時のevent.target||event.srcElementの挙動について質問です。お願いします。xhtmlの<div>に直接書いていたeventハンドラを外部に分離しました。 JavaScript ------------------------------ function Test() { var n = document.getElementsByTagName('div')[0]; n.onmouseover = function() { var m = event.target||event.srcElement; var j = m.tagName; alert(j); } } $(function() { Test(); }); ------------------------------ xhtml ------------------------------ <div> <p><img src="img01.png" width="300" height="300" /></p> </div> ------------------------------ n.onmouseover後のfunction()ですが、FireFoxで動きません。 function()をfunction(event)にするとFireFoxで動くようになりますが、IEで動かなくなります。 FireFox、IE両方動くようにするにはどういう記述にしたらいいでしょうか?

  • eventの概念が理解できません

    こんにちは。オブジェクト志向でVB、C#を学んでいます。デリゲートを理解してeventについて学んでいますが、よく理解できません。 イベントとは、「あるアクションが発生したことを自動的に通知するための仕組み」と本にあります。 さらに、「送信側オブジェクトのイベント(と呼ばれるクラスメンバーに、受信側のイベントハンドラー(と呼ばれるメソッド)を登録します。」とあります。 下記が本に載っているコードです。 私が理解できているのは、 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。MyEventHandlerというデリゲートを宣言 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。SomeEvent変数を宣言 ・MyEvent型のevt変数の宣言 理解できないのは、 evt.SomeEvent += Handler;。何をやっているかわかりません。 ここをわかりやすくお教え頂けませんでしょうか? using System; //MyEventHandler型を宣言。ここは理解できます。 delegate void MyEventHandler(); class MyEvent{ //イベントの宣言。EventHandler型の変数、SomeEvent。 public event MyEventHandler SomeEvent; public void Fire(){ if(SomeEvent !=null) SomeEvent(); } } class EventDemo{ static void Handler(){ //←イベントハンドラー Console.WriteLine("Event occurred"); } static void Main(){ MyEvent evt = new MyEvent(); evt.SomeEvent += Handler; evt.Fire(); } } また、もう一点お教え下さい。フォーム上のボタンをクリックした時に、メッセージを表示するようなイベントはどのような形で動いているのでしょうか? senderはイベントの発生元のオブジェクトがそのまま入っていて、eはイベントの補足情報が入っているのは理解しました。 ボタンをクリックした時に、ボタンクラスから何らかの情報が送られてきて、それをsenderとeで受取ると思うのですが、これのどこにeventとデリゲートが関わってくるのでしょうか? 何かモヤモヤしてeventがわかりません。 宜しくお願い致します。 private void btn_Click(object sender, EventArgs e) { messagebox.show("hello"); }

  • イベントの関数について、よくわからないことがあります。

    イベントの関数について、よくわからないことがあります。 (1)引数をセットしない関数と window.document.onmousemove = f; function f(evt) { alert(evt); } (2)無名関数?に引数 window.document.onmousemove = function(e) { alert(e); } (1)(2)は同じ動作なのですが、window.document.onmousemoveにセットする関数の引数は 特殊なのでしょうか?

  • 取得した要素がインライン要素かブロック要素かを判定する方法はないでしょうか?

    下の様に取得した要素が、インライン要素かブロック要素かを判断する方法はないでしょうか?  document.onclick = function(evt){   var e = evt?evt.target:event.srcElement;   for (i in e.parentNode.childNodes){    if(e.parentNode.childNodes[i].nodeType ==1 && e.parentNode.childNodes[i] != e){     if(e.parentNode.childNodes[i].style.display =="none"){      alert(e.parentNode.childNodes[i].tagName); /* ブロック要素かインライン要素かを判定したい!*/ /* インライン要素 */      e.parentNode.childNodes[i].style.display = "inline"; /* ブロック要素 */      e.parentNode.childNodes[i].style.display = "block";     }else{      e.parentNode.childNodes[i].style.display = "none";     }    }   }  }

  • イベント登録とメモリリークについて(jQuery)

    下記のような【html】をjQueryのAjax関数とhtml()を利用した【処理フロー】で、動的にDOMに追加しているのですが、以下の【質問】にお答え頂けないでしょうか。 【html】 <div> (省略) <a href="javascript:void(0);" onclick="foo({'arg1':'str1','arg2':'str2','arg3':num3…});">テスト</a> (省略) </div> ※foo関数の引数は初期化配列を指定、引数値はサーバサイドで動的に変化させてクライアントに出力 【処理フロー】 a要素クリック→foo関数実行→jQueryのAjax関数でfoo関数引数の配列値をサーバに送信→レスポンスとして新たな【html】を受信して、jQueryのempty()、html()を使用して同じ要素配下を置き換え ※$.ajax({..., data:配列オブジェクト, ...}); のように、dataプロパティにfoo関数の引数をそのまま渡しています 【質問】 1.上記のonclickの内容が原因かどうかは分かっていませんが、繰り返しフローを走らせると、各ブラウザ(IE8,FireFox3.6,safari5,Opera11)でメモリリークが発生します。上記のonclickの関数に初期化配列という定義に問題はあるでしょうか。 2.foo関数の引数にある配列は、要素がクリックされたタイミングでオブジェクト化される認識であっていますでしょうか。また、上記のフローだと開放される(参照されなくなる)タイミングは、Ajax通信完了後という認識であっていますでしょうか。 3.Webで調査した範囲では、jQueryのempty()、html()はどちらも削除/置き換え前の要素に紐づいたイベントは削除されるようなのですが、上記のようにhtml()で追加する要素にonclickイベントを定義している場合も、次回empty()、html()で置き換え時にイベント削除されるでしょうか。 4.1に関連しますが、上記の内容、処理フローにおいて、置き換え前の要素セットやfoo関数の引数がメモリリークを引き起こす可能性はあるでしょうか。 どうぞよろしくお願いいたします。

  • イベントをつかってコールバックさせたいのですが

    HTAスクリプトでIEを起動し、ページが表示されるのを待つプログラムを 作成しようとしています。 JavaScriptではスリープができないのでisBusyをがfalseになるのを 待つ代わりに、IEオブジェクトのイベントからコールバックさせようと思いました。 そこで次のプログラムを書いたのですが、 イベントハンドラ登録の文法が間違っているらしく、実行時に 「オブジェクトでサポートされていないメソッドまたはプロパティです」 になってしまいます。 この行でやりたいことは、ieオブジェクトの NavigateComplete2 イベントが発生したときに、onComplete が呼ばれるようにすることです。 イベントハンドラの登録方法、または ieがページを読み終わるのを検知するよい方法がありましたら お教え下さい。よろしくお願いします。 ■sample.hta <html> <script> function perform(){   var ie = new ActiveXObject("InternetExplorer.Application");   ie.visible=true;   ie.navigateComplete2 = onComplete; // ←この行がエラー   ie.navigate("http://www.1101.com"); } function onComplete(a, b){   alert("complete"); } </script> <body> <input type=button onclick="perform();" value="open"> </body> </html>

  • Access2003 VBA イベントハンドラ

    メインフォームからインスタンス化して色々な用途に使用するサブフォームがあります。 そのフォームにはボタンがついていますが、用途別にインスタンス化するときに、別々のクリックイベントをセットしたいのですが、方法が分かりません。 set subform = New subformの基 subform.button1.OnClick="=関数名" とやると、「イベント プロパティに指定した式 クリック時 でエラーが発生しました:このオブジェクトにはオートメーションオブジェクト'関数名'は含まれません」、と実行時エラーが出ます。 ひょっとして、こういう使い方はできないのでしょうか?

  • HTMLに書き込むことなく、イベントを制御する方法

    よく、HTMLに <img src="yyy.gif" onMouseover="this.src='xxx.gif'"> というふうにイベントハンドラを設定するのを見かけますが、 <script>タグ内で document.onclick = 関数名; となっているのもあります。 後者の方が、スマートのような気がするのですが、その書き方とか、仕様をしっかり理解できてないようなので質問します おそらく、これに限らず基礎的なことだと思います 1、 document.onclick = の後に指定できるのは、関数名の他に何があってどう書くのか? 2、 document.onclick = funcEx(); としないで document.onclick = funcEx; とするのはなぜか? 引数は設定できないのか? 3、 <script>内から、指定した要素のイベントを制御する方法がほかにあれば 教えてください 以上、どれかひとつでも、複数でもいいので、回答もらえるとありがたいです

専門家に質問してみよう