完美解決一個事件啟用多個函數(2)

來源:互聯網
上載者:User
函數|解決 可是在一個頁面中,我們可能會遇到有多個事件要啟用多個函數,每個事件都要寫一遍那樣的代碼,顯然不是好主意。聰明的讀者可能已經想到,應該寫成一個函數activeMore(),哪個事件要啟用多個函數的,直接就用activeMore()就行。

  但是在上一部分中我們把事件的toString()當作JavaScript腳步本運行,實際上是運行一段函數代碼,如果寫成一個函數時還是用這個方法,即為函數中嵌套函數,將會出現意想不到的錯誤。 於是我們寫成函數時把事件的toString()中的“function anonymous()”字元去掉,運行時就不是一個函數,而是函數內部的代碼了。另外我們還可以定義先啟用原有的函數還是先啟用現在要啟用的函數。最後為了方便使用,我們把事件和要啟用的函數放在一起作為參數,寫成以下函數:


function activeMore(event_function,order){
// order 為負數時先啟用myFunction再啟用前面的指令碼
var isSn=event_function.indexOf("=",0);
var myEvent=event_function.substring(0,isSn);
var myFunction=event_function.substring(isSn+1,event_function.length);
var prefunction="";
if(eval(myEvent)) prefunction= eval(myEvent).toString().replace('function anonymous()',"");

if(order<0) eval(myEvent+"=new Function(myFunction+'\\n'+prefunction)");
else eval(myEvent+"=new Function(prefunction+'\\n'+myFunction)");
}

  以上函數我們先把參數“event_function”進行字串分析,得到事件(myEvent)和要啟用的函數(myFunction),然後取得原來啟用的函數(preFunction),最後把多個函數放在一起啟用。因為我們只是把“function anonymous()”去掉,preFunction字串的兩端會帶有“{ }”號,但並不影響程式的運行。

  下面我們舉一個實際應用的例子:使網頁中所有的連結都不出現虛線框。

  為了達到這個目的,我們給所有的連結的onfocus事件添加一個啟用函數“blur()”。為了保證一些連結原有的onfocus事件啟用函數仍然有效,我們要用一次activeMore()函數;為了能夠得到所有的連結,我們用到document.body的onload事件,又要用一次activeMore()函數:

//使連結不出現虛線框:
function blurLinks(){
for(i=0;i activeMore("document.links["+i+"].onfocus=if(this.blur)this.blur()",-1);
}
}
activeMore("document.body.onload=blurLinks()");

  連結的onfocus事件(document.links[i].onfocus)要啟用的函數是“if(this.blur)this.blur()”,參數order的值為-1表先啟用該函數再啟用它們原有的函數;document.body.onload事件要啟用的函數是“blurLinks()”,參數order的值省略(或為非負數)表先啟用它原有的函數再啟用“blurLinks()”。

  從例子中可以看到,這個函數用起來還挺簡單吧。有了activeMore()函數,無論多少個事件要啟用多個函數,都可以用同樣的文法解決了!



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。