JavaScript學習筆記(五)

慕課網JavaScript進階篇第9章學習筆記

JavaScript進階篇—第9章

JavaScript學習筆記(一)
JavaScript學習筆記(二)
JavaScript學習筆記(三)
JavaScript學習筆記(四)


DOM

文檔對象模型DOM(Document Object Model)定義訪問和處理HTML文檔的標準方法。DOM 將HTML文檔呈現為帶有元素、屬性和文本的樹結構(節點樹)。
DOM節點層次圖:

來源:[慕課網](http://www.imooc.com/code/1575)

HTML文檔可以說是由節點構成的集合,DOM節點有:

  • 元素節點:上圖中<html><body><p>等都是元素節點,即標簽
  • 文本節點:向用戶展示的內容
  • 屬性節點:元素屬性,如<a>標簽的鏈接屬性

節點屬性:

方法 說明
nodeName 返回一個字符串,其內容是給定節點的名字
nodeType 返回一個整數,這個數值代表給定節點的類型
nodeValue 返回給定節點的當前值

遍歷節點樹:

方法 說明
childNodes 返回一個數組,該數組由給定元素節點的子節點構成
firstChild 返回第一個子節點
lastChild 返回最后一個子節點
parentNode 返回一個給定節點的父節點
nextSibling 返回給定節點的下一個子節點
previousSibling 返回給定節點的上一個子節點

DOM操作:

方法 說明(前兩個是document方法)
createElement(element) 創建一個新的元素節點
createTextNode() 創建一個包含著給定文本的新文本節點
appendChild() 指定節點的最后一個子節點列表之后添加一個新的子節點
insertBefore() 將一個給定節點插入到一個給定元素節點的給定子節點的前面
removeChild() 從一個給定元素中刪除一個子節點
replaceChild() 把一個給定父元素里的一個子節點替換為另一個節點
  <h2 id="con">I love JavaScript</H2>
  <p> JavaScript使網頁顯示動態效果并實現與用戶交互功能。</p>
  <script type="text/javascript">
    var test = document.getElementById("con"); 
    test.style.color = "red";
    test.style.backgroundColor = "#CCC";
    test.style.display = "none";
  </script>

getElementByName()&getElementsByTagName()

getElementByName(),返回帶有指定名稱的節點對象的集合(數組,和數組類似有length)
語法: document.getElementByName(name);

getElementsByTagName,返回帶有指定標簽名的節點對象的集合(數組),返回元素的順序是它們在文檔中的順序
語法: document.getElementsByTagName(標簽名)

示例部分代碼:可看完整示例

<script type="text/javascript">
    function checkall(){
        var hobby = document.getElementsByTagName("input");
        for (var i=0; i<hobby.length; i++){
            if(hobby[i].type == "checkbox"){
                hobby[i].checked = true;
            }
        } 
    }
    function clearall(){
        var hobby = document.getElementsByName("hobby");
        for (var j=0; j<hobby.length; j++){ 
            hobby[j].checked = false;    
        }       
    }
    
    function checkone(){
        var j=document.getElementById("wb").value;
        var hobby = document.getElementsByTagName("input");
        if(j>=1&&j<=6){
            hobby[j-1].checked = true;    
        }else{
            alert("請輸入1——6之間的數字");
        }       
    }

</script>

getAttribute()&setAttribute()

getAttribute(),通過元素節點的屬性名稱獲取屬性的值
語法: elementNode.getAttribute(name)

  1. elementNode:使用getElementById()、getElementsByTagName()等方法,獲取到的元素節點
  2. name:要想查詢的元素節點的屬性名字

示例:

<p id="intro">課程列表</p>  
    <ul>  
        <li title1="第1個li">HTML</li>  
        <li>CSS</li>  
        <li title="第3個li">JavaScript</li>  
        <li title="第4個li">Jquery</li>  
        <li>Html5</li>  
    </ul>  
<p>以下為獲取的不為空的li標簽title值:</p>
<script type="text/javascript">
    var con=document.getElementsByTagName("li");
    for (var i=0; i< con.length;i++){
      var text = con[i].getAttribute("title");//text獲取的是title的key值
      var text1 = con[i].title;//text1獲取的是title本身
      //if(text!=null)
        document.write(text+"<br>");
    } 
</script> 

text結果:

第1個li
null
第3個li
第4個li
null
//如果第二個li為'<li title = "">',會顯示空行

text1結果:

第1個li

第3個li
第4個li
//這里還有個空行

setAttribute(),增加一個指定名稱和值得新屬性,或者把一個現有的屬性設定為指定的值
語法: elementNode.setAttribute(name, value)

  • name:要設置的屬性名; value:要設置的屬性值
  • 把指定屬性設置為指定值,若屬性不存在,將創建一個新屬性

示例:

<ul>  
    <li title="JS">JavaScript</li>  
    <li title="JQ">JQuery</li>  
    <li title="">HTML/CSS</li>  
    <li title="JAVA">JAVA</li>  
    <li title="">PHP</li>  
  </ul>  
  <p>以下為li列表title的值,當title為空時,新設置值為"WEB前端技術":</p>
<script type="text/javascript">
  var Lists=document.getElementsByTagName("li");
  
  for (var i=0; i<Lists.length;i++){
    //document.write(Lists[i].innerHTML+"<br>")
    var text = Lists[i].getAttribute("title");
    if(text != "")
    document.write(text +"<br>");//這樣會避免為原來title=""賦CSS后出現的空行問題
    else{
    Lists[i].setAttribute("title", "CSS");
    document.write(Lists[i].getAttribute("title")+"<br>");
    }
  }
</script>

節點屬性

在DOM中,每個節點都是一個對象。DOM節點有三個重要的屬性:

  • nodeName:節點的名稱,只讀
    • 元素節點的nodeName與標簽名相同
    • 屬性節點的nodeName是屬性的名稱
    • 文本節點的nodeName永遠是#text
    • 文檔節點的nodeName永遠是#document
  • nodeValue:節點的值
    • 元素節點的nodeValue是undefined或null
    • 文本節點的nodeValue是文本自身
    • 屬性節點的nodeValue是屬性的值
  • nodeType:節點類型,只讀
    • 元素:節點類型為 1
    • 屬性:節點類型為 2
    • 文本:節點類型為 3
    • 注釋:節點類型為 8
    • 文檔:節點類型為 9

訪問子節點childNodes

訪問選定元素節點下的所有子節點的列表,返回的值可以看作是一個數組,具有length屬性
語法: elementNode.childNodes
如果選定的節點沒有子節點,則該屬性返回不包含節點的Nodelist

示例1:

<ul>
  <li>javascript</li>
  <li>jQuery</li>
  <li>PHP</li>
</ul>
<script type = "text/javascript">
  var x = document.getElementsByTagName("ul")[0].childNodes;//加[0]代表僅選擇第一個出現的<ul>
  document.write("UL子節點個數:" + x.length + ";");
  document.write("節點類型:" + x[0].nodeType);
</script>

運行結果IE: UL子節點個數:3;節點類型:1
其他瀏覽器: UL子節點個數:7;節點類型:3
空白節點(文本節點):

<ul>空白節點
  <li>javascript</li>空白節點
  <li>jQuery</li>空白節點
  <li>PHP</li>空白節點
</ul>

示例2:

<div>
  javascript  
  <p>javascript</p>
  <div>jQuery</div>
  <h5>PHP</h5>
</div>
<script type="text/javascript">
 var x=document.getElementsByTagName("div")[0].childNodes;
 for(var i=0;i<x.length;i++)
 {
    document.write("第"+(i+1)+"個節點"+"<br/>"+"節點名:"+node[i].nodeName+"<br/>"+"節點類型:"+node[i].nodeType+"<br/>"+"節點值:"+node[i].nodeValue+"<br/>"+"<br/>")
 }
</script>

輸出結果:

第1個節點的值是: javascript 
第1個節點的名稱是:#text
第1個節點的屬性是:3

第2個節點的值是:null
第2個節點的名稱是:P
第2個節點的屬性是:1

第3個節點的值是: 
第3個節點的名稱是:#text
第3個節點的屬性是:3

第4個節點的值是:null
第4個節點的名稱是:DIV
第4個節點的屬性是:1

第5個節點同第3個

第6個節點的值是:null
第6個節點的名稱是:H5
第6個節點的屬性是:1

第7個節點同第3個
訪問子節點的第一和最后項

firstChild 返回'childNodes'數組的第一個子節點,如果選定的節點沒有子節點,返回NULL
語法:node.firstChild //與elementNode.childNodes[0]是同樣效果
lastChild 返回...
語法:node.lastChild

訪問父節點

語法:elementNode.parentNode //父節點只能有一個
祖節點:elementNode.parentNode.parentNode

訪問兄弟節點nextSibling

nextSibling返回某個節點之后緊跟的節點(處于同一樹層級中)
語法:nodeObject.nextSibling //無此節點,返回null
previousSibling返回...
語法:nodeObject.previousSibling //無此節點,返回null
注意: 兩個屬性獲取的是節點。Internet Explorer 會忽略節點間生成的空白文本節點(例如,換行符號),而其它瀏覽器不會忽略。
解決問題方法:
判斷x節點nodeType是否為1,若是為元素節點,若不是,x = x.nextSibling;
示例

function get_nextSibling(n){
  var x=n.nextSibling;
  while (x && x.nodeType!=1){//x存在且不是元素節點
    x=x.nextSibling;
  }
  return x;
}

var x=document.getElementsByTagName("li")[0];
document.write(x.nodeName);
document.write(" = ");
document.write(x.innerHTML);
    
var y=get_nextSibling(x);
    
if(y!=null){
  document.write("<br />nextsibling: ");
  document.write(y.nodeName);
  document.write(" = ");
  document.write(y.innerHTML+"<br  />");
}else{
  document.write("<br>已經是最后一個節點");      
}
插入節點appendChild()

在指定節點的最后一個子節點列表之后添加一個新的子節點。
語法:appendChild(newnode)
示例:

<ul id="test">
  <li>JavaScript</li>
  <li>HTML</li>
</ul>
<script type = "text/javascript">
  var otest = document.getElementById("test");  
  var newnode = document.createElement("li");
  newnode.innerHTML = "PHP";
  otest.appendChild(newnode);
</script>
插入節點insertBefore()

在已有的子節點前插入一個新的子節點
語法:insertBefore(newnode, node)
示例:

<ul id="test"><li>JavaScript</li><li>HTML</li></ul> 
 
<script type="text/javascript">

  var otest = document.getElementById("test");  
  var node = document.getElementsByTagName("li")[1];
  var newnode = document.createElement("li");
  newnode.innerHTML = "php";
  otest.insertBefore(newnode, node);
  
</script> 
removeChild()

從子節點列表中刪除指定節點

<div id = "div1"><h1>HTML</h1><h2>javascript</h2></div>
<script type = "text/javascript">
    var otest = document.getElementById("div1");
    var x = otest.removeChild(otest.childNodes[1]);
    document.write("刪除節點的內容:"+x.innerHTML);
</script>
替換元素節點replaceChild()
<div><b id="oldnode">JavaScript</b>是一個很常用的技術,為網頁添加動態效果。</div>
<a href="javascript:replaceMessage()"> 將加粗改為斜體</a>
<script type="text/javascript">
  function replaceMessage(){
    var newnode = document.createElement("i");
    var newnodeText = document.createTextNode("JjavaScript");
    newnode.appendChild(newnodeText);
    var oldNode = document.getElementById("oldnode");
    oldNode.parentNode.replaceChild(newnode, oldNode);
}    
</script>
創建元素節點createElement()

如前邊所示:
var newnode = document.createElement("li");
var newnode = document.createElement("i");

創建文本節點createTextNode()
.message{    
    width:200px;
    height:100px;
    background-color:#CCC;}
...
 var element = document.createElement("p");
    element.className = "message";
    var textNode = document.createTextNode("I love JavaScript");
    element.appendChild(textNode);
    document.body.appendChild(element);

瀏覽器窗口可視區域大小

獲得瀏覽器窗口的尺寸(瀏覽器的視口,不包括工具欄和滾動條)的方法:
對于IE9+、Chrome、Firefox、Opera、Safari:
window.innerHeight - 瀏覽器窗口的內部高度
window.innerWidth - 瀏覽器窗口的內部寬度
對于IE9-:
document.documentElement.clientHeight表示HTML文檔所在窗口的當前高度。
document.documentElement.clientWidth表示HTML文檔所在窗口的當前寬度。
或者
Document對象的body屬性對應HTML文檔的<body>標簽
document.body.clientHeight
document.body.clientWidth
在不同瀏覽器都實用:

var w= document.documentElement.clientWidth
      || document.body.clientWidth;
var h= document.documentElement.clientHeight
      || document.body.clientHeight;
網頁尺寸

scrollHeight和scrollWidth,獲取網頁內容高度和寬度,scrollHeight是網頁內容高度,最小值是clientHeight(網頁內容實際高度小于clientHeight時,sH返回cH)
瀏覽器兼容性:

var w=document.documentElement.scrollWidth
   || document.body.scrollWidth;
var h=document.documentElement.scrollHeight
   || document.body.scrollHeight;

scrollHeight和scrollWidth還可獲取Dom元素中內容實際占用的高度和寬度。

網頁尺寸

offsetHeight和offsetWidth,獲取網頁內容高度和寬度(包括滾動條等邊線,會隨窗口的顯示大小改變)。

offsetHeight = clientHeight + 滾動條 + 邊框。
瀏覽器兼容性

var w= document.documentElement.offsetWidth 
       || document.body.offsetWidth;
var h= document.documentElement.offsetHeight 
       || document.body.offsetHeight;
網頁卷去的距離與偏移量

來源:[慕課網](http://www.imooc.com/code/1705)

scrollLeft:設置或獲取位于給定對象左邊界與窗口中目前可見內容的最左端之間的距離 ,即左邊灰色的內容。
scrollTop:設置或獲取位于對象最頂端與窗口中可見內容的最頂端之間的距離 ,即上邊灰色的內容。
offsetLeft:獲取指定對象相對于版面或由 offsetParent 屬性指定的父坐標的計算左側位置 。
offsetTop:獲取指定對象相對于版面或由 offsetParent 屬性指定的父坐標的計算頂端位置 。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容