JScript面向事件驅(qū)動(dòng)的編程
更新時(shí)間:2007年01月11日 00:00:00 作者:
世間萬物,千變?nèi)f化,面向?qū)ο蟮木幊桃嗍菍ΜF(xiàn)實(shí)社會(huì)的模擬,而JavaScript是一種基于對象并且很接近面向?qū)ο缶幊痰木幊陶Z言,而我們web設(shè)計(jì)師/程序員跟JavaScript打交道亦要直面JavaScript才能夠把網(wǎng)頁寫得更加豐富多彩.在此先搞清楚一點(diǎn)就是:JavaScript并不僅僅用在Web上,它可以用在許多領(lǐng)域,當(dāng)然我這里討論的更多的是JavaScript在Web上的應(yīng)用,并且主要是事件方面的應(yīng)用.
JavaScript并不能直接對Web對象進(jìn)行操作,而是要通過瀏覽器提供的Document Object Modle(即常聽說的DOM,文檔模型對象)來操作對象.HTML是一個(gè)樹文檔,它以HTML標(biāo)簽為根,其它的元素都是在HTML標(biāo)簽之內(nèi),一級一級地延伸下去.而DOM中,則以window為根對象,其它的對象則為它的子對象或者它的子對象的子對象.
首先來認(rèn)識(shí)一下什么叫事件,請看下邊的代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
很簡單的一個(gè)實(shí)例,頁面只有一個(gè)按鈕,它的value值為"這是一個(gè)按鈕",并且我們給它指定了onclick屬性,它的值為一行JavaScript代碼,使用了window對象的alert方法,將this.value的內(nèi)容顯示在警告窗體中.這里的this是啥呢?this就是當(dāng)前操作的對象,即該input對象.這份代碼告訴瀏覽器:"當(dāng)前對象受點(diǎn)擊"的時(shí)候要調(diào)用window.alert(this.value)這行代碼,因此瀏覽器在按鈕受點(diǎn)擊的時(shí)候就執(zhí)行了相關(guān)的操作.一個(gè)對象可以有許多事件,比如說單擊(click),雙擊(dbclick),鼠標(biāo)移到上邊(mouseover),鼠標(biāo)移開(mouseout)等等,這些事件經(jīng)常在各種流傳的代碼中可以看到.那如何給一個(gè)對象設(shè)置事件發(fā)生時(shí)執(zhí)行的代碼呢?一般來說有以下三種方式:
第一種:直接設(shè)置HTML元素的事件屬性,名稱一般是on+事件名稱,比如說單擊事件即為onclick,實(shí)例請見上邊的代碼
第二種:在script中對HTML對象設(shè)置事件屬性,名稱一般也是on+事件名稱,比如說obj.onclick = 函數(shù),請見實(shí)例代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
或者:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這第二種方式有兩種方法來指定執(zhí)行的代碼,但本質(zhì)上是一樣的,同樣是指定一個(gè)函數(shù)給對象,要求對象當(dāng)某事件發(fā)生的時(shí)候執(zhí)行該函數(shù).
第三種方式: 使用obj.attachEvent(IE瀏覽器)/obj.addEventListener方法來指定,建議使用此方法:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
為什么建議第三種方式呢?上邊所列的第一種方式很明顯只是設(shè)置一下元素屬性,只可能指定一次,而第二種方式與第三種方式的差別可以從下邊的實(shí)例中看出來:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
上邊的示例使用了兩個(gè)按鈕,并且使用了第二種方式與第三種方式先后指定了兩個(gè)函數(shù)給click事件,點(diǎn)擊第一個(gè)按鈕可以看到彈出了"指定的第二個(gè)函數(shù)",說明只有MyButton_Onclick1_2函數(shù)生效,而先前指定的MyButton_Onclick1_1被MyButton_Onclick1_2代替了。點(diǎn)擊第二個(gè)按鈕可以看到彈出了兩個(gè)窗體,顯示的內(nèi)容分別是"指定的第一個(gè)函數(shù)"和"指定的第二個(gè)函數(shù)",很明顯,使用attachEvent/addEventListener可以即增加要執(zhí)行的程序并且還能夠保留原有的程序,在IE中,它們是根據(jù)增加的順序倒序執(zhí)行,即先執(zhí)行后添加的MyButton_Onclick2_2,然后再執(zhí)行MyButton_Onclick2_1,而Firefox中則是相反,先執(zhí)行MyButton_Onclick2_1然后再執(zhí)行MyButton_Onclick2_2。。沒辦法,IE和Firefox是冤家,對著干。。呵呵
好了,俺還有項(xiàng)目要趕,只好先寫到這里,最近比較忙,呵呵。下篇文章計(jì)劃將利用本文的內(nèi)容寫一點(diǎn)應(yīng)用,內(nèi)容為:使用DHTML將span元素模擬成A元素,它亦是本文的后續(xù)文章,但不僅僅是關(guān)于事件了,還會(huì)配合CSS。
PS: 以上內(nèi)容皆為本人所知,如有不當(dāng)之處歡迎指正,不用給俺面子,文章內(nèi)容嚴(yán)謹(jǐn)才不會(huì)誤導(dǎo)讀者嘛。。同時(shí)也呼吁有能力的網(wǎng)友也加入到原創(chuàng)計(jì)劃中來。感謝此文的讀者以及支持無憂腳本原創(chuàng)計(jì)劃的網(wǎng)友。
再補(bǔ)充一個(gè) IE 專有的事件驅(qū)動(dòng)方法 Named Script
雖然不太建議這么寫,不過做為一個(gè)介紹還是有必要的,如果在只考慮 IE 用戶的情況下,此方法還是有一定的便利性的。
Named Script 通過 <script> 標(biāo)簽來定義對象事件。
語法:
<SCRIPT
CLASS=classname
DEFER
EVENT=eventname
FOR=element
ID=value
LANGUAGE=JAVASCRIPT | JSCRIPT | VBSCRIPT | VBS | XML
SRC=url
TITLE=text
TYPE=MIME-type
>
其它屬性與我們通常使用的 <script> 標(biāo)簽無異,就不過多介紹了,主要說的是 event 和 for 這兩個(gè)屬性。event 屬性表示了腳本在什么事件觸發(fā)執(zhí)行,for 屬性表示事件觸發(fā)的對象,就以紅亭的例子讓我們來看試一下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
大家應(yīng)該看到了,效果和其它的方法是一樣的,也許有人會(huì)說既然一樣而且兼容性又不好,為什么還要這么用呢?請看下面的例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這個(gè)例子有多個(gè)相同的 name 的對象,(注意:是 name 而不是 id,在 DOM 標(biāo)準(zhǔn)中 id 應(yīng)該是唯一的,雖然在 IE 中可以有多個(gè)相同 id 的對象,不過不建議大家這么做。)只用一句 Named Script 就可以對這些對象完成事件驅(qū)動(dòng),從代碼上來說簡便了不少,及至以后的修改也變的非常方便,這也是 Named Script 的最大優(yōu)點(diǎn)。
應(yīng)用最多的地方會(huì)在表單的 Radio 或者 Checkbox 對象上,因?yàn)樗鼈円话愣紩?huì)有相同的 name,而同時(shí)也會(huì)有相同的事件驅(qū)動(dòng),具體的應(yīng)用范圍很廣,可以在無憂腳本 http://www.51j.com/ 里搜索到大量的應(yīng)用實(shí)例,在此僅做一些簡單的介紹,就不過多的舉例了。 最后再次重申一下,此方法僅為 IE 特有,其它其它瀏覽器不支持。
判斷window.document.all是否為null是判斷當(dāng)前瀏覽器是IE還是Firefox最簡單的方法,因?yàn)镮E有這個(gè)對象,而firefox沒有。
JavaScript并不能直接對Web對象進(jìn)行操作,而是要通過瀏覽器提供的Document Object Modle(即常聽說的DOM,文檔模型對象)來操作對象.HTML是一個(gè)樹文檔,它以HTML標(biāo)簽為根,其它的元素都是在HTML標(biāo)簽之內(nèi),一級一級地延伸下去.而DOM中,則以window為根對象,其它的對象則為它的子對象或者它的子對象的子對象.
首先來認(rèn)識(shí)一下什么叫事件,請看下邊的代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
很簡單的一個(gè)實(shí)例,頁面只有一個(gè)按鈕,它的value值為"這是一個(gè)按鈕",并且我們給它指定了onclick屬性,它的值為一行JavaScript代碼,使用了window對象的alert方法,將this.value的內(nèi)容顯示在警告窗體中.這里的this是啥呢?this就是當(dāng)前操作的對象,即該input對象.這份代碼告訴瀏覽器:"當(dāng)前對象受點(diǎn)擊"的時(shí)候要調(diào)用window.alert(this.value)這行代碼,因此瀏覽器在按鈕受點(diǎn)擊的時(shí)候就執(zhí)行了相關(guān)的操作.一個(gè)對象可以有許多事件,比如說單擊(click),雙擊(dbclick),鼠標(biāo)移到上邊(mouseover),鼠標(biāo)移開(mouseout)等等,這些事件經(jīng)常在各種流傳的代碼中可以看到.那如何給一個(gè)對象設(shè)置事件發(fā)生時(shí)執(zhí)行的代碼呢?一般來說有以下三種方式:
第一種:直接設(shè)置HTML元素的事件屬性,名稱一般是on+事件名稱,比如說單擊事件即為onclick,實(shí)例請見上邊的代碼
第二種:在script中對HTML對象設(shè)置事件屬性,名稱一般也是on+事件名稱,比如說obj.onclick = 函數(shù),請見實(shí)例代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
或者:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這第二種方式有兩種方法來指定執(zhí)行的代碼,但本質(zhì)上是一樣的,同樣是指定一個(gè)函數(shù)給對象,要求對象當(dāng)某事件發(fā)生的時(shí)候執(zhí)行該函數(shù).
第三種方式: 使用obj.attachEvent(IE瀏覽器)/obj.addEventListener方法來指定,建議使用此方法:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
為什么建議第三種方式呢?上邊所列的第一種方式很明顯只是設(shè)置一下元素屬性,只可能指定一次,而第二種方式與第三種方式的差別可以從下邊的實(shí)例中看出來:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
上邊的示例使用了兩個(gè)按鈕,并且使用了第二種方式與第三種方式先后指定了兩個(gè)函數(shù)給click事件,點(diǎn)擊第一個(gè)按鈕可以看到彈出了"指定的第二個(gè)函數(shù)",說明只有MyButton_Onclick1_2函數(shù)生效,而先前指定的MyButton_Onclick1_1被MyButton_Onclick1_2代替了。點(diǎn)擊第二個(gè)按鈕可以看到彈出了兩個(gè)窗體,顯示的內(nèi)容分別是"指定的第一個(gè)函數(shù)"和"指定的第二個(gè)函數(shù)",很明顯,使用attachEvent/addEventListener可以即增加要執(zhí)行的程序并且還能夠保留原有的程序,在IE中,它們是根據(jù)增加的順序倒序執(zhí)行,即先執(zhí)行后添加的MyButton_Onclick2_2,然后再執(zhí)行MyButton_Onclick2_1,而Firefox中則是相反,先執(zhí)行MyButton_Onclick2_1然后再執(zhí)行MyButton_Onclick2_2。。沒辦法,IE和Firefox是冤家,對著干。。呵呵
好了,俺還有項(xiàng)目要趕,只好先寫到這里,最近比較忙,呵呵。下篇文章計(jì)劃將利用本文的內(nèi)容寫一點(diǎn)應(yīng)用,內(nèi)容為:使用DHTML將span元素模擬成A元素,它亦是本文的后續(xù)文章,但不僅僅是關(guān)于事件了,還會(huì)配合CSS。
PS: 以上內(nèi)容皆為本人所知,如有不當(dāng)之處歡迎指正,不用給俺面子,文章內(nèi)容嚴(yán)謹(jǐn)才不會(huì)誤導(dǎo)讀者嘛。。同時(shí)也呼吁有能力的網(wǎng)友也加入到原創(chuàng)計(jì)劃中來。感謝此文的讀者以及支持無憂腳本原創(chuàng)計(jì)劃的網(wǎng)友。
再補(bǔ)充一個(gè) IE 專有的事件驅(qū)動(dòng)方法 Named Script
雖然不太建議這么寫,不過做為一個(gè)介紹還是有必要的,如果在只考慮 IE 用戶的情況下,此方法還是有一定的便利性的。
Named Script 通過 <script> 標(biāo)簽來定義對象事件。
語法:
<SCRIPT
CLASS=classname
DEFER
EVENT=eventname
FOR=element
ID=value
LANGUAGE=JAVASCRIPT | JSCRIPT | VBSCRIPT | VBS | XML
SRC=url
TITLE=text
TYPE=MIME-type
>
其它屬性與我們通常使用的 <script> 標(biāo)簽無異,就不過多介紹了,主要說的是 event 和 for 這兩個(gè)屬性。event 屬性表示了腳本在什么事件觸發(fā)執(zhí)行,for 屬性表示事件觸發(fā)的對象,就以紅亭的例子讓我們來看試一下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
大家應(yīng)該看到了,效果和其它的方法是一樣的,也許有人會(huì)說既然一樣而且兼容性又不好,為什么還要這么用呢?請看下面的例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這個(gè)例子有多個(gè)相同的 name 的對象,(注意:是 name 而不是 id,在 DOM 標(biāo)準(zhǔn)中 id 應(yīng)該是唯一的,雖然在 IE 中可以有多個(gè)相同 id 的對象,不過不建議大家這么做。)只用一句 Named Script 就可以對這些對象完成事件驅(qū)動(dòng),從代碼上來說簡便了不少,及至以后的修改也變的非常方便,這也是 Named Script 的最大優(yōu)點(diǎn)。
應(yīng)用最多的地方會(huì)在表單的 Radio 或者 Checkbox 對象上,因?yàn)樗鼈円话愣紩?huì)有相同的 name,而同時(shí)也會(huì)有相同的事件驅(qū)動(dòng),具體的應(yīng)用范圍很廣,可以在無憂腳本 http://www.51j.com/ 里搜索到大量的應(yīng)用實(shí)例,在此僅做一些簡單的介紹,就不過多的舉例了。 最后再次重申一下,此方法僅為 IE 特有,其它其它瀏覽器不支持。
判斷window.document.all是否為null是判斷當(dāng)前瀏覽器是IE還是Firefox最簡單的方法,因?yàn)镮E有這個(gè)對象,而firefox沒有。
您可能感興趣的文章:
- 理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理
- js事件驅(qū)動(dòng)機(jī)制 瀏覽器兼容處理方法
- 淺談javascript基礎(chǔ)之客戶端事件驅(qū)動(dòng)
- 快速掌握Node.js事件驅(qū)動(dòng)模型
- 詳解Javascript事件驅(qū)動(dòng)編程
- Node.js事件驅(qū)動(dòng)
- Node.js中的事件驅(qū)動(dòng)編程詳解
- 深入理解javaScript中的事件驅(qū)動(dòng)
- 你必須知道的Javascript知識(shí)點(diǎn)之"單線程事件驅(qū)動(dòng)"的使用
- 淺談JS和Nodejs中的事件驅(qū)動(dòng)
相關(guān)文章
微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile(2022年最新版)
微信在最近開始要求使用wx.getUserProfile()來獲取用戶的昵稱,頭像等信息,所以下面這篇文章主要給大家介紹了關(guān)于2022年最新版微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile的相關(guān)資料,需要的朋友可以參考下2022-11-11js異步之a(chǎn)sync和await實(shí)現(xiàn)同步寫法
本文主要介紹了js異步之a(chǎn)sync和await實(shí)現(xiàn)同步寫法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03js 獲取后臺(tái)的字段 改變 checkbox的被選中的狀態(tài) 代碼
js 獲取后臺(tái)的字段 改變 checkbox的被選中的狀態(tài) 代碼,需要的朋友可以參考一下2013-06-06JS實(shí)現(xiàn)在線Excel的附件上傳與下載
在本地使用Excel時(shí),經(jīng)常會(huì)有需要在Excel中添加一些附件文件的需求,今天小編將為大家介紹如何使用前端HTML+JS+CSS技術(shù)通過超鏈接單元格的形式實(shí)現(xiàn)在線Excel附件上傳、下載和修改的操作,需要的可以參考下2023-08-08javascript 操作符(~、&、|、^、<<、>>)使用案例
這篇文章主要介紹了javascript 操作符(~、&、|、^、<<、>>)使用案例,非常的全面,需要的朋友可以參考下2014-12-12