中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

事件模塊的演變

  本篇開(kāi)始將回顧下Javascript的事件機(jī)制。同時(shí)會(huì)從一個(gè)最小的函數(shù)開(kāi)始寫(xiě)到最后一個(gè)具有完整功能的,強(qiáng)大的事件模塊。為敘述方便將響應(yīng)函數(shù)/回調(diào)函數(shù)/事件Listener/事件handler都稱(chēng)為事件handler。

  先看看頁(yè)面中添加事件的幾種方式:

  1,直接將JS代碼寫(xiě)在HTML上

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

  上一篇我們封裝了一個(gè)addEvent:

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

  2,并且統(tǒng)一了事件對(duì)象作為事件handler的第一個(gè)參數(shù)傳入。

  這篇把對(duì)應(yīng)的刪除事件的函數(shù)補(bǔ)上。上一篇中fn在IE6/7/8中實(shí)際上被包裝了,IE6/7/8中真正的handler是el["e"+fn]。因此刪除時(shí)要用到它。同時(shí)將兩個(gè)方法掛在一個(gè)對(duì)象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有個(gè)問(wèn)題,對(duì)同一類(lèi)型事件添加多個(gè)hanlder時(shí),IE6/7/8下會(huì)無(wú)序,如:

<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中同一個(gè)類(lèi)型事件的多個(gè)handler執(zhí)行無(wú)序的情況,為此改動(dòng)也是較大的。實(shí)現(xiàn)幾乎與前一個(gè)版本完全不同。但好處也是明顯的。

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

<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,已經(jīng)搭起了它的初始框架。或許有人要說(shuō),與眾多JS庫(kù)或框架相比,它還沒(méi)有解決事件對(duì)象的兼容性問(wèn)題。是的,我故意將此放到后續(xù)補(bǔ)充。因?yàn)槭录?duì)象的兼容性問(wèn)題太多了,太繁瑣了。

  這篇我將引入一個(gè)私有的_fixEvent函數(shù),add中將調(diào)用該函數(shù)。_fixEvent將修復(fù)(或稱(chēng)包裝)原生事件對(duì)象,返回一個(gè)標(biāo)準(zhǔn)的統(tǒng)一接口的事件對(duì)象。如下:

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知識(shí)庫(kù)事件模塊的演變,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲成人自拍 | 三级在线观看 | 久久久久国产精品一区二区 | 91资源在线| 亚洲午夜精品一区二区三区他趣 | 久久99久久久久 | 国产日韩精品在线 | 久操伊人 | 精品成人一区 | 亚洲男人天堂 | 羞羞视频在线观看网站 | 亚洲高清在线观看 | 精品欧美| 国产黄色一级电影 | 中文字幕一区二区视频 | 自拍视频精品 | 岛国毛片在线观看 | 亚洲精品一区二区三区蜜桃久 | 黄色av网站免费看 | 91免费版在线观看 | 日韩午夜场 | 国产精品一区二区三区在线播放 | 亚洲一区二区三区在线视频 | 天天干天天爱天天操 | 久久久久久综合 | 国产精品1区2区 | caoporn免费| 一级黄色短片 | 久草在线 | 欧美日韩在线免费 | 亚洲一区二区在线视频 | 91精品免费 | 免费欧美 | 韩国毛片一区二区三区 | 欧美精品乱码久久久久久按摩 | 国产精品久久久久久久久久久久久久 | 免费骚视频 | 亚洲国产精品久久人人爱 | 精品熟人一区二区三区四区 | 九九久久免费视频 | 国产精品av久久久久久久久久 |