javascript 跨瀏覽器開發(fā)經(jīng)驗總結(jié)(五) js 事件
更新時間:2010年05月19日 19:02:33 作者:
javascript 跨瀏覽器開發(fā)之js 事件的兼容性問題,需要的朋友可以參考下。
簡單事件模型和高級事件模型
簡單事件模型和高級事件模型簡單事件,就是事件與頁面元素直觀的綁定在一起的形式,如:
<div onclick="alert(this.innerHTML);">
element.onclick = function(){alert(this.innerHTML);}
只要不是用了個別瀏覽器獨有的事件,一般的click,mouseover事件等在各瀏覽器中都可以這么使用。
但是當(dāng)一個事件需要綁定多個監(jiān)聽,或者需要動態(tài)注冊/移出監(jiān)聽時,簡單事件模型就不夠用了,需要使用高級事件模型(IE和其他瀏覽器在使用高級事件模型時就有區(qū)別了):
//注冊
function addEventHandler(element, evtName, callback, useCapture) {
//DOM標(biāo)準(zhǔn)
if (element.addEventListener) {
element.addEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture參數(shù)
element.attachEvent('on' + evtName, callback);
}
}
//移除
function removeEventHandler(element, evtName, callback, useCapture) {
//DOM標(biāo)準(zhǔn)
if (element.removeEventListener) {
element.removeEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture參數(shù)
element.dettachEvent('on' + evtName, callback);
}
}
標(biāo)簽中onclick事件與href屬性的調(diào)用順序關(guān)系
在a標(biāo)簽響應(yīng)點擊事件時,會先進行onclick事件的響應(yīng),再執(zhí)行href中的跳轉(zhuǎn)方法。如以下標(biāo)簽點擊后會先后提示“button”和“href”:
<a href=”javascript:alert(“href”);” onclick="alert(this.innerHTML);"> button </a>
但是,最好不要在href中定義具體的javascript方法,因為這個是定義跳轉(zhuǎn)的鏈接地址的屬性,如果需要先后執(zhí)行兩個javascript方法,應(yīng)該這樣寫:
<a href=”#” onclick="alert(this.innerHTML); alert(“href”);"> button </a>
但是上面的寫法中如果onclick綁定的響應(yīng)方法中并沒有提交請求跳轉(zhuǎn)至別的頁面,那么會發(fā)現(xiàn)當(dāng)前網(wǎng)頁做了一次刷新,因為以上代碼中href=“#”表示跳轉(zhuǎn)到當(dāng)前頁的頂部,但是并沒有發(fā)出新的html請求。有的時候,我們并不希望頁面在響應(yīng)onclick事件后又跳回頂部(尤其是頁面高度較長,出現(xiàn)滾動條,并且該鏈接位于頁面底部時,跳轉(zhuǎn)至頂部后用戶還需要拖動滾動條找回原來位置繼續(xù)操作時),那么應(yīng)該在onclick后返回false值,阻止繼續(xù)進行href定義的動作,如:
<a href=”#” onclick="alert(this.innerHTML); alert(“href”);return false;"> button </a>
或者將#替換成空的javascript語句:
<a href=”javascript:void(0)” onclick="alert(this.innerHTML); alert(“href”);"> button </a>
onload事件的調(diào)用順序
有的時候在頁面初始化時需要調(diào)用一些腳本來設(shè)置頁面元素的初始狀態(tài),最標(biāo)準(zhǔn)的做法是用<body onload=””>方式或者document.onload方式調(diào)用。onload的事件的觸發(fā)會在頁面元素渲染完畢之后調(diào)用,這樣就保證了不會出現(xiàn)腳本執(zhí)行時找不到未渲染的頁面元素的情況。如果是在<head>區(qū)域的<script>塊中執(zhí)行腳本,并使用了頁面元素時,就很有可能出現(xiàn)找不到元素的錯誤。如果是在<body>區(qū)域的<script>塊中執(zhí)行腳本,只能使用該<script>塊之前的頁面元素,因為<body>區(qū)域的元素基本是順序解析的。
onchange事件
<input>元素和<select>的<option>元素都支持onchangge事件,但是經(jīng)常我們會發(fā)現(xiàn)元素的內(nèi)容值變化了卻沒有觸發(fā)onchangge事件。這是因為onchange事件的觸發(fā)還有另一個條件:當(dāng)前元素處于失去焦點(onblur)的狀態(tài)。所以,onchange事件只能捕獲用戶操作時的值變化,對于使用javascript腳本動態(tài)改變元素value的情況,它是捕獲不到的。
事件截獲
因除了IE之外的瀏覽器不能識別window.event所以要使用以下方式來獲取當(dāng)前事件和事件發(fā)生的目標(biāo)元素:
var evt = e?e:(window.event?window.event:null);
var el = evt.srcElement?evt.srcElement:evt.target;
這里有一些其它相關(guān)的文章,非常值得參考下
JavaScript Event事件學(xué)習(xí)第一章 Event介紹
javascript 跨瀏覽器的事件系統(tǒng)
簡單事件模型和高級事件模型簡單事件,就是事件與頁面元素直觀的綁定在一起的形式,如:
復(fù)制代碼 代碼如下:
<div onclick="alert(this.innerHTML);">
element.onclick = function(){alert(this.innerHTML);}
只要不是用了個別瀏覽器獨有的事件,一般的click,mouseover事件等在各瀏覽器中都可以這么使用。
但是當(dāng)一個事件需要綁定多個監(jiān)聽,或者需要動態(tài)注冊/移出監(jiān)聽時,簡單事件模型就不夠用了,需要使用高級事件模型(IE和其他瀏覽器在使用高級事件模型時就有區(qū)別了):
復(fù)制代碼 代碼如下:
//注冊
function addEventHandler(element, evtName, callback, useCapture) {
//DOM標(biāo)準(zhǔn)
if (element.addEventListener) {
element.addEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture參數(shù)
element.attachEvent('on' + evtName, callback);
}
}
//移除
function removeEventHandler(element, evtName, callback, useCapture) {
//DOM標(biāo)準(zhǔn)
if (element.removeEventListener) {
element.removeEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture參數(shù)
element.dettachEvent('on' + evtName, callback);
}
}
標(biāo)簽中onclick事件與href屬性的調(diào)用順序關(guān)系
在a標(biāo)簽響應(yīng)點擊事件時,會先進行onclick事件的響應(yīng),再執(zhí)行href中的跳轉(zhuǎn)方法。如以下標(biāo)簽點擊后會先后提示“button”和“href”:
<a href=”javascript:alert(“href”);” onclick="alert(this.innerHTML);"> button </a>
但是,最好不要在href中定義具體的javascript方法,因為這個是定義跳轉(zhuǎn)的鏈接地址的屬性,如果需要先后執(zhí)行兩個javascript方法,應(yīng)該這樣寫:
<a href=”#” onclick="alert(this.innerHTML); alert(“href”);"> button </a>
但是上面的寫法中如果onclick綁定的響應(yīng)方法中并沒有提交請求跳轉(zhuǎn)至別的頁面,那么會發(fā)現(xiàn)當(dāng)前網(wǎng)頁做了一次刷新,因為以上代碼中href=“#”表示跳轉(zhuǎn)到當(dāng)前頁的頂部,但是并沒有發(fā)出新的html請求。有的時候,我們并不希望頁面在響應(yīng)onclick事件后又跳回頂部(尤其是頁面高度較長,出現(xiàn)滾動條,并且該鏈接位于頁面底部時,跳轉(zhuǎn)至頂部后用戶還需要拖動滾動條找回原來位置繼續(xù)操作時),那么應(yīng)該在onclick后返回false值,阻止繼續(xù)進行href定義的動作,如:
<a href=”#” onclick="alert(this.innerHTML); alert(“href”);return false;"> button </a>
或者將#替換成空的javascript語句:
<a href=”javascript:void(0)” onclick="alert(this.innerHTML); alert(“href”);"> button </a>
onload事件的調(diào)用順序
有的時候在頁面初始化時需要調(diào)用一些腳本來設(shè)置頁面元素的初始狀態(tài),最標(biāo)準(zhǔn)的做法是用<body onload=””>方式或者document.onload方式調(diào)用。onload的事件的觸發(fā)會在頁面元素渲染完畢之后調(diào)用,這樣就保證了不會出現(xiàn)腳本執(zhí)行時找不到未渲染的頁面元素的情況。如果是在<head>區(qū)域的<script>塊中執(zhí)行腳本,并使用了頁面元素時,就很有可能出現(xiàn)找不到元素的錯誤。如果是在<body>區(qū)域的<script>塊中執(zhí)行腳本,只能使用該<script>塊之前的頁面元素,因為<body>區(qū)域的元素基本是順序解析的。
onchange事件
<input>元素和<select>的<option>元素都支持onchangge事件,但是經(jīng)常我們會發(fā)現(xiàn)元素的內(nèi)容值變化了卻沒有觸發(fā)onchangge事件。這是因為onchange事件的觸發(fā)還有另一個條件:當(dāng)前元素處于失去焦點(onblur)的狀態(tài)。所以,onchange事件只能捕獲用戶操作時的值變化,對于使用javascript腳本動態(tài)改變元素value的情況,它是捕獲不到的。
事件截獲
因除了IE之外的瀏覽器不能識別window.event所以要使用以下方式來獲取當(dāng)前事件和事件發(fā)生的目標(biāo)元素:
var evt = e?e:(window.event?window.event:null);
var el = evt.srcElement?evt.srcElement:evt.target;
這里有一些其它相關(guān)的文章,非常值得參考下
JavaScript Event事件學(xué)習(xí)第一章 Event介紹
javascript 跨瀏覽器的事件系統(tǒng)
您可能感興趣的文章:
相關(guān)文章
JavaScript輸出為[object?Object]問題的解決辦法
平時我們在接收后端返回的json對象通常是一個字符串類型的object,所以一般我們要對這個object進行類型轉(zhuǎn)化后,我們才能使用object里面的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于JavaScript輸出為[object?Object]問題的解決辦法,需要的朋友可以參考下2023-11-11javascript 文件的同步加載與異步加載實現(xiàn)原理
本文將介紹javascript 文件的同步加載與異步加載實現(xiàn)原理,需要了解的朋友可以了解下2012-12-12Locate a File Using a File Open Dialog Box
Locate a File Using a File Open Dialog Box...2007-06-06js switch case default 的用法示例介紹
switch case default的用法應(yīng)該存在一部分人不會使用吧,其實很簡單就是每個case后,一定要加:break;default,就相當(dāng)于else,不會的朋友可以了解下2013-10-10