国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

讓Firefox支持event對象實現代碼

2024-05-06 14:13:00
字體:
來源:轉載
供稿:網友
通常為了兼容IE與FireFox,一般的事件處理方法為:
代碼如下:
btn.onclick=handle_btn_click;
function handle_btn_click(evt){
if(evt==null)evt=window.event;//IE
//處理事件.
}

對于簡單的程序,這不算麻煩.
但對于一些復雜的程序,某寫函數根本就不是直接與事件掛鉤的.如果要把event傳進該參數,那么所有的方法都要把event傳來傳去..這簡直就是噩夢.
下面介紹一個解決這個麻煩事的方法,與原理.
JScript中,函數的調用是有一個 func.caller 這個屬性的.
例如
代碼如下:
function A()
{
B();
}
function B()
{
alert(B.caller);
}

如果B被A調用,那么B.caller就是A
另外,函數有一個arguments屬性. 這個屬性可以遍歷函數當前執行的參數:
代碼如下:
function myalert()
{
var arr=[];
for(var i=0;i<myalert.arguments.length;i++)
arr[i]=myalert.arguments[i];
alert(arr.join("-"));
}
myalert("hello","world",1,2,3)

就能顯示 hello-world-1-2-3
(arguments的個數與調用方有關,而與函數的參數定義沒有任何關系)
根據這兩個屬性,我們可以得到第一個函數的event對象:
代碼如下:
btn.onclick=handle_click;
function handle_click()
{
showcontent();
}
function showcontent()
{
var evt=SearchEvent();
if(evt&&evt.shiftKey)//如果是基于事件的調用,并且shift被按下
window.open(global_helpurl);
else
location.href=global_helpurl;
}
function SearchEvent()
{
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event) // 如果就是event 對象
return arg0;
}
func=func.caller;
}
return null;
}

這個例子使用了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 下的實現:
下面給出一個簡單的代碼.. 有興趣的可以補充(本人已經有修改)
代碼如下:
<script language="javascript">
function handle_click() {
if(window.addEventListener)
{
FixPrototypeForGecko();
alert(window.event.srcElement)
}
}
function FixPrototypeForGecko()
{
HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);
window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);
Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);
}
function element_prototype_get_runtimeStyle()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新民市| 金沙县| 白玉县| 镇赉县| 内丘县| 冀州市| 微山县| 郴州市| 调兵山市| 华亭县| 黄平县| 广平县| 确山县| 砀山县| 宜良县| 恭城| 久治县| 景谷| 农安县| 馆陶县| 吉林省| 阜平县| 镇坪县| 纳雍县| 正定县| 宁强县| 丹巴县| 深水埗区| 咸阳市| 永川市| 山东省| 芷江| 仙居县| 区。| 汝南县| 宜兴市| 元氏县| 凤城市| 泽州县| 高碑店市| 纳雍县|