フレームにカーソルが乗ったときにスクリプトを動かすには?

[上に] [前に] [次に]
おがまん [E-Mail] 2000/06/02(金) 19:46:23
短時間の間にまた質問してすみません。フレームに関する問題です。
フレームを二つに分割し(名前はframe1とframe2)、
マウスがframe1に重なったときにスクリプト(例えば、alert('abc');)を動かしたいです。
そこで、frame1の中に、
self.onMouseOver=alert('abc');
という関数を書きましたが、これをonLoadで動かすと、読み込み時だけにアラートボックスが開き、
その後は何の音沙汰もありませんでした。
frame2の方に、
parent.frame1.onMouseOver=alert('abc');
と書いても同じでした。
そもそも、フレームに対してonMouseOverを使おうとするのがおかしいのでしょうか。
どうか、よろしくお願いします。
以下にフレームの記述を載せさせていただきました。

親フレーム
<html>
<frameset rows='40,*'>
<frame src='frame1.html' name='frame1'>
<frame src='frame2.html' name='frame2'></frameset>
</html>

フレーム1
<html><head>
<script language="JavaScript"><!--
function test(){
  self.onMouseOver=alert("123");
}
//-->
</script>
</head>
<body onLoad="test();">frame1
</html>

フレーム2
<html>
<body>frame2
</html>

Maja [E-Mail] 2000/06/02(金) 23:05:07
IEですかNNですか?
IEだったら
document.body.onmouseover=alert("frame1だよ");
NNだったら
self.document.onmouseover=alert("frame1だよ");
とframe1に書いてみてください。
確認はしてませんが…

おがまん 2000/06/03(土) 13:50:49
Majaさん、どうも回答ありがとうございました。
早速試してみたのですが、IE5でもNN4.6の方も、残念ながら上手くいきませんでした。
IEの方のエラーでは「実装されていません」と言われました(?私には意味不明ですけど)。
フレーム全体にレイヤーを張るなどすればできるのでしょうか?
……試してみます。
というか、レイヤーにonMouseOverが使えればいいのですけど……
ありがとうございました。

Maja [E-Mail] 2000/06/03(土) 22:27:08
以下のようにしてみてください。
最初に window. をつけてみる。
onmouseoverをすべて小文字にしてみてください。HTMLのタグの中に書くのとは違う。
NNでdocumentを抜いてください(これは私の記述ミス)。
NNでself.captureEvents(Event.MOUSEOVER);を加えてみてください。
参考
IEでは最下層はdocument.body.onmouseover=alert("frame1だよ");
NNではwindow.onmouseover=alert("frame1だよ");と
window.captureEvents(Event.MOUSEOVER);
と書くようです。
ちなみに、レイア(absoluteなDIV)にonmouseoverをつけるときは
document.all.divのid.onmouseover=  //IE
document.layers.divのid.onmouseover=  //NN
という風に書くようです。(親のレイアがないとき)
大文字、小文字は間違えないで下さい。

おがまん 2000/06/03(土) 22:53:08
Majaさん、また考えていただきありがとうございます。
今ほとんどネットスケープ4.6で確認しているのですが、window.やself.やdocument.や
self.captureEvents(Event.MOUSEOVER);などを加えたり取ったりして試したのですが、
なかなか上手く動いてくれません。
ウィンドウにマウスが重なっただけで何かイベントを起こすということ自体が無理なのでしょうか……
もう少し粘ってみます。ありがとうございます。

現在のフレーム1のソースは
<html><head>
<script language="JavaScript"><!--
function test(){
  window.self.captureEvents(Event.MOUSEOVER);
  window.self.onmouseover=alert("frame1だよ");
}
//-->
</script>
</head>
<body onLoad="test()">frame1
</html>
です。

Mugi [E-Mail] [HomePage] 2000/06/03(土) 23:29:50
> window.self.onmouseover=alert("frame1だよ");
こういう場合、
window.self.onmouseover=new Function('alert("frame1だよ")');
じゃないですか?

Maja [E-Mail] 2000/06/03(土) 23:32:00
onmouseoverは無理かもしれませんね。
onmousemoveで最初の一回だけ呼び出すようにするとか…
どうでしょう。

Mugi [E-Mail] [HomePage] 2000/06/03(土) 23:39:01
ちょっとずるいですが、これでねすけでも動くようになりました。
--- frame1.html ----
<script language="JavaScript"><!--
function test(){
  if(document.layers){
  document.layers[0].captureEvents(Event.MOUSEOVER);
  document.layers[0].onmouseover=test2
  }else{
  document.onmouseover=test2
  }
}

function test2(){
alert("frame1だよ")
}
//-->
</script>
<body onLoad="test()">
<layer top=0 left=0 width=100% height=100%></layer>
frame1
</body>
----

おがまん [HomePage] 2000/06/03(土) 23:54:11
Majaさん、Mugiさん、またまた早い回答でありがとうございます。

>Majaさん
onmousemoveに変えてみたのですが、やはり最初の読み込み時にアラートボックスが出て、
それ以後は音沙汰なしという結果のままでした。
いろいろ考えていただいたのになかなか上手く行かなくて……なんか申し訳ないです。

>Mugiさん
またスクリプトまで考えていただき、ありがとうございます。
(これから試させていただきます)
やはりレイヤーを使うのが早道ですか。
私もレイヤーでやってみようと思います。
 先ほどのテーブルの色を変えるスクリプトでも、ネットスケープなら
レイヤーを使えばいいんですよね?
試してみようと思います。
ありがとうございました。

おがまん [E-Mail] [HomePage] 2000/06/04(日) 00:30:24
[[解決]]
Mugiさんのスクリプトで、IE、ネスケの両方で動いてくれました。
感動です。
本当にありがとうございました。勉強になりました。

ところでIEだと、上のスクリプト、敏感に反応してちゃんと動いてくれるのですが、
ネスケだと、マウスを早く動かしたときとか、アラートボックスを閉じたすぐ直後にカーソルをフレーム1に移動させたときとか
スクリプトが働いてくれず、アラートボックスが出てこないことがあります。
これはパソコンの性能の問題でしょうか?

何はともあれ、できたので解決にさせていただきます。
Majaさん、Mugiさん、わがままに付き合っていただき、ありがとうございました。

[上に] [前に] [次に]