JS學習之DOM節點的關系屬性封裝、克隆節點、Dom中Style常用的一些屬性等小結


JS DOM節點:

在JS DOM中節點的關系被定義為節點的屬性:

通常有以下幾種節點之間的關系:

(這里的關系是所有瀏覽器都支持的)

  • parentNode    父節點
  • childNodes    子節點
  • firstChild    父節點里的第一個子節點
  • lastChild     父節點里的最后一個子節點
  • nextSibling    與子節點並列的下一個兄弟節點
  • previousSibling   與子節點並列的上一個兄弟節點

火狐與谷歌支持而ie8不支持的節點關系有:

previousElementSibling
nextElementSibling
firstElementChild
lastElementChild


在實際工作中,我們可以對這些ie8不支持,但是谷歌與火狐都支持的節點屬性進行封裝,使他們能夠在各個瀏覽器中都能夠兼容。

4個封裝實例:

/**
 * 獲得當前對象的上一個標簽元素
 * @param obj
 * @returns {*}
 */
function getPreviousSibling(obj){
    if(obj.previousElementSibling){  // previousElementSibling能夠直接獲得上一個兄弟標簽節點
        return obj.previousElementSibling;
    }else {
        var node = obj.previousSibling;//是所有的瀏覽器都支持的,但是得判斷節點類型,previousSibling不能直接獲得類型為標簽的元素,所以需要判斷它的節點類型。
        while(node&&node.nodeType!=1){ //判斷節點上一個節點是否存在與節點的類型是否是標簽類型,如果不是就使用while循環繼續循環判斷節點直到獲得為止
            node = node.previousSibling;
        }
        return node;  //將找到的標簽節點返回
    }
}
/**
 * 獲取當前元素的兄弟標簽節點的函數
 * @param obj
 * @returns {*}
 */
function getNextSibling(obj){
    if(obj.nextElementSibling){ // 火狐谷歌都支持的,只會獲得標簽兄弟節點,IE8不支持
        return  obj.nextElementSibling;
    }else {
        var node = obj.nextSibling;// nextSibling是所有的瀏覽器都會支持的,但是會獲得文本節點,IE8及之前的瀏覽器會忽略空白文本節點
        while(node&&node.nodeType!=1){
            node = node.nextSibling;
        }
        return node;
    }
}

/**
 * 獲得兼容性的當前對象的第一個子標簽節點
 * @param obj
 * @returns {*}
 */
function getFirstChild(obj){
    if(obj.firstElementChild){
        return obj.firstElementChild;//將獲取到的第一個子節點元素返回
    }else {
        var node = obj.firstChild;//獲得當前對象的第一個子節點,但是這個節點有可能是文本節點
        while(node&&node.nodeType!=1){
            node = node.nextSibling;
        }
        return node;
    }
}

/**
 * 獲得當前對象的最后一個子標簽節點
 * @param obj
 * @returns {*}
 */
function getLastChild(obj){
    if(obj.lastElementChild){
        return obj.lastElementChild;
    }else {
        var node = obj.lastChild;
        while(node&&node.nodeType!=1){
            node = node.previousSibling;//當前對象的上一個兄弟姊妹節點
        }
        return node;
    }
}

克隆節點:

cloneNode(true) 這種情況是表示克隆節點的所有內容(標簽+標簽里的內容);

cloneNode(false) 這種情況是僅僅表示克隆了節點的標簽;

例:

<body>
<ul id="list">
    <li>111111</li>
    <li>222222</li>
    <li id="li3">333333</li>
    <li>444444</li>
</ul>
<script>
    var ul = document.getElementById("list");
    var li = document.getElementById("li3");
    console.log(li.cloneNode(false)); //如果是False的話,僅僅是相當於復制(克隆)了一個標簽
    console.log(li.cloneNode(true));// 將li標簽原樣克隆,包含里面的一切信息,包括子節點
    console.log(ul.cloneNode(false));
    console.log(ul.cloneNode(true));

    // 參數為True的時候,是深度克隆,克隆當前對象的一切子節點
    // 參數為false的時候,是淺克隆,只會克隆標簽,不包含文本信息
</script>

Dom中Style常用的一些屬性:

display(none/block):控制元素的顯示,不占據原來在標准流中的位置;

visibility(visible/hidden):控制元素的顯示,占據原來在標准流之中的位置

backgroundColor: 控制元素的背景顏色

backgroundImage: 控制元素背景圖片的路徑

color:  控制前景顏色

width:控制元素的寬度

height:控制元素的高度

border:控制邊框的屬性

position:控制元素使用何種定位

left/top:控制元素的定位之后的偏移(注意最后不要忘記帶上單位px)

box.style.position="absolute";
box.style.left="200px";

zIndex:控制元素的層級(案例:許願牆點擊哪個卡片哪個在最上面顯示)

filter:控制元素的透明度(ie8支持)

box.style.filter="alpha(opacity=30)";

而火狐與谷歌支持的是:

box.style.backgroundColor="rgba(120,120,120,.3)";

補充:下拉列表中<option></option>的selected屬性

selected 屬性可設置或返回選項的 selected 屬性的值。

該屬性設置選項的當前狀態,如果為 true,則該選項被選中。該屬性的初始值來自 <option> 的 selected 屬性。

抽獎案例:
<body>
<select name="" id="sel">
    <option value="">一等獎</option>
    <option value="">二等獎</option>
    <option value="">三等獎</option>
    <option value="">四等獎</option>
    <option value="">五等獎</option>
    <option value="">六等獎</option>
    <option value="">七等獎</option>
    <option value="">八等獎</option>
    <option value="">九等獎</option>
</select>
<input type="button" value="抽獎" id="btn"/>
<script>
   var sel=document.getElementById("sel");
    var options=sel.children;
    var btn=document.getElementById("btn");
    btn.onclick=function(){
        var index=Math.floor(Math.random()*options.length);
        options[index].selected=true;
    }
</script>

DOM 中,屬性也是節點。與元素節點不同,屬性節點擁有文本值。

獲取屬性的值的方法,就是獲取它的文本值。

getAttribute() 方法返回屬性的值。

getAttributeNode() 方法返回屬性節點。

setAttribute() 方法用於改變屬性的值或創建新屬性。

removeAttribute() 方法刪除指定屬性。

createElement() 方法創建新的元素節點;

 

appendChild() 方法可向節點的子節點列表的末尾添加新的子節點。

removeChild() 方法刪除指定節點。當一個節點被刪除時,其所有子節點也會被刪除。

insertBefore() 方法用於在指定的子節點之前插入節點。在被添加的節點的位置很重要時,此方法很有用。

replaceChild() 方法用其他節點替換某個子節點。如成功,該方法返回被替換的節點,如失敗,則返回 null。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM