JS DOM屬性,包括固有屬性和自定義屬性,以及屬性獲取、移除和設置

屬性分爲固有屬性property和自定義屬性attributehtml

固有屬性查看node

 

 固有屬性能夠經過ele.property 來獲取,自定義屬性不行數組

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var input=document.querySelector("input");
            console.log(input.type);//text
            console.log(input.value);//txt
            console.log(input.a);//undefined
            console.log(input.title);//""

        });

    </script>
</head>
<body>
    <input type="text" value="txt" a="b">
</body>
</html>

.attributes 返回類數組,獲取全部屬性,包括自定義屬性和固有屬性瀏覽器

若是定義了同名屬性,後面的屬性會被忽略服務器

若是自定義屬性時出現了大寫,會統一轉爲小寫ide

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");
            console.log(div.attributes);//

        });

    </script>
</head>
<body>
    <div id="div" url="index.html" aa="xx" Bb="yy" aa="zz">這是div</div>
</body>
</html>

 

 獲取指定的自定義屬性的屬性值測試

ele.attributes.getNamedItem(屬性名).nodeValuethis

ele.attributes[屬性名].nodeValue搜索引擎

注意,若是某個固有屬性沒有在元素中被人爲定義,則不可獲取url

若是是人爲定義的固有屬性,或者自定義屬性,則能夠用該方法獲取

.nodeName 獲取元素的節點名

ele.attributes.removeNamedItem(屬性名)   移除屬性

建立屬性:

一、.createAttribute(屬性名)  建立屬性

二、attr.value=屬性值   給建立的屬性設置屬性值

三、.attributes.setNamedItem(屬性名,屬性值)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");
            //獲取自定義屬性方法一
            console.log(div.attributes.getNamedItem("aa").nodeValue);//xx
            //獲取自定義屬性方法二
            console.log(div.attributes["aa"].nodeValue);//xx
            //獲取未人爲定義的固有屬性
            console.log(div.attributes.getNamedItem("nodeName"));//null
            //獲取固有屬性的正確打開方式
            console.log(div.nodeName);//DIV
            //獲取人爲定義的固有屬性
            console.log(div.attributes.getNamedItem("id").nodeValue);//div

            // 移除屬性
            div.attributes.removeNamedItem("bb");
            console.log(div.attributes);

            //建立屬性
            var attr=document.createAttribute("data-my");
            attr.value="myattr";
            div.attributes.setNamedItem(attr);
        });

    </script>
</head>
<body>
    <div id="div" url="index.html" aa="xx" Bb="yy" aa="zz">這是div</div>
</body>
</html>

獲取未人爲定義的固有屬性,返回null

 

獲取未人爲定義的固有屬性的nodeValue,會報錯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");

            //獲取未人爲定義的固有屬性
            console.log(div.attributes.getNamedItem("title"));//null
            console.log(div.attributes.getNamedItem("title").nodeValue);//報錯

        });

    </script>
</head>
<body>
    <div id="div" url="index.html" aa="xx" Bb="yy" aa="zz">這是div</div>
</body>
</html>

 

 用.innerHTML來操做固有屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");
            div.innerHTML="這是innerHTML設置的文本哈";
            console.log(div.innerHTML);//這是innerHTML設置的文本哈

        });

    </script>
</head>
<body>
    <div id="div" url="index.html" aa="xx" Bb="yy" aa="zz">這是div</div>
</body>
</html>

通用方法操做固有屬性和自定義屬性

getAttribute()

setAttribute()

removeAttribute()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");
            console.log(div.getAttribute("aa"));//xx

            console.log(div.getAttribute("style"));//color:orange
            console.log(div.style);//CSSStyleDeclaration {0: "color", alignContent: "", alignItems: "", alignSelf: "", alignmentBaseline: "", all: "", …}

            console.log(div.getAttribute("onclick"));//alert('hello~')
            console.log(div.onclick);//onclick(event) {alert('hello~')}

        });

    </script>
</head>
<body>
    <div id="div" url="index.html" aa="xx" Bb="yy" aa="zz" style="color:orange" onclick="alert('hello~')">這是div</div>
</body>
</html>

以上代碼代表,使用getAttribute() 和 .屬性名  來獲取屬性值,在某些狀況下結果是不一樣的,好比style和Onclick

一般,獲取固有屬性使用 .屬性名,獲取自定義屬性使用getAttribute()

setAttribute() 設置自定義屬性時,不存在兼容性問題

可是設置部分固有屬性,好比onclick和style時,在IE7及如下版本存在兼容性問題

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.querySelector("#div");
            // 設置自定義屬性
            div.setAttribute("data-a","a");
            div.setAttribute("style","color:purple");
            div.setAttribute("onclick","alert(0)");
        });

    </script>
</head>
<body>
    <div id="div" url="index.html">這是div</div>
</body>
</html>

正常瀏覽器效果

 

 IE7及如下效果

 

 因爲不支持querySelector方法,先改爲document.getElementById()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.getElementById("div");
            // 設置自定義屬性
            div.setAttribute("data-a","a");
            div.setAttribute("style","color:purple");
            div.setAttribute("onclick","alert(0)");
        });

    </script>
</head>
<body>
    <div id="div" url="index.html">這是div</div>
</body>
</html>

 

 

再也不報錯,但設置的style屬性和onclick方法都沒有生效

removeAttribute() 刪除屬性,不存在兼容性問題

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var div=document.getElementById("div");
            // 設置自定義屬性
            div.removeAttribute("style");
        });

    </script>
</head>
<body>
    <div id="div" url="index.html" style="color:orange">這是div</div>
</body>
</html>

 

 布爾屬性

經過布爾屬性操做DOM

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var inputs=document.querySelectorAll("input");
            inputs[0].checked=true;
        });

    </script>
</head>
<body>
    <input type="checkbox" name="city">杭州
    <input type="checkbox" name="city" checked="checked">寧波
    <input type="checkbox" name="city" checked>溫州
</body>
</html>

 

 input.checked 設置成任何非空字符串,都換轉爲布爾值true,均可以選中

但這種自動轉換在IE7如下會失敗

另外固有屬性不能經過removeAttribute() 來移除

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var inputs=document.querySelectorAll("input");
            inputs[0].checked=true;
            inputs[0].checked="checked";
            inputs[0].checked=1;

            inputs[1].checked=0;
            inputs[1].checked="";

            inputs[1].removeAttribute("checked");
        });

    </script>
</head>
<body>
    <input type="checkbox" name="city">杭州
    <input type="checkbox" name="city" checked="checked">寧波
    <input type="checkbox" name="city" checked>溫州
</body>
</html>

.options 能夠獲取select下的全部option選項

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var select=document.getElementById("select");
            var options=select.options;
            options[1].selected=true;
        });

    </script>
</head>
<body>
    <select name="select" id="select">
        <option value="">請選擇</option>
        <option value="1">杭州</option>
        <option value="2">寧波</option>
        <option value="3">溫州</option>
    </select>
</body>
</html>

 

 .readOnly 只讀屬性 (注意O必須大寫)

.disabled 禁用屬性

區別:readOnly數據能夠提交到服務器,disabled數據不會提交到服務器

select的multiple屬性  設置多選,下拉框變列表框

HTML5新增屬性hidden  使元素再也不顯示(低版本IE沒法兼容)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var input=document.getElementById("input");
            input.readOnly=false;

            var input2=document.getElementById("input2");
            input2.disabled=true;

            var select=document.getElementById("select");
            select.multiple=true;

            var div=document.getElementById("div");
            div.hidden=false;
        });

    </script>
</head>
<body>
    <input type="text" value="中國" readonly id="input">
    <input type="text" value="中國" id="input2">
    <select name="select" id="select">
        <option>杭州</option>
        <option>寧波</option>
        <option>溫州</option>
    </select>
    <div id="div" hidden="hidden">這是div</div>
</body>
</html>

 

 常見的字符串屬性(大部分都是字符串屬性)

id  惟一標識

class  類

href  多用於a連接和link

src  多用於img和script和video等等

lang  輔助搜索引擎等的語言識別  <html land="zh">

zh 中文  zh-cn 中文簡體  zh-sg  新加坡  zh-hk  香港

accesskey  組合鍵,快捷鍵

在谷歌瀏覽器中使用alt+設置的快捷鍵字母來激活

name  多用於表單元素的控件名稱

value  表單元素的值

title 元素不可見時的提示信息


 

W3C全局屬性

accesskey   class  dir  id  lang  title

contenteditable  元素內容是否可編輯

hidden  元素是否隱藏

spellcheck 元素內容編輯時的語法檢查

style  樣式

tabindex  使用tab鍵導航時的切換順序


 

當一個頁面中有多個元素使用相同的id時,使用document.getElementById()可以取得元素,可是隻會取得第一個

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){
            var p=document.getElementById("p");
            console.log(p);//<p id="p">這是一段文字1</p>

            var p=document.getElementById("p");
            p.className="active";
        });

    </script>
</head>
<body>
    <p id="p">這是一段文字1</p>
    <p id="p">這是一段文字2</p>
    
    <input type="text" accesskey="n" value="n"><!-- alt+n -->
    <input type="text" accesskey="m" value="m"><!-- alt+m -->
</body>
</html>

 

 data屬性  以data-開頭

設置時多單詞以連字符分開,如data-aa-bb

JS獲取時使用dataset.屬性名  後面須要轉換成小駝峯形式

可是IE瀏覽器兼容性不是很好

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var div=document.getElementById("div");
            console.log(div.dataset.toggle);//modal
            console.log(div.dataset.xxxYyy);//aa
        });

    </script>
</head>
<body>

    <div id="div" data-toggle="modal" data-xxx-yyy="aa">這是驗證data屬性的div</div>
</body>
</html>

class屬性

自定義class相關的操做方法

this指向當前對象

gi表示全局匹配且不區分大小寫

str.replace(exp,str2)  將str字符串中,知足exp正則匹配的部分,用str2替換

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var classMethod={
                //獲取class
                getClass:function(ele){
                    // 將多個空格統一轉換爲一個空格,並根據空格來將字符串轉爲數組
                    return ele.className.replace(/\s+/," ").split(" ");
                },
                //判斷是否存在某個class
                hasClass:function(ele,cls){
                    // 給獲取的class字符串先後加上空格,再給要查找的類名先後也加上空格
                    // -1表示不存在,不然爲存在
                    return -1< (" "+ele.className+" ").indexOf(" "+cls+" ");
                },
                //添加class
                addClass:function(ele,cls){
                    //this指向classMethod這個對象
                    if(!this.hasClass(ele,cls)){
                        ele.className+=" "+cls;
                    }
                },
                //刪除class
                removeClass:function(ele,cls){
                    if(this.hasClass(ele,cls)){
                        //gi表示全局匹配,且不區分大小寫
                        var exp=new RegExp("(^|\\s)"+cls+"($|\\s)","gi");
                        ele.className=ele.className.replace(exp," ");
                    }
                },
                //切換class
                toggleClass(ele,cls){
                    if(this.hasClass(ele,cls)){
                        this.removeClass(ele.cls);
                    }else{
                        this.addClass(ele,cls);
                    }
                }
            }

            var div=document.querySelector("div");
            console.log(classMethod.getClass(div));//(3) ["a", "b", "c"]

            console.log(classMethod.hasClass(div,"a"));//true
            console.log(classMethod.hasClass(div,"z"));//false

            classMethod.addClass(div,"z");

            classMethod.removeClass(div,"z");

            classMethod.toggleClass(div,"z");
        });

    </script>
</head>
<body>

    <div class="a b c">這是測試class相關的div</div>
</body>
</html>

js自帶的classList對於class的操做

ele.classList.add(cls)

ele.classList.remove(cls)

ele.classList.toggle(cls)

ele.classList.contains(cls)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var div=document.querySelector("div");
            console.log(div.classList.add("z"));
            console.log(div.classList.toString());//a b c z

            console.log(div.classList.remove("a"));
            console.log(div.classList.toString());//b c z

            console.log(div.classList.contains("b"));//true
            console.log(div.classList.toString());//b c z

            console.log(div.classList.toggle("c"));//false
            console.log(div.classList.toString());//b z
        });

    </script>
</head>
<body>

    <div class="a b c">這是測試class相關的div</div>
</body>
</html>

 

 惋惜兼容性是:IE11+

相關文章
相關標籤/搜索