アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の理解で合っているのでしょうか?
よくイベントの取得で

エレメント.onclick = function(evt){
var e = evt?evt.target:event.srcElement;
}
でeにイベントオブジェクトの発生元要素をセットしているのを見かけますが、
これは、ブラウザーの違いの吸収なのでしょうか?

firefoxでは、イベントハンドラー関数にイベントオブジェクトが渡されるので、渡されたイベントオブジェクトよりevt.targetで発生元要素をセットし、一方IEでは、eventという名前のオブジェクトが存在している(?)ので、イベントハンドラー関数にイベントオブジェクトが渡されず、event.srcElementで発生元要素をセットする。
 ※Opera、Safariは何でも良い

IEの場合、後から、イベントが追加されたらeventオブジェクトはどうなるのでしょうか?ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?

A 回答 (4件)

> ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?


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/addeventli …
IEのイベント実行順序は不定? - inamenaiの日記
http://d.hatena.ne.jp/inamenai/20080915/p1

IEが addEventListener() に対応してくれればいいのですが…。

この回答への補足

ところで、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);
}
と書くのは同じですか?

補足日時:2009/07/08 15:41
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/08 15:38

#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/431b5beb4adeb31 …
匿名関数と (function(){ ... })(); について : JavaScript 備忘録
http://blog.livedoor.jp/jsmemo/archives/767707.h …
エレガントな JavaScript を作成するための関数型プログラミングの使用
http://www.ibm.com/developerworks/jp/web/library …
JavaScript講座 : 関数の定義
http://www.openspc2.org/JavaScript/kouza2007/fun …
    • good
    • 0
この回答へのお礼

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

(function(str){alert(str);})('Hello');
を良く眺めると同じに見えました。

お礼日時:2009/07/08 18:45

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);
ごみか?
    • good
    • 0

>これは、ブラウザーの違いの吸収なのでしょうか?


じぶんてきには。そのつもり。
うるおぼえなのでくわしいせつめいは、するーします。

「いべんとばぶりんぐ」で、けんさくすればかいけつのいとぐちが?
http://www.tagindex.com/kakolog/q4bbs/1601/1871. …

ここをよんで、いべんとは、おおもとで、かんしするだけで
いいじゃん!ってことで、じぶんでは、documentのいべんとを
かんしすることがおおいです

IEのいべんとは、ぐろーばるなので、そのときのいべんとが、
さんしょうしたときに、それとはかぎらない。
なので、attachEventをつかったり・・・。

ここのいたでは、わかりやすさをゆうせんさせているひとが
おおいのか(?)そのかきかたが、ふきゅうしないというか・・・。
じぶんで、じしんをもってせつめいできないのがいたい!?

だからいつまでたっても、かいとうのこーどをとうこうするときは、
「いっぱんじん」でなおかつ、「さんこういけん」なんだよね~^^;

「せんもんか」といえるひとたちの、いけんをまとう!
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/08 15:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!