イベントハンドラを外部ファイルに分離させた場合のevent.targetやevent.srcElementの挙動について

このQ&Aのポイント
  • イベントハンドラを外部ファイルに分離させた場合、Firefoxで動作しない問題が発生します。
  • イベントハンドラをfunction()からfunction(event)に変更すると、Firefoxでの動作は修正されますが、Internet Explorerでは動作しなくなります。
  • FirefoxとInternet Explorerの両方で動作するようにするには、条件分岐を追加して、event.targetとevent.srcElementの両方を考慮した処理を行う必要があります。
回答を見る
  • ベストアンサー

イベントハンドラを外部ファイルに分離させた時の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両方動くようにするにはどういう記述にしたらいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

こんなんでどうでしょう。↓(マウスオーバーとマウスアウトは同時に補足出来ます) <script type="text/javascript"> <!-- $(function() { if('undefined' !== typeof document.addEventListener){  document.addEventListener('mousemove',listener,false); }else if ('undefined' !== document.attachEvent){  document.attachEvent('onmousemove',listener); } function listener(event){  var target = event.target || event.srcElement;  switch(event.type){   case "mousemove":  var outtarget = event.relatedTarget || event.fromElement;    if (target == document.getElementsByTagName('div')[0]){    alert("マウスが入ったのは" + target.tagName);    if(outtarget != null)     alert("マウスが出たのは" + outtarget.tagName);    }   break;  } } }); // --> </script>

bokuchan7
質問者

お礼

できました!ありがとうございます!

その他の回答 (1)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

No.1 訂正 'mousemove' でなく 'mouseover' でしたね。 それから、$(function(){ って、jQuery使ってるなら $(function() {  $("div:eq(0)").mouseover(function(){ alert($(this).get(0).tagName); }); }); だけでしょう...

関連するQ&A

  • イベント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オブジェクトはどうなるのでしょうか?ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?

  • イベントハンドラを完全に外部化にしたい

    イベントハンドラをなんとか、完全に外部ファイルにしたいと考えています。 <ul><li> <a href="a.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image1','','../ig/c1.gif',1)"> <img src="../ig1.gif" alt="aaa" name="Image1" id="Image1" /></a></li> <li> <a href="b.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image2','','../ig/c2.gif',1)"> <img src="../ig2.gif" alt="bb" name="Image2" id="Image2" /></a></li> ・ ・ ・ </ul> サイトのナビ部分のソースです。この中にあるonmouseout、やonmouseoverを外部ファイルにして、 <ul><li> <a href="a.html"><img ~></li> <a href="b.html"><img ~></li>・ ・ ・ </ul>というすっきりした形にできないものでしょうか… イベント登録する関数を作って、ページのonloadで実行しておく という感じかな…と考えていたりするんですが… どのように記述すればよいか お知恵をお貸しください。 ※MM_swapImgRestoreやMM_swapImageはすでに外部化済です

  • イベントハンドラの関数の引数について

    こんにちは。 Object.onmouseoverのイベントハンドラにObject.classNameとeventを引数とする関数(func1)を指定するにはどのような風にしたら良いでしょうか?以下のように 試しましたがいずれも動きません。 function func1(obj,event){・・・} (1)Object.onmouseover=function(){func1(Object.className,event)} //エラー:Object.classNameはNull (2)Object.onmouseover=function(Object.className,event){func1(Object.className,event)} //無反応 (3)Object.onmouseover="func1("+Object.className+",event)"; //onmouseoverでない時にfunc1が呼び出される。 よろしくお願いいたします。

  • 外部ファイルについて

    JavaScriptやCSSなどHEAD内に書き込むものなら外部ファイルにできますよね? ではBODY部に書くものは?? <BODY>    : <DIV ID="MENU" STYLE="POSITION:ABSOLUTE; TOP:0; LEFT:0;"> <IMG SRC="../img/var.jpg" NAME="VAR" WIDTH=101% HEIGHT=25 STYLE="filter:Alpha(opacity=40);" onMouseOver="change(this,100);" onMouseOut="change(this,40);"> <SPAN STYLE="POSITION:ABSOLUTE; TOP:8; LEFT:10"> <A HREF="../default.htm"> <IMG SRC="../img/0101.gif" NAME="image01" BORDER=0></A> </SPAN>    : </DIV> となってるんですが、 <DIV>~</DIV> の間を外部ファイルにしたいんです。 このようなことはできますか?

    • ベストアンサー
    • CSS
  • JavaScriptのイベントハンドラ設定の方法

    要素(aタグなど)にイベントハンドラを設定する場合、 直接onclick等を書かずにaddEventListenerで追加するのが良いと聞きました。 しかしIEでは使えず、attachEventで設定する必要があります。 htmlとJavaScriptを分離するという意味では理解できるのですが、 http://java-script.seesaa.net/category/2504769-1.html の用に document.getElementById("hoge").onclick = function("hogehoge"); とする方が楽なんじゃないでしょうか? IEでもFirefoxでも動くので、addEventListenerの用にブラウザ毎に書く必要もありません。 前者を使うメリットは何なのでしょうか?

  • 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を使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • ブラウザに応じたJavaScriptの書き方

    divの中にp、 pの中にspan、 spanの中にinputがあるとして、 クリックしたらそれぞれの要素のタグををalertで表示させたいとき、 (例1) <div onClick="a=event.target || event.srcElement;alert(a.tagName)">div  <p>p   <span>span    <input type="button" value="input">   </span>  </p> </div> で良いと思います。 (IE,Safri,Chrome,Opera,Firefox,Lunascapeで確認済み) ただ、onClick内をスッキリさせたいので (例2) <script> function whereYouClick1(){  a=event.target || event.srcElement;  alert(a.tagName); } </script> <div onclick="whereYouClick1();">div  <p>p   <span>span    <input type="button" value="input">   </span>  </p> </div> とすると、FirefoxとLunascapeで動かなくなります(よね?)。 苦肉の策として (例3) <script> function whereYouClick2(){  alert(a.tagName); } </script> <div onclick="a=event.target || event.srcElement;whereYouClick2()">div  <p>p   <span>span    <input type="button" value="input">   </span>  </p> </div> としたらすべてのブラウザで動いたのですが、腑に落ちません。 これなら(例1)のままの方がすっきりして良かったような気がします。 ここ以外でも同じスクリプトを使いまわしたいときにはfunctionを定義したいところですが、 Forefox, Lunascapeのために(例3)の書き方にならざるを得なくなると思いますが、気持ち悪いです。 もっときれいな書き方はないのでしょうか。 また、上の例では一旦 a=event.target || event.srcElement; としてから、 alert(a.tagName) とやっていますが、 alert(event.target.tagName || event.srcElement.tagName) とやったらIEではエラーとなりました。そんなもんなんでしょうか。 基本的な事柄で申し訳ありませんが、よろしくお願いします。

  • jQueryで設定したイベントハンドラが消える

    jQueryについての質問です。 ちょっと言葉での説明が難しいので、具体的なコードを記載します。 === JavaScript === var clicked = function () { alert(1); }; var jqButton = $("<input type='button' value='test' />"); jqButton.click(clicked); $(function() { $("#showButton").click(function () { $("#test").html(jqButton); }); $("#hideButton").click(function () { $("#test").html(""); }); }); === HTML === <input type="button" id="showButton" value="show" /> <input type="button" id="hideButton" value="hide" /> <div id="test"></div> showボタンをクリックすると、testボタンが表示されます。 hideボタンをクリックすると、testボタンが消えます。 testボタンをクリックすると、alert(1) が実行されます。 という内容なのですが、一度hideしてから再度showして現れたtestボタンをクリックしても、 何も起きません。 仮に、jqButton.click(clicked); の部分を、 jqButton[0].attachEvent("onclick", clicked); などにすると、再表示させたtestボタンも動作します。 これはjQueryのイベントハンドラ設定APIを使った時特有の症状だと思うのですが、 なぜこのような結果になるのでしょうか。 てっきり、$.click()でイベントハンドラを設定すると、 内部でattachEventとかaddEventListnerとかが走るだけだと想像してましたが・・・ また、attachEventなど使わずに、jQueryの機能を使って、 再表示させてtestボタンも動作させるには、どうしたらいいでしょうか。 ご存知の方いましたら、お願い致します。

  • jQueryのclickイベントハンドラ

    最近jQueryを勉強中でして、練習の意味で自分で以下のようなページを作ってみました。 【ページの内容】 犬、猫、鳥の画像ボタンを配置して、クリックすると各ボタンのalt属性をアラート表示する 【実際のhtml】 <div class="header"> <ul class="menu"> <li><a href="index.html" id="btn1"><img src="dog.png" alt="Dog"></a></li> <li><a href="index.html" id="btn2"><img src="cat.png" alt="Cat"></a></li> <li><a href="index.html" id="btn3"><img src="bird.png" alt="Bird"></a></li> </ul> </div> 【実際のscript】 $(function(){ var btn1 = $('#btn1'); var photo1 = btn1.find('img'); var name1 = photo1.attr('alt'); btn1.click(function(){ alert(name1); }); var btn2 = $('#btn2'); var photo2 = btn2.find('img'); var name2 = photo2.attr('alt'); btn2.click(function(){ alert(name2); }); var btn3 = $('#btn3'); var photo3 = btn3.find('img'); var name3 = photo3.attr('alt'); btn3.click(function(){ alert(name3); }); }); 上記で一応やりたいことは再現はできるのですが、scriptが冗長なのでもっと短くしたいです。 しかしどんなスクリプトにすればよいかわかりません。 宜しければアドバイスお願いいたします。

  • 画像をドラッグ&ドロップで移動したい

    画像をドラッグ&ドロップで移動したいのですが、 DIV内でテキスト文だと移動できるのですが、画像だけだと移動できません(テキスト文と画像を入れるとテキスト文と一緒に画像が移動しますが、テキスト文なしの画像だけで移動させたいです。) 何故、画像だけでドラッグ&ドロップで移動させることができないのでしょうか?画像だけで移動させるにはどうしたらいいでしょうか? 宜しくお願いいたします。 IE7です。 <HTML> <HEAD><TITLE>画像をドラッグ&ドロップで移動したい</TITLE> </HEAD> <SCRIPT language="JavaScript"> var target; var isDrag=0; function document_onmousedown(){ isDrag=1; target=event.srcElement;} function document_onmousemove(){ if( isDrag ){ target.style.top=event.clientY; target.style.left=event.clientX;} } function document_onmouseup(){ isDrag=0; //alert(text1.style.top); //alert(event.srcElement); } </SCRIPT> <BODY onmousemove="document_onmousemove()" onmousedown= "document_onmousedown()" onmouseup="document_onmouseup()"> <DIV style="position:absolute;font-size:24px;cursor:hand; "> <img src="画像.gif"> </DIV> <BR> <BR></BODY></html>

専門家に質問してみよう