- PR -

JavaScriptで正しくattachEventできない(IEで動かない)

投稿者投稿内容
@10
会議室デビュー日: 2008/10/09
投稿数: 11
お住まい・勤務地: 東京
投稿日時: 2009-03-14 22:42
JavaScript初心者です。よろしくお願いします。

ブラウザの画面上でクリックがある度に
任意のJavaScript関数を実行させたく(クロスブラウザで)
addEventListenerとattachEventを使って実装を試みたのですが、
どうにもattachEvent(InternetExplore)の場合に動いてくれません。
(FireFox等、addEventListenerで動くブラウザでは動きました。)

コードをシンプルにしてみましたが、
依然として動かず、原因がわからずにおります。
以下、検証用にシンプルにしたコードになります。

◇◇期待する動き◇◇
・HTMLをロードすると、
 『dispAlert呼ばれました』というalert表示
 『addListener呼ばれました』というalert表示
・左clickをする度に『dispAlert呼ばれました』というalert表示

◇◇コード◇◇
〓〓〓HTML〓〓〓
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title>実験</title>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
test
</body>
</html>
〓〓〓HTML終わり〓〓〓

〓〓〓JavaScript(test.js)〓〓〓
function dispAlert(e){
alert('dispAlert呼ばれました');
}
function addListener(){
if(window.attachEvent){
alert('addListener呼ばれました');
window.attachEvent('onclick',dispAlert);
}
}
dispAlert();
addListener();
〓〓〓JavaScript終わり〓〓〓

◇◇実際の動き◇◇
・HTMLをロードすると、
 『dispAlert呼ばれました』というalert表示は出る
 『addListener呼ばれました』というalert表示も出る
・左clickをしてもalertは表示されない

なお、”window.attachEvent('onclick',dispAlert);”の部分を
”alert(window.attachEvent('onclick',dispAlert));”とすると
Trueとポップアップが上がります。

原因はコードにはなく、実行環境にあるのでしょうか?
お分かりになる方、ご教授下さい。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-15 01:44
window.attachEvent('onclick',dispAlert);

document.body.attachEvent('onclick',dispAlert);
に変えて
<script type="text/javascript" src="test.js"></script>
をbodyの後ろにやったら呼ばれました。
@10
会議室デビュー日: 2008/10/09
投稿数: 11
お住まい・勤務地: 東京
投稿日時: 2009-03-15 23:49
返答ありがとうございます。
document.body.attachEvent('onclick',dispAlert);
にすると確かに動きました。
とりあえずやりたいことを実現するという意味ではOKなのですが、
依然として疑問は残りますね。

window.attachEvent('onclick',XXXX);
という記述はいろんなところで見かけるんですが、
私のサンプルはなぜ動かないんでしょうか?
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2009-03-16 00:06
>>いろんなところで見かける

例えばどこですか?

”かま”掛けていませんか?


コード:

<script>
window.onload = function() {
var s = [];
for (var a in window) {
s.push(a + "=>" + window[a]);
}
document.getElementById("OK").innerText = s.join("\n");
}
</script>
<pre id="OK">
</pre>




参考までに上記の実行結果は、
コード:

onbeforeunload=>null
onafterprint=>null
top=>[object]
location=>file:///C:/Documents%20and%20Settings/xxxxx/デスクトップ/xxx.html
parent=>[object]
offscreenBuffering=>auto
frameElement=>null
onerror=>null
screen=>[object]
event=>[object]
clipboardData=>[object]
onresize=>null
defaultStatus=>
onblur=>null
window=>[object]
onload=>function() {
var s = [];
for (var a in window) {
s.push(a + "=>" + window[a]); }
document.getElementById("OK").innerText = s.join("\n");}
onscroll=>null
screenTop=>98
onfocus=>null
Option=>[object]
length=>0
onbeforeprint=>null
frames=>[object]
self=>[object]
clientInformation=>
XMLHttpRequest=>[object]
external=>
screenLeft=>0
opener=>undefined
onunload=>null
document=>[object]
closed=>false
history=>[object]
Image=>[object]
navigator=>
status=>
onhelp=>null
name=>




こんな感じ。



[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2009-03-16 00:12 ]
@10
会議室デビュー日: 2008/10/09
投稿数: 11
お住まい・勤務地: 東京
投稿日時: 2009-03-16 00:51
>>いろんなところで見かける
>例えばどこですか?

私の手元の本とWEB上に。
window.attachEventで検索すれば90000件ほど。

ぴあちゃんさんのサンプルの意図するところが
理解できません。よければ噛み砕いてもらえますか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2009-03-16 01:52
window.attachEventなら、いくらでもサンプルがあるかと思いますが、
windowオブジェクトのイベントの「onclick」のことを言っていますか?

ぴあちゃんさんが仰るのは、
「windowオブジェクトにonclickってイベントなんてないんじゃない?」ってことでは。

実際に、
document.body.attachEvent('onclick',dispAlert);
は動いて、
window.attachEvent('onclick',XXXX);
は動いていないんですよね?

もし、仰るサンプルが絶対動くというのならば、
後学のためにも実際に動くのを私も見てみたいです。
@10
会議室デビュー日: 2008/10/09
投稿数: 11
お住まい・勤務地: 東京
投稿日時: 2009-03-16 10:08
>かつのりさん、ぴあちゃんさん

>「windowオブジェクトにonclickってイベントなんてないんじゃない?」ってことでは。

そのとおりですね。
「IEの場合windowオブジェクトにonclickイベントはない」可能性を全く疑っていませんでした。
返り値がTrueだったこともあり。。

大変勉強になりました。ありがとうございました。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-16 10:24
引用:
返り値がTrueだったこともあり。。


これは
alert(window.attachEvent('onclickkkkk',dispAlert));
とかでもtrueになりますね。やるのであれば
alert(window.onclick);
ですかね。(undefinedが返るはず)

スキルアップ/キャリアアップ(JOB@IT)