我們已經介紹了對象的概念,我們可以通過定義屬性和方法來定義對象。不僅如此,對象還具有與之相關的事件。由于javascript中的內建對象并沒有相關的事件,因此在前面的內容中我們并沒有提到事件這個概念。但是,bom對象則具有相關的事件。
那么,bom對象都具有哪些事件呢?
當特定的操作發生或者狀態改變時,事件將被觸發。例如,當用戶在頁面上單擊時、或單擊頁面上的超鏈接時,或者當鼠標指針移過某段文字時,都可能觸發相應的事件。另外一個經常用到的事件是頁面的load事件,當頁面加載時將觸發這個事件。
那么,事件對我們有什么用呢?
為了說明事件的作用,讓我們來看一個例子,當用戶在頁面上的任何地方單擊鼠標時,我們希望彈出一個菜單。假定我們寫好了產生彈出菜單的函數,但是我們怎么知道什么時候讓菜單彈出呢?或者換句話說,我們什么時候調用這個產生彈出菜單的函數呢?因此,我們需要以某種方法捕獲用戶單擊頁面的事件,并且確保一旦單擊頁面的事件發生時,產生彈出菜單的函數即被調用。
為了實現這個功能,需要使用一種稱為事件處理器(event handler)的機制。當事件發生時,事件處理器將連接到需要執行的事件處理代碼。事件處理器提供了當事件發生時捕獲事件、并且執行相應的事件處理程序的機制。通常我們把在代碼中加入事件處理器稱為“將事件處理代碼連接到事件”。這有點類似于設置一個鬧鐘—— 當某個事件發生時,使鬧鐘振鈴。對于一個鬧鐘來說,這個觸發事件就是當到達某一確定的時間點時。
事件處理器由關鍵字on加上要處理的事件名組成。例如,click事件的事件處理器為onclick,load事件的事件處理器為onload。
通過事件處理器,可以使用多種方法將事件處理代碼連接到事件。在本章中,我們將介紹兩種最簡單的辦法。這兩種方法不但被當前的瀏覽器所支持,而且自netscape 2瀏覽器就開始使用,甚至更早的瀏覽器也支持這兩種方法。在第12章中將介紹其他較新的且更加易于標準化的添加事件的方法。
第一種方法是最常見的,即把事件處理器和關聯的代碼作為html標記的屬性和屬性值添加在相應的html標記中。
下面將創建一個簡單的html頁面,該頁面用<a>標記創建了一個超鏈接。相應地,瀏覽器將創建一個對應的a對象。我們都知道,a對象具有一個click事件,當用戶單擊超鏈接時,將觸發該超鏈接的click事件。這個頁面的代碼如下:
<html>
<body>
<a href="somepage.htm" name="linksomepage">
click me
</a>
</body>
</hml>
按照現在的情況,這個頁面除具有一個超鏈接之外并無其他的功能。單擊超鏈接,將導航到一個新的頁面somepage.htm,這是我們創建的另一個頁面。對于超鏈接,我們還沒有加上事件處理器。
正如上文所述,要為某個bom對象添加事件處理器,最常用且最簡單的方法就是直接將事件處理代碼作為html標記的屬性,添加在html標記中。在本例中,需要捕獲的就是由<a>標記所定義的a對象的click事件。當用戶單擊這個超鏈接時,我們希望能捕獲該click事件,并執行相應的事件處理代碼。因此,需要為<a>標記添加一個事件處理器,即onclick事件處理器。可以把onclick事件處理器作為一個屬性添加在<a>標記中,并把該屬性的值設置為事件觸發時要執行的處理代碼。
可以將<a>標記修改為如下代碼:
<a href="somepage.htm" name="linksomepage" onclick="alert('you clicked?')">
click me
</a>
現在,為<a>標記添加了一個屬性:onclick="alert('you clicked?')"。此時,當用戶單擊了這個超鏈接,將彈出一個消息對話框。之后,超鏈接才會執行默認的功能,并鏈接到由<a>標記的href屬性所定義的頁面。
如果連接到事件處理器的代碼只有一行,這個辦法就是可行的。但是當超鏈接被單擊時,所執行的事件處理代碼是多行時,那該怎么辦呢?
其實很簡單,我們只需要把希望執行的事件處理代碼定義為一個函數,然后在onclick事件處理器中調用這個函數。請看下面的代碼:
<html>
<body>
<script language="javascript">
function linksomepage_onclick()
{
alert('you clicked?');
return true;
}
</script>
<a href="somepage.htm" name="linksomepage" onclick="return
linksomepage_onclick()">
click me
</a>
</body>
</html>
在上面的腳本塊中,創建了一個linksomepage_onclick()函數,這是一個標準的函數。同時為了提高代碼的可讀性,我們為函數取了一個具有描述性的名字。此處,使用了objectname_event()這樣的形式作為函數的名稱。采用這種形式的名稱,可以很直接地看到這個函數與頁面上的哪一個對象關聯,并且連接的是哪一個事件。因此,在上面這個例子中,將函數定義為linksomepage_onclick(),即這個函數關聯的是名為linksomepage的超鏈接對象的onclick事件處理器。這種命名規范只是程序員的一種約定俗成,它并不是強制性的。只要在代碼中使用一致的命名規范,我們也可以使用自己喜歡的其他命名方式。
現在onclick屬性連接到了調用linksomepage_onclick()函數的代碼。因此,當用戶單擊了這個超鏈接,linksomepage_onclick()函數就將被執行。
值得注意的是,linksomepage_onclick()函數具有一個返回值,且在本例中,返回值為true。此外,在定義onclick屬性時,在函數名之前使用了一個return語句,將函數的返回值返回給onclick屬性,這是為什么呢?
由事件處理器 onclick="return linksomepage_onclick()"返回的值將被javascript用來決定超鏈接是否執行它的默認行為,即是否鏈接到一個新頁面去。如果返回值為true,則超鏈接將執行它的默認行為,并鏈接到somepage.htm頁面。如果返回值為false,則默認的事件處理功能—— 鏈接到somepage.htm頁面—— 將不會被執行,即超鏈接的默認事件處理行為被取消了。我們可以修改一下代碼以進行測試,如下所示:
function linksomepage_onclick()
{
alert('this link is going nowhere');
return false;
}
此時,你將發現僅僅彈出了一個消息對話框,超鏈接并沒有提供鏈接到somepage.htm頁面的功能。
某些對象和事件并不會使用事件處理器的返回值,因此有的時候返回值是多余的。另外,返回值為false時也并不一定總是能夠取消對象的默認行為。出于瀏覽器發展的歷史原因,對于某些瀏覽器有時當返回值為true時將取消對象的默認行為。通常,最好將返回值設置為true,在遇到特殊情況時再作出相應的處理,這樣做比較保險。
某些事件并不是直接由用戶的行為所觸發。例如,window對象具有load事件和unload事件,當頁面加載完畢時將觸發load事件,而當頁面卸載時,將觸發unload事件(頁面卸載指的是用戶關閉了瀏覽器,或者打開了其他頁面)。
實際上,window對象的事件處理器應放在<body>標記中。例如,要為window對象的load事件和unload事件添加相應的事件處理器,可以使用如下代碼:
<body language="javascript" onload="myonloadfunction()"
onunload="myonunloadfunction()">
注意,這里把<body>標記的language屬性設置為javascript,因為<body>標記并不包含在定義javascript腳本塊的<script>標記內。通常情況下,javascript就是默認的腳本語言,因此該language屬性也可以省略。
新聞熱點
疑難解答