2008/02/13(Wed) 00:41:34 編集(投稿者)
2008/02/13(Wed) 00:41:27 編集(投稿者)
2008/02/13(Wed) 00:28:49 編集(投稿者)
<pre><pre>2008/02/13(Wed) 00:17:55 編集(投稿者)
2008/02/13(Wed) 00:12:59 編集(投稿者)
<pre><pre>■No14187 (Hirotow さん) に返信
> thisを関数に渡していないから。
> あくまでthisが要素を指すのはonxxの中だけ。
> 関数呼び出すならtestf(this)として、
> function testf(_this) {
> みたいにして受け取る必要がある。
>
> thisが何を指すかの判断はJavaScriptの基本。
いや。そーとも限らないっす。
<input type=text onclick="testf(this)" />
function testf(_this) {} はクロスブラウザではやっちゃいけない。
Firefoxではイベントメソッドの第一引数にイベントオブジェクトが
渡されるから。
強いてやるなら、
function testf(e) {
var o = null;
if (e.target) o = e.target;
else o = e.srcElement;
}
ってやる。
HTML は、
<input type=text onclick="testf(event)" />
event はIEではグローバル変数チックなイベント変数。
それと、イベントメソッド内での暗黙の this はイベント発生元を指すから
このときの this の用法は間違ってないです。
ただ、this をむやみに使うのはコードの読みに弊害を及ぼすので好ましく
ないことは確かですけどね。
スレ主さん>
xxx.attachEvent("onclick", function() { alert('ok') });
この 匿名関数は実行していません。
xxx.attachEvent("onclick", testf());
このtestf メソッドはattachEvent される時点で既に実行されています。
イベントに登録されるのは、testf() の戻り値。
testf() はイベントが発生するまでは<input>のイベントではありませんから、
this は undefined ってことになりますね。
# 訂正ばっかし。。。
# 更に訂正
Firefox で暗黙の第一引数が何なのか見てください。
<script>
function fff() {
var o = document.createElement("input");
o.type = "button";
o.onclick = function(e) {
alert(this.tagName); //<<== this はイベント発生元のオブジェクトをさす
alert("ok:" + e + "::" + e.target); //<<==IE ではここでこける
};
document.body.appendChild(o);
alert(o.onclick);
}
window.onload = function() {
fff();
}
</script>
#さらに訂正(しつこい)。
IE でもこけないようにするためには、
o.onclick = function(event) {
var o = null;
if (event.target) o = event.target;
else o = event.srcElement;
...
}
ってやります。
</pre></pre></pre></pre>