JavascriptのaddEventListener()とattachEvent()の区別分析

7216 ワード

イベントの使い方は、あるイベント(状況)がトリガーされた後にあるFunction、特にJavascriptを実行することであることはよく知られていますが、人気AJAXの触媒の下でJavascriptのEventの使い方を知ることがより重要です.ここではJavascriptのEventの使い方を紹介します.
Mozilla:addEventListenerの使い方:
target.addEventListener(type, listener, useCapture);

target:ドキュメントノード、document、windowまたはXMLhttpRequest.type:文字列、イベント名、「click」、「mouseover」、「keydown」など、「on」を含まない.Listener:EventListenerインタフェースまたはJavaScriptの関数を実装します.useCapture:スナップを使用するかどうか、一般的にfalseを使用します.例:
document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

IE中:
target.attachEvent(type, listener);

target:ドキュメントノード、document、windowまたはXMLhttpRequest.type:文字列、イベント名、「onclick」、「onmouseover」、「onkeydown」など、「on」を含む.Listener:EventListenerインタフェースまたはJavaScriptの関数を実装します.例:
document.getElementById("txt").attachEvent("onclick",function(event){alert(event.keyCode);});

W 3 CおよびIEは、指定されたイベントの削除を同時にサポートし、設定されたイベントを削除するためのものであり、フォーマットはそれぞれ以下の通りである:W 3 Cフォーマット:
removeEventListener(event,function,capture/bubble);

Windows IEのフォーマットは以下の通りです.
detachEvent(event,function);
target.addEventListener(type, listener, useCapture);

targetドキュメントノード、document、windowまたはXMLhttpRequest.type文字列、イベント名、「click」、「mouseover」、「keydown」などの「on」は含まれません.ListenerはEventListenerインタフェースまたはJavaScriptの関数を実現します.useCaptureがスナップを使用するかどうかは、falseイベントでトリガーされるとイベントハンドラにEventオブジェクトが渡されるのが一般的です.たとえば、次のようなイベントフローのセクションを見てわかります.
document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

適応ブラウザのバージョンが異なり、使用中にattachEventメソッドボタンonclick IEでaddEventListenerメソッドボタンclick foxで使用する原理に注意してください.実行の優先度が異なります.次の例では、あるイベントに他の処理イベントを付加するattachEventメソッドについて説明します.(Mozillaシリーズはサポートされていません)Mozillaシリーズの例としてaddEventListenerメソッドを使用します.
document.getElementById("btn").onclick = method1; 
document.getElementById("btn").onclick = method2; 
document.getElementById("btn").onclick = method3;//     ,      medhot3   

次のように書かれています.
var btn1Obj = document.getElementById("btn1"); //object.attachEvent(event,function); 
btn1Obj.attachEvent("onclick",method1); 
btn1Obj.attachEvent("onclick",method2); 
btn1Obj.attachEvent("onclick",method3);//     method3->method2->method1

Mozillaシリーズの場合、このメソッドはサポートされていません.addEventListenerを使用する必要があります.
var btn1Obj = document.getElementById("btn1"); 
//element.addEventListener(type,listener,useCapture); 
btn1Obj.addEventListener("click",method1,false); 
btn1Obj.addEventListener("click",method2,false); 
btn1Obj.addEventListener("click",method3,false);//     method1->method2->method3

例:(divはjsの前に置かなければならないことに注意してください)
<html> 
<head> 
</head> 
<body> 
<div id="name1" style="border:1px solid red;padding:10px 10px 10px 10px;" style="border:1px solid red;padding:10px 10px 10px 10px;"> 
<div id="name2" style="border:1px solid green;padding:10px 10px 10px 10px;" style="border:1px solid green;padding:10px 10px 10px 10px;">  </div> 
</div> 
<div id="info"></div> 
<script type="text/javascript"> 
var name1=document.getElementById('name1'); //    
var name2=document.getElementById('name2'); //    
var info=document.getElementById('info'); 
if(name1.attachEvent){ //  attachEvent   target           
    name1.attachEvent('onclick',function () { info.innerHTML += "  " + "<br>"; }); 
    name2.attachEvent('onclick',function () { info.innerHTML += "  " + "<br>"; }); 
}else{ 
    name1.addEventListener('click',function () { info.innerHTML += "  " + "<br>"; },false); 
    name2.addEventListener('click',function () { info.innerHTML += "  " + "<br>"; },false); 
} 
</script> 
</body> 
</html>

W 3 Cの発展時間軸から見ると、DOM(Document Object Model)のモデルは2種類に分けられ、DOM 0とDOM 2に分けられる.数字から見ればDOM 0はもちろん古いプロトコルであることがわかる.
新しいDOM 2法はaddEventListener()という関数で観測できる.
addEventListener(event,function,capture/bubble);

パラメータeventは上記の表のようにfunctionが実行する関数である、captureとbubbleはそれぞれW 3 Cが作成した2つの時間パターンである、簡単に言えばcaptureはdocumentの開始から最後の行まで読んでからイベントを実行し、bubbleは指定の位置を探してからイベントを実行する.Capture/bubbleのパラメータはブール値、Trueはcapture、Falseはbubbleを表す.Windows Internet Explorerでは、attachEvent()というEventHandlerも制定されています.フォーマットは以下の通りです.
window.attachEvent(”submit”,myFunction());

特にattachEventは、windows IE環境でBubbleを使用するモードであるため、capture/bubbleのパラメータを指定する必要はない.ここでは、画像のRolloverの例を用いて、イベントの使い方を表現します.
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “ 
<html>
<head>
<title>Rollover</title>
<script type=”text/javascript”>
function moveOver(imgObj) {  
    if (typeof window.addEventListener != “undefined”) {  
        imgObj.addEventListener(”mouseover”,function(){imgObj.src = imgObj.id +“_over.png”;}, false); 
        imgObj.addEventListener(”mouseout”, function(){imgObj.src = imgObj.id +“_default.png”;}, false);  
     } else {  
         imgObj.attachEvent(”onmouseover”,function(){imgObj.src = imgObj.id +“_over.png”;});  
         imgObj.attachEvent(”onmouseout”, function(){imgObj.src = imgObj.id +“_default.png”;});  
     }
}
function rollover() {
    var images = document.getElementsByTagName(”img”);
    var roll = new RegExp (”rollover”);
    var preload = [];
    for (var i = 0; i < images.length; i++) {  
        if (images[i].id.match(roll)) {  
            preload[i] = new Image();  
            preload[i].src = images[i].id + “_over.png”;  
            moveOver(images[i]);  
        }
    }
}
if (typeof window.addEventListener != “undefined”) {  
    window.addEventListener(”load”,rollover,false);
} else {  
    window.attachEvent(”onload”,rollover);
}
</script>
</head>
    <body>    
    <p>
        <img id=”rollover_home” name=”img_home” src=”rollover_home_default.png” alt=”Home”>
    </p>    
    <p>
        <img id=”rollover_about” name=”img_about” src=”rollover_about_default.png” alt=”About”>
    </p>    
    <p>
        <img id=”rollover_blog” name=”img_blog” src=”rollover_blog_default.png” alt=”Blog”>
    </p>    
    <p>
        <img id=”logo” name=”img_logo” src=”logo.png” alt=”Braingia Logo”>
    </p>
    </body>
</html>

上記のtypeof window.addEventListener != 「undefined」プログラムコードは、利用者のブラウザがAddEventListenerというイベントモデルをサポートするか否かを判断し、サポートしなければattachEventを使用する.
W 3 CおよびIEは、指定されたイベントの削除を同時にサポートし、設定されたイベントの削除を目的としており、フォーマットはそれぞれ以下の通りである.
W 3 C形式:
removeEventListener(event,function,capture/bubble);

Windows IEのフォーマットは以下の通りです.
detachEvent(event,function);