◆下面介紹一個解決這個麻煩事的方法,與原理.
Javascriptcript中,函數的調用是有一個func.caller這個屬性的.
例如
- functionA()
- {
- B();
- }
- functionB()
- {
- alert(B.caller);
- }
如果B被A調用,那麼B.caller就是A
◆另外,函數有一個arguments屬性.這個屬性可以遍歷函數當前執行的參數:
- functionmyalert()
- {
- vararr=[];
- for(vari=0;i
- arr[i]=myalert.arguments[i];
- alert(arr.join("-"));
- }
- alert("hello","world",1,2,3)
就能顯示hello-world-1-2-3
(arguments的個數與調用方有關,而與函數的參數定義沒有任何關系)
根據這兩個屬性,我們可以得到第一個函數的event對象:
- btn.onclick=handle_click;
- functionhandle_click()
- {
- showcontent();
- }
- functionshowcontent()
- {
- varevt=SearchEvent();
- if(evt&&evt.shiftKey)//如果是基於事件的調用,並且shift被按下
- window.open(global_helpurl);
- else
- location.href=global_helpurl;
- }
- functionSearchEvent()
- {
- func=SearchEvent.caller;
- while(func!=null)
- {
- vararg0=func.arguments[0];
- if(arg0)
- {
- if(arg0.constructor==Event)//如果就是event對象
- returnarg0;
- }
- funcfunc=func.caller;
- }
- returnnull;
- }
這個例子使用了SearchEvent來搜索event對象.其中'Event'是Firefox的event.constructor.
在該例子運行時,
SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以func=func.caller時,func變為handle_click.
handle_click被Firefox調用,雖然沒有定義參數,但是被調用時,第一個參數就是event,所以handle_click.arguments[0]就是event!
針對上面的知識,我們可以結合prototype.__defineGetter__來實現window.event在Firefox下的實現: