Js発泡事件の詳細及び阻止例

3040 ワード

Js発泡機構とは、ある元素がイベントAを定義した場合、例えば、clickイベントがトリガされた後、泡事件を阻止しなかった場合、イベントは親レベルの元素に伝播し、親類のclick関数をトリガするというものです。
 
<html>
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
function ialertdouble(e) {
alert('innerdouble');
stopBubble(e);
}

function ialertthree(e) {
alert('innerthree');
stopBubbleDouble(e);
}

function stopBubble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//
}

function stopBubbleDouble(e) {
var evt = e||window.event;
evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//
evt.preventDefault();// ,
}

$(function() {
//
//$('#jquerytest').click(function(event) {
// alert('innerfour');
// event.stopPropagation();
// event.preventDefault();
//});

//
$('#jquerytest').click(function() {
alert('innerfour');
return false;
});
});
</script>
<div onclick="alert('without');">without
<div onclick="alert('middle');">middle
<div onclick="alert('inner');">inner</div>
<div onclick="ialertdouble(event)">innerdouble</div>
<p><a href='http://www.baidu.com' onclick="ialertthree(event)">innerthree</a></p>
<p id='jquerytest'><a href='http://www.baidu.com'>innerfour</a></p>
</div>
</div>
</html>
は、innerをクリックすると、順番に「inner」、「middle」、「without」をポップアップします。これは事件の泡が立つことです。直観的に見ても、一番奥のエリアは親ノードの中にあり、サブノードのエリアをクリックしても、親ノードのエリアをクリックしているので、イベントが広がってきます。実は、多くの時、私達は事件が泡を噴き出したくなくて、このように同時にいくつかの事件を触発することができるためです。続いて:私たちはinnerdoubleをクリックします。彼女は泡を立てていないことが分かります。彼女は呼出方法であるアレットドゥーバでstopBubbleを呼び出しました。方法はブラウザのタイプを判断します。リンクしていると、彼女も泡を止めることができますが、ジャンプします。これはブラウザのデフォルトです。preventDefault()方法によって阻止する必要があります。具体的にはialertthree()を見ることができます。今主流のはjqueryを使ってclickイベントを結びつけることです。そうすると、簡単に多くなります。イベントをクリックしてパラメータイベントに入ることができます。直接event.stopPropagation()event.prevent Default()//リンクがないので、これを追加する必要はありません。これでいいです。フレームワークは良いですが、もっと簡単なものがあります。イベントハンドラでfalseに戻ります。これはイベントオブジェクトでstopPropopopopopopopoppegation()とpreventDefault()を同時に呼び出すための簡単な書き方です。詳細コードは上をご覧ください。jquery.jsをロードしてください。」実際には、各clickイベントに判定を加えることもできます。
 
$('#id').click(function(event){
if(event.target==this){
//do something
}
})
解析:イベントハンドラの変数イベントは、イベントオブジェクトを保存しています。イベント発生のターゲット要素はevent.target属性に保存されています。この属性はDOM APIで規定されていますが、すべてのブラウザでは実現されていません。jQueryはこのイベントの対象を必要な拡張を行い、どのブラウザでもこの属性を使うことができます。targetにより、DOMで最初にイベントを受信した要素(すなわち実際にクリックされた要素)が決定される。また、thisが事件を処理するDOM要素を引用していることを知っていますので、上記のコードを作成することができます。でも、return false、Jqueryバインディングイベントを使うとオススメです。