主要內容:
- 編寫一個優秀的標記文件
- 編寫一個JavaScript函數以顯示用戶想要查看的內容
- 由標記出發函數調用
- 使用幾個新方法擴展這個JavaScript函數
學習過DOM,我們用JavaScript和DOM去建立一個圖片庫。最好的辦法是什么呢?
利用JavaScript來建立圖片庫是最佳的選擇:把整個圖片庫的瀏覽鏈接集中安排在圖片庫主頁里,只在用戶點擊了這個主頁里的某個圖片鏈接時才把相應的圖片傳送給他。首先找到四張圖片,把它們修正成最適合于用瀏覽器來查看的圖片,就是400像素寬*300像素高。
4.1、標記
第一項工作是為一些圖片創建一個鏈接清單。可以讓這些圖片按照特定順序排列,使用無序清單列表<ul>來列出那些鏈接。圖片也可以事先排好序,那就使用一個有序清單元素<ol>來標記這些圖片鏈接。
代碼:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"></meta><title> Image Gallery</title>
</head>
<body><h1>Snapshots</h1><ul><li><a href = "images/fireworks.jpg" title = “ A fireworks display”>Fireworks</a></li><li><a href = "images/coffee.jpg" title = “ A cup of black coffee”>Coffee</a></li><li><a href = "images/rose.jpg" title = “ A red,red rose”>Rose</a></li><li><a href = "images/bigben.jpg" title = “ The famous clock”>Big Ben</a></li></ul>
</body>
我們把這些標記保存到gallery.html文件,并把圖片集中到目錄images里。我的images目錄和gallery.html文件位于同一目錄。
當然,這并不是一個令人滿意的網頁。尤其是它的默認行為還不太理想。我們提出幾點需要改進的地方。
- 當點擊某個鏈接時,我希望能留在這個網頁而不是轉到另一個窗口。
- 當點擊某個鏈接時,我希望能在這個網頁上同時看到那張圖片以及原有的圖片清單。
為了實現我們提出的幾點改進,我們要進行哪些步驟呢?
- 通過增加一個“占位符”圖片的方法在這個主頁上位圖片預留一個瀏覽區域。
- 在點擊某個鏈接時,攔截這個網頁的默認行為。
- 在點擊某個攔截時,把”占位符“替換為與那個鏈接相對應的圖片。
我們先來解決”占位符“圖片的問題。選用了一個類似于名片的圖片。
把下列代碼添加到圖片清單的末尾:
<img id = "placeholder" src = "images/placeholder.gif" alt = "my image gallery"/>
如上圖所示,那么“占位符圖片”我們已經搞好了。
下面開始編寫JavaScrpit代碼。
4.2????JavaScript
????為了把“占位符”圖片替換為想要查看的圖片,需要改變它的src屬性。setAttribute是完成這項工作的最佳選擇,而我將利用這個方法寫一個函數。這個函數只有一個參數,就是一個圖片鏈接。它通過改變“占位符圖片”的src屬性的辦法將其替換為參數照片。
1、首先,需要給函數起一個名字,簡明扼要。我們將其命名為showPic。還需要給這個函數參數起一個名字。命名為whichpic:
function showPic(whichpic)
whichpic 代表著一個元素節點,具體的說,那是一個指向某個圖片的<a>元素。我需要分解出圖片的文件路徑,這可以通過在whichpic元素上調用getAttribute得到。只要把"href"作為參數傳遞給getAttribute就行了:
? ? whichpic.getAttribute("href")
我們把這個路徑存入變量source:
var source =?whichpic.getAttribute("href");
2、獲取“占位符”圖片,這對getElementById來說很容易:
document.getElementById("placeholder")
我們可以把獲得的這個元素賦給變量placeholder:
var placeholder = document.getElementById("placeholder");
我們聲明了兩個變量 placeholder和 source。這可以讓腳本簡明易讀。
3、我將使用setAttribute對placeholder元素的src屬性進行刷新。setAttribute函數有兩個參數,一個是屬性名,一個是屬性的值。具體到這個例子,我想對src屬性進行設置,所以第一個參數是"src";第二個參數是src屬性的值,我們已經把它保存到source變量里了。
placeholder.setAttribute("src",source);
setAttribute方法是“第1級DOM”(DOM)的組成部分,它可以設置任意元素節點的任意屬性。
"第1級DOM"的優勢是可移植性好。DOM是一種適用于多種環境和多種應用程序設計語言的通用型API。
4.3應用這個JavaScript函數
我們來總結一下這個函數:
function showPic(whichpic){
? ? var source = whichpic.getAttribute("href");
? ? var placeholder = document.getElementById("placeholder");
? ? placeholder.setAttribute("src",source);
}
下面我們在圖片庫中使用它。我們將其保存為擴展名為showPic.js的文本文件。
我們把所有的圖片集中放在一個images子目錄里,把所有的JavaScript腳本文件集中放在一個子目錄srcipts里。
現在,我們需要在圖片庫文檔里插入一個鏈接來引用這個JavaScript腳本文件。我們將下面這行代碼插入到HTML文檔的</body>標簽之前:
<script type = "text/javascript" src = "scripts/showPic.js"></script>
此外,我們還需要為圖片列表的鏈接添加行為了,也就是事件處理函數(event handler),才能達成目標。
事件處理函數
事件處理函數的作用是,在特定事件發生時調用特定的JavaScript代碼。例如,想在鼠標指針懸停在某個元素上時觸發一個動作,就需要使用onmouseover事件處理函數;如果想在鼠標指針離開某個元素時觸發一個動作,就需要使用onmouseout事件處理函數。我們想在用于點擊某個鏈接時觸發一個動作,所以需要onclick事件處理函數。
showPic函數需要一個參數:一個帶有href屬性的元素節點參數。當我們把Onclick事件處理函數嵌入到一個鏈接時,需要把這個鏈接本身用作showPic函數的參數。
我們可以使用this關鍵字。大概意思就是"這個對象"。在這里,this就表示“這個<a>元素節點”:
showPic(this);
綜上所述,我們使用onclick事件處理函數來給鏈接添加行為。添加事件處理函數的語法如下所示:
event = "JavaScript statement(s)"請注意:JavaScript代碼包含在一對引號之間。我們可以把任意數量的JavaScript語句放在這對引號之間,只要把各語句用分號隔開就行。
? ? onclick()事件就可以調用showPic方法了:
????? ? onclick = "showPic(this);"
不過僅僅把事件處理函數放到一個圖片列表中,還會遇到一個問題:點擊鏈接時,不僅showPic函數會被調用,鏈接被點擊的默認行為也會被調用。這意味著用戶還是會被帶到圖片查看窗口。因此我們要阻止這個默認行為。
? ? 我們來了解一下,事件處理函數的工作機制。在給某個元素添加了事件處理函數后,一旦事件發生,相應的JavaScript代碼就會得到執行。被調用的JavaScript代碼可以返回一個值,這個值將被傳遞給事件處理函數。例如當我們給某個鏈接添加一個onclick事件處理函數,并讓這個處理函數所觸發的JavaScript代碼返回布爾值true或false。這樣一來,當這個鏈接被點擊時,如果那段JavaScript代碼返回的是true,onclick事件處理函數就認為“這個鏈接被點擊了”,就會跳轉。相反,如果返回的值是false,onclick事件處理函數就認為“這個鏈接沒有被點擊”,不會跳轉。
? ? 我們可以驗證一下,添加一行代碼:
? ? <a href = "https://www.baidu.com" onclick = "return false;">Click me</a>
當點擊這個鏈接時,因為onclick事件處理函數所觸發的JavaScript代碼返回給它的值是false,所以這個鏈接的默認行為沒有被觸發,就是不會跳轉到百度。
同樣,我們在onclick事件處理函數所觸發的JavaScript代碼里增加一條return false語句,就可以防止用戶被帶到目標鏈接窗口:
下面是完整的代碼:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"></meta><title> Image Gallery</title>
</head><body><h1>Snapshots</h1><ul><li><a href = "images/fireworks.jpg" onclick = "showPic(this);return false;" title = “ A fireworks display”>Fireworks</a></li><li><a href = "images/coffee.jpg" onclick = "showPic(this);return false;" title = “ A cup of black coffee”>Coffee</a></li><li><a href = "images/rose.jpg" onclick = "showPic(this);return false;" title = “ A red,red rose”>Rose</a></li><li><a href = "images/bigben.jpg" onclick = "showPic(this);return false;" title = “ The famous clock”>Big Ben</a></li><a href = "https://www.baidu.com"οnclick="return false;">Click me</a></ul><img id="placeholder" src="images/placeholder.gif" alt="my image gallery"/><script type="text/javascript" src="scripts/showPic.js"></script>
</body>
如:點擊Big Ben
4.4對這個函數進行擴展
在同一個網頁上切換顯示不同的文本。
圖片庫文檔里的每個圖片鏈接都有一個title屬性。可以把這個屬性取出來并讓它和相應的圖片一同顯示在網頁上。title屬性的值可以通過getAttribute輕而易舉的得到。
var text = whichpic.getAttribute(title);
下面是DOM提供的幾個新屬性:
childNodes屬性:在一個節點樹上,childNodes屬性可以用來獲取任何一個元素的所有子元素,它是一個包含這個元素全部子元素的數組:element.childNodes。
nodeType屬性:每個節點都有一個nodeType屬性。元素節點的nodeType屬性是1;屬性節點的nodeType屬性是2;文本節點的nodeType屬性是3;
nodeValue屬性:可以改變一個文本節點的值。
firstChild和lastChild屬性。
下面是我們的一個小實例:
Html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"></meta><title> Image Gallery</title><link rel="stylesheet" type="text/css" href="css/layout.css">
</head><body><h1>Snapshots</h1><ul><li><a href = "images/fireworks.jpg" onclick = "showPic(this);return false;"title = “ A fireworks display”>Fireworks</a></li><li><a href = "images/coffee.jpg" onclick = "showPic(this);return false;" title = “ A cup of black coffee”>Coffee</a></li><li><a href = "images/rose.jpg" onclick = "showPic(this);return false;" title = “ A red,red rose”>Rose</a></li><li><a href = "images/bigben.jpg" onclick = "showPic(this);return false;" title = “ The famous clock”>Big Ben</a></li><li><a href = "https://www.baidu.com" οnclick="return true;">Click me (baidu)</a></li></ul><img id="placeholder" src="images/placeholder.gif" alt="my image gallery"/><p id = "description">Choose an image. </p><script type="text/javascript" src="scripts/showPic.js"></script></body>
JavaScript:
function showPic(whichpic){var source = whichpic.getAttribute("href");var placeholder = document.getElementById("placeholder");placeholder.setAttribute("src",source);var text = whichpic.getAttribute("title");//當圖片庫頁面的某個圖片鏈接被點擊時,這個鏈接的title屬性值將被提取并保存到text變量中var description = document.getElementById("description");//得到id是"description"的<p>元素,并把它保存到變量description里;description.firstChild.nodeValue= text;//把description對象的第一個節點的nodeValue屬性值設置為變量text的值。alert(description.firstChild.nodeValue);}
function countBodyChildren(){var body_element = document.getElementsByTagName("body")[0];//alert(body_element.nodeType);
}window.onload = countBodyChildren;
CSS:
body{font-family:"Helvetica","Arial",serif;color:#333;background-color:#ccc;margin:1em 10%;
}
h1{color:#333;background-color:transparent;
}
a{color:#c60;background-color:transparent;font-weight:blod;text-decoration:none;
}
ul{padding:0;
}
li{float:left;padding:1em;list-style:none;
}
img{display:block;clear:both;
}
主要內容是:
1、如何利用DOM所提供的方法去編寫圖片庫腳本。
2、如何利用事件處理函數把JavaScript代碼與網頁集成在一起。