最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解JS中attribute和property的區(qū)別

 更新時(shí)間:2022年02月22日 15:50:19   作者:L_mj  
property 和 attribute非常容易混淆,但實(shí)際上,二者是不同的東西,屬于不同的范疇,本文就詳細(xì)的介紹一下JS中attribute和property的區(qū)別 ,感興趣的可以了解一下

property 和 attribute非常容易混淆,兩個(gè)單詞的中文翻譯也都非常相近(property:屬性,attribute:特性),但實(shí)際上,二者是不同的東西,屬于不同的范疇。

  • property是DOM中的屬性,是JavaScript里的對(duì)象;
  • attribute是HTML標(biāo)簽上的特性,它的值只能夠是字符串;

attribute和property介紹

簡(jiǎn)單理解,Attribute就是dom節(jié)點(diǎn)自帶的屬性,例如html中常用的id、class、title、align等。

而Property是這個(gè)DOM元素作為對(duì)象,其附加的內(nèi)容,例如childNodes、firstChild等。

有以下代碼:

<div id="div1" class="divClass" title="divTitle" title1="divTitle1"></div>

var in1=document.getElementById("div1");
console.log(in1);

對(duì)于id為div1的div,它的property內(nèi)容如下:(部分)

可以發(fā)現(xiàn)有一個(gè)名為“attributes”的屬性,類型是NamedNodeMap,同時(shí)有“id”和“className”、”title“等基本的屬性,但沒有“titles”這個(gè)自定義的屬性。

 console.log(in1.id);          //div1
    console.log(in1.className);        //divClass
    console.log(in1.title);          //divTitle
    console.log(in1.title1);       //undefined

可以發(fā)現(xiàn),標(biāo)簽中的屬性,“id”和“className”、”title“會(huì)在in1上創(chuàng)建,而“titles”不會(huì)被創(chuàng)建。這是由于,每一個(gè)DOM對(duì)象都會(huì)有它默認(rèn)的基本屬性,而在創(chuàng)建的時(shí)候,它只會(huì)創(chuàng)建這些基本屬性,我們?cè)赥AG標(biāo)簽中自定義的屬性是不會(huì)直接放到DOM中的。

那自定義的”title1“去哪里了呢?在attributes屬性里可以看到如下:

“title1”被放在了attributes這個(gè)對(duì)象里,這個(gè)對(duì)象按順序記錄了我們?cè)赥AG中定義的屬性和屬性的數(shù)量。

從這里就可以看出,attributes是屬于property的一個(gè)子集,它保存了HTML標(biāo)簽上定義屬性。如果再進(jìn)一步探索attitudes中的每一個(gè)屬性,會(huì)發(fā)現(xiàn)它們并不是簡(jiǎn)單的對(duì)象,它是一個(gè)Attr類型的對(duì)象,擁有NodeType、NodeName等屬性。關(guān)于這一點(diǎn),稍后再研究。注意,打印attribute屬性不會(huì)直接得到對(duì)象的值,而是獲取一個(gè)包含屬性名和值的字符串,如:

console.log(in1.attibutes.title1);        // divTitle1

由此可以得出:

  • HTML標(biāo)簽中定義的屬性和值會(huì)保存該DOM對(duì)象的attributes屬性里面;
  • 這些attribute屬性的JavaScript中的類型是Attr,而不僅僅是保存屬性名和值這么簡(jiǎn)單;

再如下:

<input id="in_2">

在它的property中有如下部分:

盡管我們沒有在TAG中定義“value”,但由于它是DOM默認(rèn)的基本屬性,在DOM初始化的時(shí)候它照樣會(huì)被創(chuàng)建。

“腳踏兩只船”

常用的Attribute,例如id、class、title等,已經(jīng)被作為Property附加到DOM對(duì)象上,可以和Property一樣取值和賦值。但是自定義的Attribute,就不會(huì)有這樣的特殊優(yōu)待,例如:

<div id="div1" class="divClass" title="divTitle" title1="divTitle1">100</div>

這個(gè)div里面的“title1”就不會(huì)變成Property。

即,只要是DOM標(biāo)簽中出現(xiàn)的屬性(html代碼),都是Attribute。然后有些常用特性(id、class、title等),會(huì)被轉(zhuǎn)化為Property。可以很形象的說,這些特性/屬性,是“腳踏兩只船”的。

最后注意:“class”變成Property之后叫做“className”,因?yàn)?ldquo;class”是ECMA的關(guān)鍵字。

  • DOM有其默認(rèn)的基本屬性,而這些屬性就是所謂的“property”,無論如何,它們都會(huì)在初始化的時(shí)候再DOM對(duì)象上創(chuàng)建。
  • 如果在TAG對(duì)這些屬性進(jìn)行賦值,那么這些值就會(huì)作為初始值賦給DOM的同名property。

attribute和property的取值和賦值

1、attribute取值

《js高級(jí)程序設(shè)計(jì)》中提到,為了方便操作,建議大家用setAttribute()和getAttribute()來操作即可。

<div id="div1" class="divClass" title="divTitle" align="left" title1="divTitle1"></div>
 
 var id = div1.getAttribute("id");              
 var className1 = div1.getAttribute("class");
 var title = div1.getAttribute("title");
 var title1 = div1.getAttribute("title1");   //自定義特性

getAttribute()可以取得任何特性,不管是標(biāo)準(zhǔn)的還是自定義的。

但是這個(gè)方法的瀏覽器兼容性有問題,有些瀏覽器可能會(huì)獲取屬性Property的值,因此jQuery要做一個(gè)測(cè)試,看getAttribute()是否是絕對(duì)獲取特性Attribute的值。

div1.className = 'a';
var judge = div1.getAttribute("className") === 'a';

如果以上代碼成立,說明getAttribute()方法出現(xiàn)了問題,將不再使用。

2、attribute賦值

div1.setAttribute('class', 'a');
 div1.setAttribute('title', 'b');
 div1.setAttribute('title1', 'c');
 div1.setAttribute('title2', 'd');

用setAttrbute()賦值,任何Attribute都可以,包括自定義的。而且,賦值的Attribute會(huì)立刻表現(xiàn)到DOM元素上。

如果是標(biāo)準(zhǔn)特性,也會(huì)更新它們關(guān)聯(lián)的屬性的值:

最后注意,setAttribute()的兩個(gè)參數(shù),都必須是字符串。即對(duì)特性Attribute職能賦值字符串,而對(duì)屬性Property就可以賦任何類型的值了。

3、property取值

屬性取值很簡(jiǎn)單。取任何屬性的只,用“.”就可以:

var id = div1.id;
 var className = div1.className;
 var childNodes = div1.childNodes;
 var attrs = div1.attributes;

此處再次強(qiáng)調(diào):

  • class特性在變成屬性時(shí),名字改成了“className”,因此div1.className和div1.getAttrbute('class')相同。
  • 上面代碼中的div1.attributes是取的attributes這一屬性,取出來保存到attrs變量中,attrs就成了一個(gè)NamedNodeList類型的對(duì)象,里面存儲(chǔ)了若干個(gè)Attr類型。

4. Property賦值

賦值和基本的js對(duì)象屬性賦值一樣,用“.”即可:

div1.className = 'a';
div1.align = 'center';
div1.AAAAA = true;
div1.BBBBB = [1, 2, 3];

對(duì)屬性Property可以賦任何類型的值,而對(duì)特性Attribute只能賦值字符串!

另外,對(duì)于屬性Property的賦值在IE中可能會(huì)引起循環(huán)引用,內(nèi)存泄漏。為了防止這個(gè)問題,jQuery.data()做了特殊處理,解耦了數(shù)據(jù)和DOM對(duì)象。

更改property和attribute其中一個(gè)值,會(huì)出現(xiàn)什么結(jié)果

in1.value='new value of prop';

console.log(in1.value);               // 'new value of prop'
console.log(in1.attributes.value);         // 'value="1"'

此時(shí),頁面中的輸入欄的值變成了“new value of prop”,而propety中的value也變成了新的值,但attributes卻仍然是“1”。從這里可以推斷,property和attribute的同名屬性的值并不是雙向綁定的。

如果反過來,設(shè)置attitudes中的值,效果會(huì)怎樣呢?

    in2.setAttribute('value','ni')
    console.log(in2.value);          //ni
    console.log(in2.attributes.value); //value='ni'

由此,可得出結(jié)論:

  • property能夠從attribute中得到同步;
  • attribute不會(huì)同步property上的值;
  • attribute和property之間的數(shù)據(jù)綁定是單向的,attribute->property;
  • 更改property和attribute上的任意值,都會(huì)將更新反映到HTML頁面中;

到此這篇關(guān)于深入理解JS中attribute和property的區(qū)別 的文章就介紹到這了,更多相關(guān)JS attribute property內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)

    js實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JS實(shí)現(xiàn)隱藏同級(jí)元素后只顯示JS文件內(nèi)容的方法

    JS實(shí)現(xiàn)隱藏同級(jí)元素后只顯示JS文件內(nèi)容的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)隱藏同級(jí)元素后只顯示JS文件內(nèi)容的方法,可實(shí)現(xiàn)將與js文件的同級(jí)元素全部隱藏,只顯示js文件內(nèi)容的功能,涉及javascript針對(duì)頁面元素的遍歷與屬性修改相關(guān)技巧,需要的朋友可以參考下
    2016-09-09
  • javascript實(shí)現(xiàn)攝像頭拍照預(yù)覽

    javascript實(shí)現(xiàn)攝像頭拍照預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)攝像頭拍照預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 原生js實(shí)現(xiàn)返回頂部緩沖效果

    原生js實(shí)現(xiàn)返回頂部緩沖效果

    本文主要分享了原生js實(shí)現(xiàn)返回頂部緩沖效果的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 如何通過JavaScript來實(shí)現(xiàn)頁面間數(shù)據(jù)傳遞

    如何通過JavaScript來實(shí)現(xiàn)頁面間數(shù)據(jù)傳遞

    這篇文章主要給大家介紹了關(guān)于如何通過JavaScript來實(shí)現(xiàn)頁面間數(shù)據(jù)傳遞的相關(guān)資料,在前端開發(fā)中我們常常需要從一個(gè)跳到另一個(gè)頁面,并且將當(dāng)前頁面的數(shù)據(jù)傳遞過去,需要的朋友可以參考下
    2023-11-11
  • json原理分析及實(shí)例介紹

    json原理分析及實(shí)例介紹

    這次在項(xiàng)目中前后臺(tái)的數(shù)據(jù)交互中用到了json,經(jīng)過這段時(shí)間的使用,簡(jiǎn)單總結(jié)一下json的原理與使用,需要了解的朋友可以參考下
    2012-11-11
  • 根據(jù)json字符串生成Html的一種方式

    根據(jù)json字符串生成Html的一種方式

    本文介紹了根據(jù)Json串生成Html的一種方式(只是簡(jiǎn)單實(shí)現(xiàn)了文本框,密碼框,下拉框)感興趣的朋友可以了解下
    2013-01-01
  • 對(duì)象無length屬性時(shí)IE6/IE7中無法將其轉(zhuǎn)換成偽數(shù)組(ArrayLike)

    對(duì)象無length屬性時(shí)IE6/IE7中無法將其轉(zhuǎn)換成偽數(shù)組(ArrayLike)

    對(duì)象無length屬性時(shí)IE6/7中無法將其轉(zhuǎn)換成偽數(shù)組(ArrayLike) 的解決方法,需要的朋友可以參考下。
    2011-07-07
  • 初識(shí)javascript 文檔碎片

    初識(shí)javascript 文檔碎片

    今天遇到一個(gè)問題: 我通過 ajax 取回另一個(gè)頁面的 Html 。但這些 HTML 我不想直接輸出,想通過 getElementsByName 處理后再輸出相應(yīng)的內(nèi)容。用原生的 javascript怎樣可以處理呢?
    2010-07-07
  • JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼

    JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼

    這篇文章主要介紹了JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

瓮安县| 翼城县| 壶关县| 陆河县| 蓝山县| 杭锦后旗| 白朗县| 察隅县| 怀宁县| 深圳市| 台东县| 汉寿县| 南投县| 湛江市| 罗甸县| 云龙县| 含山县| 桦川县| 河池市| 衡阳市| 余干县| 龙口市| 临泉县| 安国市| 大方县| 连州市| 姜堰市| 涞水县| 南丹县| 镇赉县| 阳原县| 洞口县| 布尔津县| 高雄市| 巴马| 开封县| 米泉市| 乌拉特前旗| 宝丰县| 石渠县| 报价|