js學(xué)習(xí)總結(jié)之DOM2兼容處理順序問題的解決方法
DOM2兼容處理順序問題的解決方法,具體如下
解決順序問題:我們不用瀏覽器自帶的事件池了,而是自己模擬標(biāo)準(zhǔn)瀏覽器的事件池實(shí)現(xiàn),具體代碼如下:
/*
bind:處理DOM2級事件綁定的兼容性問題(綁定方法)
@parameter:
curEle->要綁定事件的元素
evenType->要綁定的事件類型("click","mouseover")
evenFn->要綁定的方法
*/
function bind(curEle,evenType,evenFn){
if('addEventListener' in document){
curEle.addEventListener(evenType,evenFn,false);
return;
}
//給evenFn化妝 并且把化妝前的照片貼在自己對應(yīng)的腦門上
var tempFn = function(){
evenFn.call(curEle)
}
tempFn.photo = evenFn;
//首先判斷自定義屬性之前是否存在,不存在的話創(chuàng)建一個(gè),由于要存儲(chǔ)多個(gè)化妝后的結(jié)果,所以我們讓其值是一個(gè)數(shù)組
if(!curEle["mybind"+evenType]){//根據(jù)不同的事件類型是不同的數(shù)組
curEle["mybind"+evenType] = [];
}
//解決重復(fù)問題:每一次自己在往自定義屬性對應(yīng)的容器中添加前,看一下是否已經(jīng)存在,存在的話就不用重新的添加了,同理也不需要往事件池里面存儲(chǔ)了
var ary = curEle["mybind"+evenType];
for(var i = 0;i<ary.length;i++){
var cur = ary[i];
if(cur.photo === evenFn){
return;
}
}
ary.push(tempFn);
curEle.attachEvent("on"+evenType,tempFn);
//這里的開始想法是改變this的指向,把this不指向window
/*
box.attachEvent("onclick",function(){
fn1.call(box)
})
這樣雖然解決了this的問題,但是又拋出了一個(gè)新的問題,不知道該如何刪除了(我們不知道匿名函數(shù)是誰)
var tempFn = function(){
fn1.call(box)
}
box.attachEvent("onclick",tempFn);
box.detachEvent("onclick",tempFn);
*/
}
function unbind(curEle,evenType,evenFn){
if('removeEventListener' in document){
curEle.removeEventListener(evenType,evenFn,false);
return;
}
//拿evenFn到curEle["myBind"]這里找化妝后的結(jié)果,找到之后再事件池中把化妝后的結(jié)果移除事件池
var ary = curEle['myBind'+evenType];
for(var i = 0;i<ary.length;i++){
if(ary[i].photo===evenFn){
ary.splice(i,1)//找到后 把自己存儲(chǔ)的容器中對應(yīng)的移除掉
curEle.detachEvent("on"+evenType,ary[i]);//在把事件池中對應(yīng)的也移除掉
break;
}
}
}
//創(chuàng)建事件池,并且把需要給當(dāng)前元素綁定的方法依次的增加到事件池中
function on(curEle,evenType,evenFn){
if(!curEle["myEvent"+evenType]){
curEle["myEvent"+evenType] = [];
}
var ary = curEle["myEvent"+evenType];
for(var i = 0;i<ary.length;i++){
var cur = ary[i];
if(cur===evenFn){
return;
}
}
ary.push(evenFn);
//執(zhí)行on的時(shí)候,我們給當(dāng)前元素綁定了一個(gè)點(diǎn)擊的行為,當(dāng)點(diǎn)擊的時(shí)候執(zhí)行run方法:run方法中的this是當(dāng)前元素curEle,并且瀏覽器給run傳遞一個(gè)MouseEvent事件對象
// curEle.addEventListener(evenType,run,false);
bind(curEle,evenType,run)
}
//在自己的事件池中把某一個(gè)方法移除
function off(curEle,evenType,evenFn){
var ary = curEle["myEvent"+evenType];
for(var i = 0;i<ary.length;i++){
var cur = ary[i];
if(cur===evenFn){
ary.splice(i,1);
break;
}
}
}
//我們只給當(dāng)前元素的點(diǎn)擊行為綁定一個(gè)方法run,當(dāng)觸發(fā)點(diǎn)擊的時(shí)候執(zhí)行的是run方法,我在run方法中根據(jù)自己存儲(chǔ)的方法順序分別的在把這些方法執(zhí)行
function run(e){
// this 當(dāng)前點(diǎn)擊的對象curEle
e = e || window.event;
var flag = e.target?true:false;
if(!flag){
e.target = e.srcElement;
}
//獲取自己事件池中綁定的那些方法,并且讓這些方法依次的執(zhí)行就可以了
var ary = this["myEvent"+e.type];//e.target也代表curEle
for(var i = 0;i<ary.length;i++){
var tempFn = ary[i];
tempFn.call(this,e);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- js學(xué)習(xí)總結(jié)之DOM2兼容處理重復(fù)問題的解決方法
- javascript 兼容所有瀏覽器的DOM擴(kuò)展功能
- Dom操作之兼容技巧分享
- Dom與瀏覽器兼容性說明
- DOM Scripting中的圖片切換[兼容Firefox]
- 前端開發(fā)部分總結(jié)[兼容性、DOM操作、跨域等](持續(xù)更新)
- javascript firefox兼容ie的dom方法腳本
- javascript下有關(guān)dom以及xml節(jié)點(diǎn)訪問兼容問題
- js學(xué)習(xí)總結(jié)之DOM2兼容處理this問題的解決方法
相關(guān)文章
通過BootStrap實(shí)現(xiàn)輪播圖的實(shí)際應(yīng)用
js我們沒有學(xué)過,今天我是用bootstrap實(shí)現(xiàn)輪播圖的效果,非常不錯(cuò)代碼簡單易懂,需要的朋友參考下吧2016-09-09
基于javascript實(shí)現(xiàn)的購物商城商品倒計(jì)時(shí)實(shí)例
本文主要介紹了基于javascript實(shí)現(xiàn)的購物商城商品倒計(jì)時(shí)實(shí)例,代碼詳細(xì),可直接復(fù)制試試看效果。需要的朋友可以參考借鑒2016-12-12
escape編碼與unescape解碼漢字出現(xiàn)亂碼的解決方法
這篇文章主要介紹了escape編碼與unescape解碼漢字出現(xiàn)亂碼的解決方法,需要的朋友可以參考下2014-07-07
JS中強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)
JavaScript中有幾種強(qiáng)制類型轉(zhuǎn)換的方法,可以將一個(gè)數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類型,具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05
javascript jquery對form元素的常見操作詳解
下面小編就為大家?guī)硪黄猨avascript jquery對form元素的常見操作詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
JS實(shí)現(xiàn)帶導(dǎo)航城市列表以及輸入搜索功能
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)帶導(dǎo)航城市列表以及輸入搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

