文章目錄
- @[toc]
- 一、JavaScript的BOM
- 二、JavaScript計時
- 2.1 重溫Date對象
- 2.2 JavaScript計時函數
- 2.2.1 setInterval() 週期執行函數
- 2.2.2 clearInterval() 停止周期函數
- 2.2.3 setTimeout() 延遲執行函數
- 2.2.4 clearTimeout() 停止延時函數
- 2.3 JavaScript模擬鐘錶
- 三、JavaScript的DOM
- 四、DOM元素操作
文章目錄
- @[toc]
- 一、JavaScript的BOM
- 二、JavaScript計時
- 2.1 重溫Date對象
- 2.2 JavaScript計時函數
- 2.2.1 setInterval() 週期執行函數
- 2.2.2 clearInterval() 停止周期函數
- 2.2.3 setTimeout() 延遲執行函數
- 2.2.4 clearTimeout() 停止延時函數
- 2.3 JavaScript模擬鐘錶
- 三、JavaScript的DOM
- 四、DOM元素操作
一、JavaScript的BOM
1.1 瞭解BOM
瀏覽器對象模型 (BOM) 使 JavaScript 有能力與瀏覽器"對話"。
瀏覽器對象模型 (BOM):(Browser Object Model)尚無正式標準。
由於現代瀏覽器已經(幾乎)實現了 JavaScript 交互性方面的相同方法和屬性,因此常被認爲是 BOM 的方法和屬性。
1.2 window
所有瀏覽器都支持 window 對象。它表示瀏覽器窗口。
所有 JavaScript 全局對象、函數以及變量均自動成爲 window 對象的成員。
全局變量是 window 對象的屬性。
全局函數是 window 對象的方法。
甚至 HTML DOM 的 document 也是 window 對象的屬性之一:(兩者相同)
window.document.getElementById("header");
document.getElementById("header");
1.3 window尺寸
有三種方法能夠確定瀏覽器窗口的尺寸。
注意: 瀏覽器窗口的內部高度(不包括滾動條、菜單欄、工具欄)
適用於Internet Explorer、Chrome、Firefox、Opera 以及 Safari瀏覽器的window如下:
- window.innerHeight
- window.innerWidth
適用於Internet Explorer 8、7、6、5瀏覽器的window如下:
- document.documentElement.clientHeight
- document.documentElement.clientWidth
- 或者
- document.documentElement.clientHeight
- document.documentElement.clientWidth
JavaScript方案,適用於所有瀏覽器的window如下:
- var width = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
- var height = window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
<script type="text/javascript">
document.write(window.innerWidth + "*" + window.innerHeight + "<br />");
document.write(document.documentElement.clientWidth + "*" + document.documentElement.clientHeight + "<br />");
document.write(document.body.clientWidth + "*" + document.body.clientHeight + "<br />");
var width = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
var height = window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
document.write(width + "*" + height);
</script>
1.4 window方法(打開與關閉)
- 打開新窗口:window.open()
- 關閉當前窗口:window.close()
body>
<button onclick="newWindow()">百度搜索</button><br />
<button onclick="closeWindow()">關閉</button><br />
<script type="text/javascript">
var newWindows;
function newWindow() {
newWindows = window.open("https://www.baidu.com/","baidu");
}
function closeWindow() {
newWindows.close();
}
</script>
</body>
1.5 Screen(屏幕尺寸)
可用寬度:screen.availWidth 屬性返回訪問者屏幕的寬度,以像素計,減去界面特性,比如窗口任務欄。
可用高度:screen.availHeight 屬性返回訪問者屏幕的高度,以像素計,減去界面特性,比如窗口任務欄。
<script type="text/javascript">
document.write(screen.availWidth + "*" + screen.availHeight);
</script>
1.6 location
1.6.1 什麼是Location?
location 對象用於獲得當前頁面的地址 (URL),並把瀏覽器重定向到新的頁面。window.location 對象在編寫時可不使用 window 這個前綴。
1.6.2 location方法
名稱 | 描述 |
---|---|
location.href | 屬性返回當前頁面的 URL |
location.hostname | 返回 web 主機的域名 |
location.pathname | 返回當前頁面的路徑和文件名 |
location.port | 返回 web 主機的端口 (80 或 443) |
location.protocol | 返回所使用的 web 協議(http:// 或 https://) |
location.assign | 加載新的文檔 |
<body>
<button onclick="ass()">百度</button>
<script type="text/javascript">
//加載新文檔
function ass() {
location.assign("https://www.baidu.com/");
}
console.log(location.href);
console.log(location.hostname);
console.log(location.pathname);
console.log(location.port);
console.log(location.protocol);
</script>
</body>
1.7 history
1.7.1 什麼是history?
window.history 對象包含瀏覽器的歷史。
window.history 對象在編寫時可不使用 window 這個前綴。
爲了保護用戶隱私,對 JavaScript 訪問該對象的方法做出了限制。
1.7.2 history方法
名稱 | 描述 |
---|---|
history.back | 方法名描述 與在瀏覽器點擊後退按鈕相同 |
history.forward | 與在瀏覽器中點擊按鈕向前相同 |
以下兩個JSP點擊超鏈接後,可以使用前進、後退按鈕來實現功能!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>history</title>
</head>
<body>
<button onclick="f()">前進</button>
<a href="back.jsp">訪問頁面</a>
<script type="text/javascript">
function f() {
window.history.forward();
}
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>回退</title>
</head>
<body>
<button onclick="b()">回退</button>
<script type="text/javascript">
function b() {
window.history.back();
}
</script>
</body>
</html>
二、JavaScript計時
2.1 重溫Date對象
var date = new Date();
document.write(d);
document.write("<br/>")
document.write("年份:"+(date.getYear()+1900));
document.write("<br/>")
document.write("年份:"+date.getFullYear());
document.write("<br/>");
document.write("月份:"+(date.getMonth()+1))
document.write("<br/>");
document.write("日期:"+date.getDate());
document.write("<br/>");
document.write("小時:"+date.getHours());
document.write("<br/>");
document.write("分鐘:"+date.getMinutes());
document.write("<br/>");
document.write("秒:"+date.getSeconds());
2.2 JavaScript計時函數
2.2.1 setInterval() 週期執行函數
setInterval() 週期執行函數。間隔指定的毫秒數不停地執行指定的代碼。
//每三秒彈出一次Hello World!
setInterval(function(){alert("Hello World!")},3000);
2.2.2 clearInterval() 停止周期函數
clearInterval() 方法用於停止 setInterval() 方法執行的函數代碼。
var i = setInterval(function(){alert("Hello Wrold!")},3000);
//停止周期函數,每三秒彈出一次Hello World!
clearInterval(i);
2.2.3 setTimeout() 延遲執行函數
setTimeout() 延遲執行函數。延遲執行指定的函數,只能執行一次。
語法:window.setTimeout(“javascript 函數”,毫秒數);
- 第一個參數是含有 JavaScript 語句的字符串。這個語句可能諸如 “alert(‘5 seconds!’)”,或者對函數的調用,諸如 alertMsg()"
- 第二個參數指示從當前起多少毫秒後執行第一個參數
//等待3秒後僅彈出一次Hello World!的窗口
setTimeout(function(){alert("啊哈哈哈!")},2000);
//使用延遲函數實現周期函數效果
<script type="text/javascript">
var num = 0;
var id = 0;
function show() {
document.write("我是id" + id + "<br />");
num++;
if (num != 20) {
id = setTimeout(show, 1000);
}
}
id = setTimeout(show, 1000);
</script>
2.2.4 clearTimeout() 停止延時函數
clearTimeout() 方法用於停止執行setTimeout()方法的函數代碼。
<button onclick="c()">停止</button>
<script type="text/javascript">
//設置延遲彈窗2秒後執行一次
var s = setTimeout(function () {
alert("啊哈哈哈!")
}, 2000);
//停止延遲函數
function c() {
clearTimeout(s);
}
</script>
2.3 JavaScript模擬鐘錶
2.3.1 模擬鐘錶(BOM)
<button onclick="stop()">停止</button>
<button onclick="go()">繼續</button>
<script type="text/javascript">
function times() {
//刷新當前文檔,類似於你瀏覽器上的刷新頁面按鈕。
location.reload();
}
//顯示日期事件
var date = new Date();
document.write(date.getFullYear() + "-" + date.getMonth() + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds());
//每過1秒刷新一次時間(刷新)
var s = setInterval(times, 1000);
//繼續計時
function go() {
s = setInterval(times, 1000);
}
//停止計時
function stop() {
clearInterval(s);
}
</script>
2.3.2 模擬鐘錶(DOM)
var myVar = setInterval(function(){myTimer()},1000);
function myTimer()
{
var d = new Date();
var t = d.toLocaleTimeString();
document.getElementById("demo").innerHTML=t;
}
<p id="demo"></p>
<button onclick = "myStopFunction()">Stop time</button>
<script>
var myVar = setInterval(function(){myTimer()},1000);
function myTimer()
{
var d = new Date();
var t = d.toLocaleTimeString();
document.getElementById("demo").innerHTML=t;
}
function myStopFunction()
{
clearInterval(myVar);
}
</script>
三、JavaScript的DOM
3.1 什麼是DOM?
通過 HTML DOM,使用 JavaScript訪問 HTML 文檔的所有元素。
當網頁被加載時,瀏覽器會創建頁面的文檔對象模型(Document Object Model)。
3.2 MOD模型分類
HTML DMO模型
定義了訪問和操作 HTML 文檔的標準方法。DOM 將 HTML 文檔表達爲樹結構。
- 在HTML當中,一切都是節點
- 元素節點:HMTL標籤。
- 文本節點:標籤中的文字(比如標籤之間的空格、換行)
- 屬性節點:標籤的屬性。
- 各節點關係體現爲: 父子關係\兄弟關係
- 通過可編程的對象模型,JavaScript 獲得了足夠的能力來創建動態的 HTML。
- JavaScript 能夠改變頁面中的所有 HTML 元素。
- JavaScript 能夠改變頁面中的所有 HTML 屬性。
- JavaScript 能夠改變頁面中的所有 CSS 樣式。
- JavaScript 能夠對頁面中的所有事件做出反應。
XML DOM文檔對象模型
定義訪問和操作XML文檔的標準方法。DOM 將 XML 文檔作爲一個樹形結構,而樹葉被定義爲節點。
XML格式
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student id="1">
<name>張三</name>
<age>18</age>
</student>
<student id="2">
<name>李四</name>
<age>19</age>
</student>
</students>
3.3 DOM對象
HTML DOM對象
對象 | 描述 |
---|---|
Document(文檔對象) | 每個載入瀏覽器的 HTML 文檔都會成爲 Document 對象。Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。 |
Element(元素對象) | 在 HTML DOM 中,Element 對象表示 HTML 元素。Element 對象可以擁有類型爲元素節點、文本節點、註釋節點的子節點。NodeList 對象表示節點列表,比如 HTML 元素的子節點集合。元素也可以擁有屬性。屬性是屬性節點。 |
Attribute(節點對象) | 在 HTML DOM 中,Attr 對象表示 HTML 屬性。HTML 屬性始終屬於 HTML 元素。 |
Event(事件對象) | Event 對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。 |
3.3.1 Document文檔對象
Document對象所有屬性
屬性 | 描述 |
---|---|
body | 提供對 元素的直接訪問。對於定義了框架集的文檔,該屬性引用最外層的 。 |
cookie | 設置或返回與當前文檔有關的所有 cookie。 |
domain | 返回當前文檔的域名。 |
lastModified | 返回文檔被最後修改的日期和時間。 |
referrer | 返回載入當前文檔的文檔的 URL。 |
title | 返回當前文檔的標題。 |
URL | 返回當前文檔的 URL。 |
Document對象常用方法
方法 | 描述 |
---|---|
close() | 關閉用 document.open() 方法打開的輸出流,並顯示選定的數據。 |
getElementById() | 返回對擁有指定 id 的第一個對象的引用。 |
getElementsByName() | 返回帶有指定名稱的對象集合。 |
getElementsByTagName() | 返回帶有指定標籤名的對象集合。 |
open() | 打開一個流,以收集來自任何 document.write() 或 document.writeln() 方法的輸出。 |
write() | 向文檔寫 HTML 表達式 或 JavaScript 代碼。 |
writeln() | 等同於 write() 方法,不同的是在每個表達式之後寫一個換行符。 |
createAttribute() | 創建屬性對象 |
createElement() | 創建元素對象 |
createTextNode() | 創建文本對象 |
3.3.2 Element元素對象
Element元素對象常用屬性和方法
屬性/方法 | 描述 |
---|---|
element.appendChild() | 向元素添加新的子節點,作爲最後一個子節點。 |
element.attributes | 返回元素屬性的 NamedNodeMap。 |
element.childNodes | 返回元素子節點的 NodeList。 |
element.parentNode | 返回元素的父節點。 |
element.className | 設置或返回元素的 class 屬性。 |
element.clientHeight | 返回元素的可見高度。 |
element.clientWidth | 返回元素的可見寬度。 |
element.firstChild | 返回元素的首個子節點。 |
element.lastChild | 返回元素的最後一個子元素。 |
element.removeChild() | 從元素中移除子節點。 |
element.replaceChild() | 替換元素中的子節點。 |
element.getAttribute() | 返回元素節點的指定屬性值。 |
element.getAttributeNode() | 返回指定的屬性節點。 |
element.removeAttribute() | 從元素中移除指定屬性。 |
element.removeAttributeNode() | 移除指定的屬性節點,並返回被移除的節點。 |
element.getElementsByTagName() | 返回擁有指定標籤名的所有子元素的集合。 |
element.id | 設置或返回元素的 id。 |
element.innerHTML | 設置或返回元素的內容。 |
element.nodeName | 返回元素的名稱。 |
element.nodeType | 返回元素的節點類型。 |
element.nodeValue | 設置或返回元素值。 |
element.setAttribute() | 把指定屬性設置或更改爲指定值。 |
element.setAttributeNode() | 設置或更改指定屬性節點。 |
element.style | 設置或返回元素的 style 屬性。 |
nodelist.item() | 返回 NodeList 中位於指定下標的節點。 |
nodelist.length | 返回 NodeList 中的節點數。 |
3.4 DOM中的節點屬性
在文檔對象模型 (DOM) 中,每個節點都是一個對象。DOM 節點有三個重要的屬性
3.4.1 nodeName節點的名稱
nodeName 屬性:節點的名稱,是隻讀的。
- 元素節點的 nodeName 與標籤名相同
- 屬性節點的 nodeName 是屬性的名稱
- 文本節點的 nodeName 永遠是 #text
//元素節點的 nodeName 與標籤名相同
document.write(document.body.nodeName)
//屬性節點的 nodeName 是屬性的名稱
document.write(document.body.attributes[0].nodeName)
//文本節點的 nodeName 永遠是 #text
document.write(document.getElementById("demo").childNodes[0].nodeName)
3.4.2 nodeValue節點的值
nodeValue 屬性:節點的值
- 元素節點的 nodeValue 是 undefined 或 null
- 文本節點的 nodeValue 是文本自身
- 屬性節點的 nodeValue 是屬性的值
//元素節點的 nodeValue 是 undefined 或 null
document.write(document.head.nodeValue)
//文本節點的 nodeValue 是文本自身
document.write(document.getElementById("demo").childNodes[0].nodeValue)
//屬性節點的 nodeValue 是屬性的值
document.write(document.getElementById("demo").attributes[0].nodeValue)
3.4.3 nodeType節點的類型
nodeType 屬性:節點的類型,是隻讀的。以下常用的幾種結點類型:
元素類型 | 節點類型 |
---|---|
元素 | 1 |
屬性 | 2 |
文本 | 3 |
註釋 | 8 |
文檔 | 9 |
3.4.4 創建節點對象
創建節點的方法都是由XML DOM中的Document對象來創建的,調用方式爲
document.方法
。
方法 | 名稱 |
---|---|
createComment() | 創建註釋節點 |
createElement() | 創建元素節點 |
createTextNode() | 創建文本節點 |
3.5 常用屬性和方法
3.5.1 獲取父節點
調用者就是節點。一個節點只有一個父節點,調用方式爲
節點.parentNode
//獲得 body 的父元素
var parentNode = document.body.parentNode;
3.5.2 獲取所有的子節點
childNodes:標準屬性。返回的是指定元素的子節點的集合(包括元素節點、所有屬性、文本節點)。調用方法爲
子節點數組 = 父節點.childNodes;
注意: 火狐 谷歌等高版本會把換行也看做是子節點。(瞭解)
//獲取body所有的子節點的集合
var nodeList = document.body.childNodes;
3.5.3 獲取元素屬性的集合
獲取元素屬性集合調用方法爲
節點.attributes
//獲取body元素集合中的長度
var len = document.body.attributes.length;
//獲取body元素集合
var list = document.body.attributes;
3.5.4 節點的獲取遍歷
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>DOM</title>
<script type="text/javascript">
function getNodes() {
var nodes = document.body.childNodes;
var txt = "";
for (var i = 0; i < nodes.length; i++) {
txt = txt + nodes[i].nodeName + ":" + nodes[i].nodeValue;
}
var length = nodes.length;
console.log("節點個數爲:" + length);
console.log(txt);
}
</script>
</head>
<body>
<button onclick="getNodes()">單擊獲取節點集合</button><br />
<p id="demo">注意:空格的換行也算是文本,文本也是一個節點!</p>
</body>
</html>
3.6 全選/反選按鈕案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo4</title>
<script>
/**
* 全選/全不選
*/
function selectAll() {
//通過class="hobby"獲取所有選項(數組)
var hobby = document.getElementsByClassName("hobby");
//通過id="all"獲取全選/全不選選項
var all = document.getElementById("all");
//遍歷hobby數組
for (var i = 0; i < hobby.length; i++) {
//將class="hobby"的所有選項的選中狀態與all關聯
hobby[i].checked = all.checked;
}
}
/**
* 全選
*
* checked設置返回是否被選中
* checked = true; 選中
* checked = false; 未選中
*/
function fn1() {
var hobby = document.getElementsByClassName("hobby");
for (var i = 0; i < hobby.length; i++) {
//判斷如果全部選項沒有被選中則繼續執行全選操作
if (!hobby[i].checked) {
//將所有選項狀態變爲選中狀態
hobby[i].checked = true;
}
}
}
/**
* 全不選
*/
function fn2() {
var hobby = document.getElementsByClassName("hobby");
for (var i = 0; i < hobby.length; i++) {
//判斷如果全部選項被選中則繼續全部選操作
if (hobby[i].checked) {
//將所有選項狀態變爲未選中
hobby[i].checked = false;
}
}
}
/**
* 反選
*/
function fn3() {
var hobby = document.getElementsByClassName("hobby");
for (var i = 0; i < hobby.length; i++) {
//獲取選項的選中狀態
var oldChecked = hobby[i].checked;
//把獲取選中的選中狀態取反
var newChecked = !oldChecked;
hobby[i].checked = newChecked;
}
}
</script>
</head>
<body>
<input type="checkbox" onchange="selectAll()" id="all">全選/全不選<br>
<br>
<input type="checkbox" class="hobby">籃球
<input type="checkbox" class="hobby">足球
<input type="checkbox" class="hobby">乒乓球
<input type="checkbox" class="hobby">羽毛球
<br>
<br>
<button onclick="fn1()">全選</button>
<button onclick="fn2()">全不選</button>
<button onclick="fn3()">反選</button>
</body>
</html>
四、DOM元素操作
4.1 獲取HTML元素
通常,通過 JavaScript,您需要操作 HTML 元素。爲了做到這件事情,您必須首先找到該元素。有三種方法來做這件事:
- 通過 id 找到 HTML 元素
- 通過標籤名找到 HTML 元素
- 通過類名找到HTML 元素
4.1.1 id查找HTML元素
在 DOM 中查找 HTML 元素的最簡單的方法,是通過使用元素的 id。
通過id=“div1”查找元素。如果找到該元素,則該方法將以對象(在 x 中)的形式返回該元素。如果未找到該元素,則 x 將包含 null。
//通過id=“div1”查找元素
var x = document.getElementById("div1");
4.1.2 標籤名查找HTML元素
查找id="main"的元素。通過查找到的id="main"的元素中,查找所有元素的<p>標籤元素
var x = document.getElementById("main");
var y = x.getElementsByTagName("p");
4.1.3 類名查找HTML元素
查找class="div"的元素。通過getElementsByClassName 函數來查找 class=“div” 的元素
var x = document.getElementsByClassName("div");
4.1.4 innerText與innerHTML的區別
innerText:獲取標籤的所有文本內容,但凡是文本內容就會獲取到,也會被打印
innerHTML:獲取標籤的文本內容,如果文本內容裏含有頁面標籤字符串,innerHTML會解析頁面標籤字符串,則頁面標籤字符串被解析而不會被獲取到,也不會被打印
//注意:b標籤被innerHTML解析
"<b>我是被innerText獲取</b>" //結果爲:<b>我是被innerText獲取</b>
"<b>我是被innerHTML獲取</b>" //結果爲:我是被innerHTML獲取
4.1.5 獲取HTML元素的使用
<body>
<div id="div_id" class="div_class">
我是div
</div>
<p>我是1號p標籤</p>
<p class="pp">我是2號p標籤</p>
<p>我是3號p標籤</p>
<p class="pp">我是4號p標籤</p>
<p>我是5號p標籤</p>
<p class="pp">我是6號p標籤</p>
<script type="text/javascript">
//獲取div標籤爲div_id的標籤文本
var d = document.getElementById("div_id");
console.log(d.innerText);
//獲取多個標籤中第一個標籤文本
var ps = document.getElementsByTagName("p");
console.log(ps[0].innerText);
//獲取標籤數量
console.log(ps.length);
//獲取第一個p標籤文本
console.log(ps[0].innerText);
//獲取多個class爲pp的其中第一個標籤文本
var pps = document.getElementsByClassName("pp");
console.log(pps[0].innerText);
</script>
</body>
4.1.6 獲取設置移除屬性案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>DOM</title>
<%--
需求1:獲取輸入框中的name屬性值
需求2:設置輸入框中的name屬性值
需求3:移除輸入框中的name屬性
--%>
<script>
function fn1() {
//獲取輸入框中的name屬性值
var ele = document.getElementById("username");
var value = ele.getAttribute("name");
console.log(value)
}
function fn2() {
//設置輸入框中的name屬性值
var ele = document.getElementById("username");
ele.setAttribute("name","myUsername");
}
function fn3() {
// 移除輸入框中的name屬性
var ele = document.getElementById("username");
ele.removeAttribute("name");
}
function fn4() {
var ele = document.getElementById("username");
//注意:通過getAttribute獲取屬性值,該屬性值必須顯式地設置到標籤上!
var value = ele.getAttribute("value");
console.log(value)
}
</script>
</head>
<body>
<input type="text" name="username" id="username" value="zhangsan"/>
<button onclick="fn1()">獲取</button>
<button onclick="fn2()">設置</button>
<button onclick="fn3()">移除</button>
<button onclick="fn4()">獲取value屬性</button>
</body>
</html>
4.2 修改HTML
HTML DOM 允許 JavaScript 改變 HTML 元素的內容。
4.2.1 改變HTML文本
修改 HTML 文本的最簡單的方法時使用 innerHTML 屬性。
如需改變 HTML 元素的內容,請使用這個語法:
- document.getElementById(id).innerHTML=“xxxx”;
- document.getElementById(id).innerText=“xxxx”;
<html>
<body>
<p id="p1">Hello World!</p>
<script>
//改變了<p>元素的文本
document.getElementById("p1").innerHTML="xxxx";
</script>
</body>
</html>
4.2.2 改變HTML屬性
如需改變 HTML 元素的屬性,請使用這個語法:
- document.getElementById(id).attribute=新屬性值
- document.getElementById(“image”).setAttribute(“屬性”,“值”);
<!DOCTYPE html>
<html>
<body>
<img id="image" src="hello.png">
<script>
//改變<img>元素的src屬性
document.getElementById("image").src="world.jpg";
</script>
</body>
</html>
4.3 修改CSS樣式
如需改變 HTML 元素的樣式,請使用這個語法:
- document.getElementById(id).style.property=新樣式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p id="p1">Hello World!</p>
<p id="p2">Hello World!</p>
<script>
//修改<p>元素的樣式
document.getElementById("p2").style.color="blue";
document.getElementById("p2").style.fontFamily="Arial";
document.getElementById("p2").style.fontSize="larger";
</script>
<p>以上段落通過腳本修改</p>
</body>
</html>
4.4 元素標籤的 CRUD
4.4.1 創建新元素
如需向 HTML DOM 添加新元素,您必須首先創建該元素(元素節點),然後向一個已存在的元素追加該元素。
這段代碼創建新的<p> 元素:
var para=document.createElement("p");
。如需向 <p> 元素添加文本,您必須首先創建文本節點。這段代碼創建了一個文本節點:var node=document.createTextNode("這是一個新段落。");
。然後必須向元素追加這個文本節點:
para.appendChild(node);
。最後必須向一個已有的元素追加這個新元素。這段代碼找到一個已有的元素:var element=document.getElementById("div1");
。以下代碼在已存在的元素後添加新元素:element.appendChild(para);
。
<div id="div1">
<p id="p1">這是一個段落。</p>
<p id="p2">這是另一個段落。</p>
</div>
<script>
//創建p元素節點
var para = document.createElement("p");
//創建文本節點
var node = document.createTextNode("這是一個新段落。");
//向p元素中添加文本
para.appendChild(node);
//通過id=”div1“獲取元素
var element = document.getElementById("div1");
//向該元素中添加p元素
element.appendChild(para);
</script>
insertBefore(元素 1,元素 2)
在父元素添加,將元素1插入到元素2的前面,調用語法爲
父元素.insertBefore(元素 1,元素 2)
</head>
<body>
<div id="div1">
<p id="p1">這是一個段落。</p>
<p id="p2">這是另一個段落。</p>
</div>
<script>
//需求:在 div1 裏面,插入 para 到p1 的前面
//獲取p元素節點
var para = document.createElement("p");
//創建文本節點
var node = document.createTextNode("這是一個新段落。");
//向元素中添加文本
para.appendChild(node);
//通過id="p1"來獲取元素
var p1 = document.getElementById("p1");
//通過id="div1"來獲取元素
var element = document.getElementById("div1");
//通過調用insertBefore方法來實現在div1裏面,插入para到p1前面
element.insertBefore(para,p1);
</script>
</body>
4.4.2 刪除已有的 HTML 元素
remove()
在頁面內(文檔)刪除已有HTML元素,調用語法爲
document.想要刪除的元素.remove();
</head>
<body>
<div id="div1">
<p id="p1">這是一個段落。</p>
<p id="p2">這是另一個段落。</p>
</div>
<button onclick="deletes()">刪除p1</button>
<script>
function deletes(){
document.getElementById("p1").remove();
}
</script>
</body>
removeChild()
通過父元素來刪除子元素,調用語法爲
父元素.removeChild(子元素)
找到 id=“div1” 的元素:
var parent = document.getElementById("div1");
。找到 id=“p1” 的 <p> 元素:var child = document.getElementById("p1");
。從父元素中刪除子元素:parent.removeChild(child);
。如果能夠在不引用父元素的情況下刪除某個元素,就太好了。不過很遺憾。DOM 需要清楚您需要刪除的元素,以及它的父元素。這是常用的解決方案:找到您希望刪除的子元素,然後使用其 parentNode 屬性來找到父元素:var child=document.getElementById("p1");
child.parentNode.removeChild(child);
<div id="div1">
<p id="p1">這是一個段落。</p>
<p id="p2">這是另一個段落。</p>
</div>
<script>
//通過id="div1"獲取元素
var parent = document.getElementById("div1");
//通過id="p1"獲取id="div1"的子元素
var child = document.getElementById("p1");
//刪除子元素
parent.removeChild(child);
</script>
4.4.3 替換元素
replaceChild(元素 1,元素 2);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body onload="" id="h">
<div id="div1">
<p id="p1">這是一個段落。</p>
<p id="p2">這是另一個段落。</p>
</div>
<button type="button" id="btn" onclick="deletes()"> 刪除 p1</button>
<script>
function deletes(){
var para=document.createElement("p");
var node=document.createTextNode("這是一個新段落。");
para.appendChild(node);
var p1 = document.getElementById("p1");
var element=document.getElementById("div1");
element.replaceChild(para,p1);
}
</script>
</body>
</html>
4.5 DOM事件
4.5.1 DOM事件介紹
HTML DOM 允許我們通過觸發事件來執行代碼。
比如以下事件:
元素被點擊。
頁面加載完成。
輸入框被修改。
本例改變了 id=“id1” 的 HTML 元素的樣式,當用戶點擊按鈕時:
注意:點擊後會將原來的標籤顏色變爲紅色!
<!DOCTYPE html>
<html>
<body>
<h1 id="id1">myH1</h1>
<button type="button"
onclick="document.getElementById('id1').style.color='red'">
button</button>
</body>
</html>
4.5.2 DOM事件改變文本內容
當在 <h1> 元素上點擊時,會改變其內容:
<!DOCTYPE html>
<html>
<body>
<h1 onclick="this.innerHTML='改變內容!'">點擊文本!</h1>
</body>
</html>
本例從事件處理器調用一個函數:
<!DOCTYPE html>
<html>
<head>
<script>
function changetext(id)
{
id.innerHTML="改變內容!";
}
</script>
</head>
<body>
<h1 onclick="changetext(this)">點擊文本!</h1>
</body>
</html>
HTML DOM 允許您使用 JavaScript 來向 HTML 元素分配事件:
<script>
document.getElementById("myBtn").onclick=function(){
document.getElementById("myhead2").style.color='blue';
};
</script>
onchange 事件常結合對輸入字段的驗證來使用。
下面是一個如何使用 onchange 的例子。當用戶改變輸入字段的內容時,會調用 upperCase() 函數。
<input type="text" id="fname" onchange="upperCase()">
onmouseover 和 onmouseout 事件可用於在用戶的鼠標移至 HTML 元素上方或移出元素時觸發函數。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color:#D94A38;width:120px;height:20px;padding:40px;">Mouse Over Me</div>
<script>
function mOver(obj){
obj.innerHTML="Thank You"
}
function mOut(obj){
obj.innerHTML="Mouse Over Me"
}
</script>
</body>
</html>
4.6EventListener
4.6.1 addEventListener() 方法
在用戶點擊按鈕時觸發監聽事件:
document.getElementById("myBtn").addEventListener("click", displayDate);
addEventListener() 方法用於向指定元素添加事件句柄。
addEventListener() 方法添加的事件句柄不會覆蓋已存在的事件句柄。
你可以向一個元素添加多個事件句柄。
你可以向同個元素添加多個同類型的事件句柄,如:兩個 “click” 事件。
你可以向任何 DOM 對象添加事件監聽,不僅僅是 HTML 元素。如: window 對象。
addEventListener() 方法可以更簡單的控制事件(冒泡與捕獲)。
當你使用 addEventListener() 方法時, JavaScript 從 HTML 標記中分離開來,可讀性更強, 在沒有控制HTML標記時也可以添加事件監聽。
你可以使用 removeEventListener() 方法來移除事件的監聽。
語法:
- 第一個參數是事件的類型 (如 “click” 或 “mousedown”). 把on去掉
- 第二個參數是事件觸發後調用的函數。
- 第三個參數是個布爾值用於描述事件是冒泡還是捕獲。該參數是可選的。
注意:不要使用 “on” 前綴。 例如,使用 “click” ,而不是使用 “onclick”。
element.addEventListener(event, function, useCapture);
當用戶點擊元素時彈出 “Hello World!” :
element.addEventListener("click", myFunction);
function myFunction() {
alert ("Hello World!");
}
addEventListener() 方法允許向同個元素添加多個事件,且不會覆蓋已存在的事件:
element.addEventListener("click", myFunction);
element.addEventListener("click", mySecondFunction);
4.6.2 事件冒泡或事件捕獲
事件傳遞有兩種方式:冒泡與捕獲。
事件傳遞定義了元素事件觸發的順序。 如果你將 <p> 元素插入到 <div> 元素中,用戶點擊 <p> 元素, 哪個元素的 “click” 事件先被觸發呢?
在 冒泡 中,內部元素的事件會先被觸發,然後再觸發外部元素,即: <p> 元素的點擊事件先觸發,然後會觸發 <div> 元素的點擊事件。
在 捕獲 中,外部元素的事件會先被觸發,然後纔會觸發內部元素的事件,即: <div> 元素的點擊事件先觸發 ,然後再觸發 <p> 元素的點擊事件。
addEventListener() 方法可以指定 “useCapture” 參數來設置傳遞類型:
addEventListener(event, function, useCapture);
默認值爲 false, 即冒泡傳遞,當值爲 true 時, 事件使用捕獲傳遞。
document.getElementById("myDiv").addEventListener("click", myFunction, true);
removeEventListener() 方法移除由 addEventListener() 方法添加的事件句柄:
element.removeEventListener("mousemove", myFunction);