天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

事件模塊的演變

  本篇開始將回顧下Javascript的事件機制。同時會從一個最小的函數開始寫到最后一個具有完整功能的,強大的事件模塊。為敘述方便將響應函數/回調函數/事件Listener/事件handler都稱為事件handler。

  先看看頁面中添加事件的幾種方式:

  1,直接將JS代碼寫在HTML上

<div onclick="alert(4);">Div1 Element</div>

  上一篇我們封裝了一個addEvent:

  1,解決了IE6/7/8下事件handler中this為window的錯誤。

  2,并且統一了事件對象作為事件handler的第一個參數傳入。

  這篇把對應的刪除事件的函數補上。上一篇中fn在IE6/7/8中實際上被包裝了,IE6/7/8中真正的handler是el["e"+fn]。因此刪除時要用到它。同時將兩個方法掛在一個對象E上,add,remove分別添加和刪除事件。

E = {
//添加事件
add : function(el, type, fn){
if(el.addEventListener){
el.addEventListener(type, fn,
false);
}
else{
el[
'e'+fn] = function(){
fn.call(el,evt);
};
el.attachEvent(
'on' + type, el['e'+fn]);
}
},
//刪除事件
remove : function(el, type, fn){
if(el.removeEventListener){
el.removeEventListener(type, fn,
false);
}
else if(el.detachEvent){
el.detachEvent(
'on' + type, el['e'+fn]);
}
}
};

  上一篇中的add有個問題,對同一類型事件添加多個hanlder時,IE6/7/8下會無序,如:

<div id="d1" style="width:200px;height:200px;background:gold;"></div>
<script type="text/Javascript">
var el = document.getElementById('d1');
function handler1(){alert('1');}
function handler2(){alert('2');}
function handler3(){alert('3');}
function handler4(){alert('4');}
function handler5(){alert('5');}
E.add(el,
'click', handler1);
E.add(el,
'click', handler2);
E.add(el,
'click', handler3);
E.add(el,
'click', handler4);
E.add(el,
'click', handler5);
</script>

  上一篇解決了IE6/7/8中同一個類型事件的多個handler執行無序的情況,為此改動也是較大的。實現幾乎與前一個版本完全不同。但好處也是明顯的。

  有時需要添加只執行一次的事件handler,為此給add方法添加第四個參數one,one為true則該事件handler只執行一次。

<div id="d1" style="width:200px;height:200px;background:gold;"></div>
<script>
var el = document.getElementById('d1');
function handler(){alert(5)}
E.add(el,
'click', handler, true);
</script>

  上一篇正式推出了我的事件模塊event_v1,已經搭起了它的初始框架。或許有人要說,與眾多JS庫或框架相比,它還沒有解決事件對象的兼容性問題。是的,我故意將此放到后續補充。因為事件對象的兼容性問題太多了,太繁瑣了。

  這篇我將引入一個私有的_fixEvent函數,add中將調用該函數。_fixEvent將修復(或稱包裝)原生事件對象,返回一個標準的統一接口的事件對象。如下:

function _fixEvent( evt, el ) {
var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
len
= props.length;
function now() {return (new Date).getTime();}
function returnFalse() {return false;}
function returnTrue() {return true;}
function Event( src ) {
this.originalEvent = src;
this.type = src.type;
this.timeStamp = now();
}
Event.prototype
= {
preventDefault:
function() {
this.isDefaultPrevented = returnTrue;
var e = this.originalEvent;
if( e.preventDefault ) {
e.preventDefault();
}
e.returnValue
= false;
},
stopPropagation:
function() {
this.isPropagationStopped = returnTrue;
var e = this.originalEvent;
if( e.stopPropagation ) {
e.stopPropagation();
}
e.cancelBubble
= true;
},
stopImmediatePropagation:
function() {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse
};

var originalEvent = evt;
evt
= new Event( originalEvent );

for(var i = len, prop; i;) {
prop
= props[ --i ];
evt[ prop ]
= originalEvent[ prop ];
}
if(!evt.target) {
evt.target
= evt.srcElement || document;
}
if( evt.target.nodeType === 3 ) {
evt.target
= evt.target.parentNode;
}
if( !evt.relatedTarget && evt.fromElement ) {
evt.relatedTarget
= evt.fromElement === evt.target ? evt.toElement : evt.fromElement;
}
if( evt.pageX == null && evt.clientX != null ) {
var doc = document.documentElement, body = document.body;
evt.pageX
= evt.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
evt.pageY
= evt.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
}
if( !evt.which && ((evt.charCode || evt.charCode === 0) ? evt.charCode : evt.keyCode) ) {
evt.which
= evt.charCode || evt.keyCode;
}
if( !evt.metaKey && evt.ctrlKey ) {
evt.metaKey
= evt.ctrlKey;
}
if( !evt.which && evt.button !== undefined ) {
evt.which
= (evt.button & 1 ? 1 : ( evt.button & 2 ? 3 : ( evt.button & 4 ? 2 : 0 ) ));
}
if(!evt.currentTarget) evt.currentTarget = el;

return evt;
}

it知識庫事件模塊的演變,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 免费无码又爽又黄又刺激网站 | 神马影院在线eecss伦理片 | 午夜想想爱| 久久久久久久久人体 | 色多多污污在线播放免费 | 无码毛片内射白浆视频 | 成人亚洲乱码在线 | 欧美成 人 网 站 免费 | 99国产视频 | 九色PORNY真实丨国产免费 | 亚洲AV无码影院在线播放 | 国产在线播放91 | 日本高清片免费观看 | 免费成年人在线视频 | 男女肉大捧进出全过程免费 | 孕妇泬出白浆18P | 久久久久影视 | 饱满奶大30p | 娇小XXXXX第一次出血 | 国产亚洲精品久久精品6 | 日产2021免费一二三四区在线 | 调教美丽的白丝袜麻麻视频 | 午夜国产理论 | 用震蛋调教女性下面视频 | 欧美国产日韩久久久 | 2023国产精品一卡2卡三卡4卡 | 免费看a视频 | 热99RE久久精品国产 | 高hnp肉文| 国语自产拍在线视频普通话 | 国产精品亚洲在钱视频 | 攵女yin乱合集高h | 边做边爱播放3免费观看 | 亚洲欧美综合乱码精品成人网 | 小草影院免费 | 秋霞成人午夜鲁丝一区二区三区 | 无限资源在线观看完整版免费下载 | 让男人玩尿道的女人 | 在线电影一区二区 | 国产亚洲欧美ai在线看片 | 春药按摩人妻中文字幕 |