DOM規(guī)范沒有涵蓋所有瀏覽器支持的所有事件。HTML5詳盡列出了瀏覽器應(yīng)該支持的所有事件枷邪。
其中得到瀏覽器完善支持的事件:
-
contextmenu事件
通過單擊鼠標(biāo)右鍵诺凡,可以調(diào)出上下文菜單。
開發(fā)人員面臨的主要問題是:如何確定應(yīng)該顯示上下文菜單尔觉,以及如何屏蔽與該操作關(guān)聯(lián)的默認(rèn)上下文菜單芥吟。
解決辦法:contextmenu這個(gè)事件,用以表示何時(shí)應(yīng)該顯示上下文菜單钉稍,一遍開發(fā)人員取消默認(rèn)的上下文菜單棺耍,而提供自定義的菜單。
EventUtil.addHandler(window,"load",function(event){
var div=document.getElementById("mydiv");
EventUtil.addHandler(div,"contextmenu",function(event){
event=EventUtil.getEvent(event);
EventUtil.preventDefault(event);//取消默認(rèn)上下文菜單var menu=document.getElementById("mymenu"); menu.style.left=event.clientX+'px'; menu.style.top=event.clientY+'px'; menu.style.display="block"; }); EventUtil.addHandler(document,'click',function(event){ document.getElementById("mymenu").style.display='none' }); });
【解釋】
- 添加load事件,當(dāng)頁面加載完畢后左敌,執(zhí)行該事件矫限。
- 當(dāng)右鍵單擊時(shí),觸發(fā)
contextmenu
事件取董, - 由于該事件為鼠標(biāo)事件无宿,所以可以獲得鼠標(biāo)的位置信息。
- 添加click事件孽鸡,當(dāng)鼠標(biāo)單擊其他地方時(shí),隱藏該菜單豆胸。
- 注意該事件冒泡
-
beforeunload事件
為了讓開發(fā)人員有可能在頁面卸載之前阻止這一操作巷疼。這個(gè)事件會(huì)在瀏覽器卸載頁面之前觸發(fā)(包括跳轉(zhuǎn)頁面以及刷新頁面),可以通過它來取消卸載并繼續(xù)使用原有頁面估盘。
EventUtil.addHandler(window,'beforeunload',function(event){
event=EventUtil.getEvent(event);
var message="im really going to miss you if you go.";
event.returnValue=message;
return message;
})
【困惑】 -
event.returnValue
不是IE的事件對(duì)象中用于取消默認(rèn)行為的屬性么? - 這里需要將返回的確認(rèn)信息賦給這個(gè)屬性擅编。
- 奇怪的是燥透,當(dāng)我不寫
return message
時(shí),完全沒有問題肢藐,在最新版的各瀏覽器內(nèi)吱韭。 - 書上說,
event.returnValue=message;
這樣寫是對(duì)ie與火狐而言痘煤,return message
這樣寫是對(duì)webkit內(nèi)核而言猿规。 -
DOMContentLoaded事件
與window的load事件相比,該事件會(huì)在頁面中的一切都加載完畢時(shí)觸發(fā)蘸拔,但這個(gè)過程可能因?yàn)橐虞d的外部資源過多而頗費(fèi)周折环葵。
DOMContentLoaded事件這個(gè)事件則在形成完整的dom樹之后就觸發(fā)。不理會(huì)圖像张遭,js菊卷,css文件。
EventUtil.addHandler(document,'DOMContentLoaded',function(event){
alert('content loaded')
})
IE9以前版本的IE瀏覽器不支持這個(gè)事件的烁,書中建議在頁面加載期間設(shè)置一個(gè)時(shí)間為0毫秒的超時(shí)調(diào)用渴庆。
setTimeout(function(){
//添加事件處理程序
},0) -
readystatechange事件
這個(gè)事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。
支持這個(gè)事件的每個(gè)對(duì)象都有一個(gè)readyState屬性襟雷,可能包括下列五個(gè)值中的一個(gè)。 - uninitialized:對(duì)象存在咧虎,但尚未初始化
- loading:對(duì)象正在加載數(shù)據(jù)
- loaded:對(duì)象加載數(shù)據(jù)完成
- interactive:可以操作對(duì)象了砰诵,但還沒有完全加載完成捌显。
- complete 對(duì)象已經(jīng)加載完畢
- 雖然這些狀態(tài)看起來很直觀,很有順序理肺,但是善镰,并非所有對(duì)象都會(huì)經(jīng)歷這四個(gè)階段炫欺。
對(duì)一般的dom對(duì)象,在包含較多外部資源時(shí)树姨,交互階段可能早于完成階段娃弓,但是當(dāng)頁面中包含較少的外部資源時(shí)岛宦,完成階段先于交互階段的可能性更大。
EventUtil.addHandler(document,'readystatechange',function(event){
if(document.readyState=='interactive'||document.readyState=='complete'){
alert('content load');
EventUtil.removeHandler(document,'readystatechange',arguments.callee);
}
})
【解釋】
document對(duì)象挽霉,只要可以操作該對(duì)象变汪,我們便可以使用裙盾。所以還要滿足后兩個(gè)狀態(tài)的任意一個(gè)就可以他嫡。
為了避免該dom對(duì)象在滿足條件后重復(fù)執(zhí)行事件內(nèi)容钢属,可以在執(zhí)行一次后淆党,便移除該對(duì)象讶凉。 - 通過這種方法,也可以判斷荷憋,動(dòng)態(tài)添加的外部文件js與css文件是否已經(jīng)加載完成台谊。
不過由于外部文件較大譬挚,有時(shí)候會(huì)停在loaded階段减宣,而永遠(yuǎn)不會(huì)完成漆腌,有時(shí)候又會(huì)跳過loaded階段而直接完成。
EventUtil.addHandler(window,'load',function(){
var script=document.createElement('script');
EventUtil.addHandler(script,'readystatechange',function(event){
event=EventUtil.getEvent(event);
var target=EventUtil.getTarget(event);
if(target.readyState=='loaded'||target.readyState=='complete'){
alert('content load');
EventUtil.removeHandler(target,'readystatechange',arguments.callee);
}
});
script.src='../test.js';
document.body.appendChild(script);
})
測(cè)試后塑径,不知道為什么填具,沒有顯示alert('content load');
,求解釋劳景。
- 雖然這些狀態(tài)看起來很直觀,很有順序理肺,但是善镰,并非所有對(duì)象都會(huì)經(jīng)歷這四個(gè)階段炫欺。
-
pageshow和pagehide事件
在瀏覽器導(dǎo)航欄上,會(huì)有一對(duì)前進(jìn)與后退的按鈕闷串,瀏覽器支持一個(gè)名叫往返緩存的特性烹吵。當(dāng)我們打開一個(gè)網(wǎng)頁,通過這個(gè)網(wǎng)頁具被,又打開一個(gè)網(wǎng)頁只损,此時(shí)可以按住當(dāng)前網(wǎng)頁瀏覽器的后退按鈕跃惫,在不重新加載的條件下艾栋,回到上一個(gè)頁面蝗砾,也就是該頁面已經(jīng)存到這個(gè)往返緩存中去啦。
這兩個(gè)事件闲勺,可以更好的理解往返緩存菜循。 - pageshow事件在頁面顯示時(shí)觸發(fā)申尤,會(huì)在load事件觸發(fā)后觸發(fā)昧穿,無論該頁面是否來自往返緩存,都會(huì)觸發(fā)這個(gè)事件胶逢。當(dāng)來自往返緩存時(shí)寥枝,自然就不會(huì)觸發(fā)load事件啦囊拜。該事件對(duì)象有一個(gè)屬性,persisted南誊,該屬性是一個(gè)布爾值,表示該頁面是否保存在了往返緩存中霉赡。
- pagehide事件幔托,在瀏覽器卸載頁面之前觸發(fā)重挑,而且在unload事件之前觸發(fā)。如果頁面在卸載之后保存在了往返緩存中刺覆,那么persisted的值會(huì)被設(shè)為true史煎。所以第一次觸發(fā)pageshow事件時(shí)篇梭,該屬性的值一定為false。
【注意】這兩個(gè)事件的處理程序必須添加到window對(duì)象上充蓝。 -
haschange事件
方便程序員知道在URL列表發(fā)生變化時(shí)喉磁,觸發(fā)這個(gè)事件协怒,
這個(gè)事件的處理程序應(yīng)該添加到window對(duì)象上。
之所以新增這個(gè)事件仑撞,是因?yàn)樵赼jax應(yīng)用中隧哮,開發(fā)人員經(jīng)常利用URL參數(shù)列表來保存或?qū)Ш絠信息座舍。
該事件對(duì)象曲秉,包含兩個(gè)額外的屬性 oldURL與newURL疲牵,分別保存變換前后的url榆鼠。
并不是所有的瀏覽器都支持這些