如鵬網學習筆記(十)DOM
DOM筆記
一、DOM簡介
Document Object Model 文檔對象模型
DOM的節點樹模型:整個文檔按照從大到小的節點劃分,每一個內容都算作一個節點
DOM API 編程接口 可以用來操作頁面的任意一部分內容
js+DOM編程的思想:由js基本語法控制程序的執行邏輯,由DOM API進行元素的查找獲取,進而再對元素進行增刪改等操作
學習DOM,除開學習設計思想外,更多的是學習DOM API的用法
二、document對象
document對象,
是Windows對象的一個屬性,
表示整個HTML頁面,是DOM的核心對象,
是連接JavaScript和DOM的橋梁,使得我們可以在JavaScript環境中操作頁面內容,
提供了查找獲取元素節點的方法,所以document是DOM的編程入口,
此外還提供了創建新節點的方法
三、document對象獲取對象的方法
1,getElementById(String) 返回 Element 根據元素的id屬性值獲取元素
2,getElementsByTagName(String) 返回 NodeList數組 根據元素的標簽名獲取元素
3,getElementsByName(String) 返回 NodeList數組 根據元素的name屬性值獲取元素
nodeList.length 包含的元素個數
nodeList.item(index) 獲取指定索引位置的元素
註意:NodeList是動態更新的,即如果刪除的元素也在NodeList裏面,那麽也同時從NodeList裏面刪除
四、document創建新元素的方法
document.creatElement(tagName) 根據元素標簽名稱創建元素節點
五、document添加新元素的方法
1,先創建要添加的元素
var element = document.createElement(tagName)
2,獲取要添加元素的節點
var element = document.getElementById(String)
3,使用元素的方法appendChild(node)方法進行添加
六、Element操作元素的屬性
有兩種方式操作元素的屬性
1,直接使用element.屬性名 :
var 變量名 = element.屬性名;//獲取屬性值
element.屬性名 = 屬性值; //給屬性賦值
註意:
a,因為class是關鍵字,所以操作class屬性時使用className代替
b,這種方式只能操作HTML標準規定的屬性,不能操作自定義屬性
c,在js中,操作checkbox、radio的checked屬性,select的selected屬性值時,使用true或FALSE,表單元素的disable屬性也是如此
2,另外三種操作屬性,且可操作自定義屬性
a,var 變量名 = getAttribute("屬性名"); 獲取屬性值
b,removeAttribute("屬性名"); 刪除指定屬性,沒有返回值
c,setAttribute("屬性名",“新屬性值”); 修改/添加屬性
七、Element操作元素的子節點
子節點包括子元素和元素文本內容
element.getElementsByTagName() 根據子元素的標簽名獲取其內部的子元素
element.innerHTML("要寫入的HTML語句"); 以字符串的形式在該子節點內部插入HTML語句
element.insertBefore(newNode,node); 在子節點內部,在指定子節點前插入新子節點
element.appendChild(newNode); 在最後追加子節點
element.removeChild(); 刪除指定的子節點
八、操作樣式屬性
兩種方式:
1, element.style CSSStyleDeclaration類型的對象
使用 element.style.屬性名 的方式可以直接操作某個樣式屬性。
如:element.style.backgroundColor="gray";
註意:CSS中樣式屬性使用“-”連接兩個單詞,js中使用後面的單詞首字母大寫的方式連接!!
2, element.className = "另一個className"; 效果:空字符串可以實現刪除,可以實現指向另一個類,病通過CSS控制效果的切換
九、DOM事件機制
當瀏覽器狀態改變、用戶操作時都會出發一些事件。如:點擊了一個按鈕,出發了按鈕點擊的時間,按鈕稱為事件源
當一個時間被觸發時,瀏覽器就會創建一個event事件對象,這個時間對象包含和此時間相關的 各種信息,如點擊時間的時間對象包含點擊文字的信息,可供編程者使用
如果希望當一個時間發生時針對這個時間做一些處理,就可以給該時間註冊一個事件處理函數,時間觸發時,該函數會被調用
常見的事件有以下幾類:
1,窗體事件
頁面加載完成事件
load 頁面加載完成時觸發(window對象為事件源)
<script type="text/javascript">
window.onload=function(){
//只有頁面加載完成,才可確保id為div01的元素被獲取到
var element = document.getElementById("div01");
alert(element);
}
</script>
註意:load是事件的名稱,onload是元素的屬性,用來給元素註冊事件處理函數
2,鼠標事件
1,
onclick、ondblclick 鼠標單擊、雙擊時觸發
示例代碼:
<script type="text/javascript">
window.onload=function(){
getElementById("div01").onclick=function(){
alert("點到我了");
}
getElementById("div02").ondblclick=function(){
alert("雙擊到了");
}
}
</script>
onmouseover、onmouseout 鼠標指針經過或者移出元素時觸發的事件
onmousemove 鼠標指針移動時觸發(進入元素後)
onmousedown、onmouseup 鼠標按鍵按下、彈起時觸發(進入元素後)
2,鼠標事件的event對象包含如下信息:
button 點擊的那個鼠標按鍵(0、1、2)
altKey、ctrlKey、shiftKey 點擊時是否同時按下鍵盤的alt、ctrl、或者shift按鍵
clientX、clientY 鼠標指針的窗口坐標
screenX、screenY 鼠標指針的屏幕坐標
示例代碼:
<script type="javascript">
window.onload=function(){
getElementById("div01").onmousedown=function(){
alert(event.button);//打印出當前事件中鼠標按下的是哪一個按鍵
alert(event.altKey+event.ctrlKey+event.shiftKey);//打印出當前事件中鼠標按下時是否按了相應的按鍵
}
}
</script>
3,鍵盤事件
4,焦點事件
5,頁面加載完成事件
onload 頁面加載完成時觸發(window對象為事件源)
示例代碼:
<script type="text/javascript">
window.onload=function(){
var element = document.getElementById("div01");
alert(element);
}
</script>
處理事件的兩種方式
1,通過DOM方式把時間處理函數賦值給事件屬性(稱為註冊事件處理函數)
示例代碼:
<script type="text/javascript">
window.onload=function(){
document.getElementById("div01").onclick=function(){
alert("這是註冊事件處理函數的方式");
}
}
</script>
2,直接在HTML元素標簽的事件屬性上寫要執行的代碼
示例代碼:
<div onclick="alert(‘這是直接在元素標簽的事件屬性上寫執行方法的方式‘);"></div>
第一種處理方式的優先級大於第二種!!!!!
註意:
如果有個自定義函數fun1,
按照第一種方式的寫法為 element.onclick=fun1;//註意是將fun1這個函數的對象(不能帶括號),賦值給onclick
按照第二種方式的寫法為 onclick=fun1();//在元素的標簽裏寫上函數的調用
十、this的用法
示例代碼:
<script type="javascript">
function(){
alert(this);
}
window.onload=function(){
var obj = {"fun1",fun1};
var btn = document.getElementById("btn");
btn.onclick=fun1;
window.fun1();//打印出window對象
obj.fun1();//打印出Object對象
btn.onclick();//打印出button對象
}
</script>
總結:如果this在函數fun1內,函數fun1以哪個對象的屬性值的身份去執行,this就表示哪個對象
其他情況如果不容易判斷的話就實際測試一下:
示例代碼:
<input type="button" onclick="alert(this)"/>//打印出button對象
<input type="button" onclick="fun1()"/>//打印出window對象
十一、給一個事件註冊多個事件處理函數
1,註冊事件處理函數的方式會覆蓋直接編寫處理代碼的方式,而且同時註冊的多個處理函數也會發生覆蓋,
這就導致一個事件發生時我們只能做“一件事情”
2,為了可以給一個事件註冊多個事件處理函數,DOM提供了另外一種註冊方式:
addEventListener("事件名稱",處理函數);
示例代碼:
<script type="javascript">
div.addEventListener("click",function(){
alert("第三種處理函數方式")
});
</script>
特點:不會發生覆蓋,可以同時註冊相同的事件
註意:多次註冊同一個函數,效果只有一次
3,刪除一個處理函數
如果希望將來可以刪除某個註冊的處理函數,就應該拿到該處理函數的引用。
removeEventListener(事件名稱, 處理函數);
示例代碼:
<script type="javascript">
var fun1=function(){
alert("第三種處理函數方式");
};
div.removeEventListener("click",fun1});
</script>
十二、事件冒泡
1,由於HTML元素可以嵌套,就不可避免的出現當用戶執行一個動作,如點擊時,會有多個元素觸發點擊事件。
為了方便管理,不至於混亂,DOM提供了事件冒泡機制。
事件冒泡:當若幹嵌套的元素“同時”被觸發某個事件時,最內層元素的事件最先被觸發,事件依次向外傳遞。
示例代碼:
<script type="javascript">
window.onload=function(){
var div01 = document.getElementById("div01");
var div02 = document.getElementById("div02");
var div03 = document.getElementById("div03");
div01.onclick=function(){
alert("div01");
}
div02.onclick=function(){
alert("div02");
}
div03.onclick=function(){
alert("div03");
div03.stopProgagation();//取消事件冒泡
}
//當點擊最裏面的div03時,外層的div02和div01都會觸發事件,這就是事件冒泡
}
</script>
2,如果某刻希望取消該事件的冒泡,可以使用event.stopProgagation();
十三、鍵盤事件
keydown 鍵盤按鍵被按下
keyup 鍵盤按鍵被彈起
event事件對象的屬性:
event.keyCode 被按下的按鍵的整數編碼
十四、取消某些事件的瀏覽器默認動作
對於某些元素的特點事件,瀏覽器會有一個默認的動作,如超鏈接觸發點擊事件時頁面會跳轉、表單提交事件被觸發時變淡數據會被提交到服務器、鍵盤按下在輸入框輸入字符等
DOM提供了兩種方式來取消瀏覽器的默認動作:
1,在我們自己註冊的處理函數中執行event.preventDefault();
2,return false;
註意:取消事件的瀏覽器默認動作和取消事件冒泡是不同的概念
十五、焦點事件
focus 元素獲得焦點
blur 元素失去焦點
十六、表單事件
select input(text)、textarea裏的文本被選中時觸發
change input(text)、textarea的值改變時觸發
submit 表單提交時觸發(真正把數據提交到服務器前觸發)
十七、獲得一個元素的坐標的寫法
<script type="javascript">
var x = div02.offsetLeft;
var y = div02.offsetTop;
var parent = div02.offsetParent;
while(parent){
x += parent.offsetLeft;
y += parent.offsetTop;
parent parent.offsetParent;
}
</script>
如鵬網學習筆記(十)DOM