精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

DOM中Property和Attribute的區(qū)別

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

[[144654]]

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

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

基于JavaScript分析property 和 attribute

html中有這樣一段代碼:

  1. <input id="in_1" value="1" sth="whatever"> 

簡(jiǎn)單的在html頁(yè)面上創(chuàng)建一個(gè)input輸入欄(注意在這個(gè)標(biāo)簽中添加了一個(gè)DOM中不存在的屬性“sth”),此時(shí)在JS執(zhí)行如下語句

  1. var in1 = document.getElementById('in_1'); 

執(zhí)行語句

  1. console.log(in1); 

從console的打印結(jié)果,可以看到in1含有一個(gè)名為“attributes”的屬性,它的類型是NamedNodeMap,同時(shí)還有“id”和“value”兩個(gè)基本的屬性,但沒有“sth”這個(gè)自定義的屬性。

  1. attributes: NamedNodeMap 
  2. value: "1" 
  3. id: "in_1" 

有些console可能不會(huì)打印in1上的屬性,那么可以執(zhí)行以下命令打印要觀察的屬性:

  1. console.log(in1.id);        // 'in_1' 
  2. console.log(in1.value);     // 1 
  3. console.log(in1.sth);       // undefined 

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

我們做一個(gè)額外的測(cè)試,創(chuàng)建另一個(gè)input標(biāo)簽,并執(zhí)行類似的操作:

html:

  1. <input id="in_2"> 

JS:

  1. var in2 = document.getElementById('in_2'); 
  2. console.log(in2); 

從打印信息中可以看到:

  1. id: "in_2" 
  2. value: null 

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

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

現(xiàn)在回到***個(gè)input(“#in_1”),我們就會(huì)問,“sth”去哪里了?別急,我們把a(bǔ)ttributes這個(gè)屬性打印出來看看

  1. console.log(in2); 

上面有幾個(gè)屬性:

  1. 0: id 
  2. 1: value 
  3. 2: sth 
  4. length: 3 
  5. __proto__: NamedNodeMap 

原來“sth”被放到了attributes這個(gè)對(duì)象里面,這個(gè)對(duì)象按順序記錄了我們?cè)赥AG中定義的屬性和屬性的數(shù)量。此時(shí),如果再將第二個(gè)input標(biāo)簽的attributes打印出來,就會(huì)發(fā)現(xiàn)只有一個(gè)“id”屬性,“length”為1。

從這里就可以看出,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è)包含屬性名和值的字符串,如:

  1. console.log(in1.attibutes.sth);     // 'sth="whatever"

由此可以得出:

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

那么,如果我們更改property和attribute的值會(huì)出現(xiàn)什么效果呢?執(zhí)行如下語句:

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

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

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

  1. in1.attributes.value.value = 'new value of attr'
  2. console.log(in1.value);             // 'new value of attr' 
  3. console.log(in1.attributes.value);  // 'new value of attr' 

此時(shí),頁(yè)面中的輸入欄得到更新,property中的value也發(fā)生了變化。此外,執(zhí)行下面語句也會(huì)得到一樣的結(jié)果

  1. in1.attributes.value.nodeValue = 'new value of attr'

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

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

基于jQuery分析attribute和property

那么jQuery中的attr和prop方法是怎樣的呢?

首先利用jQuery.prop來測(cè)試

  1. $(in1).prop('value''new prop form $'); 
  2.  
  3. console.log(in1.value);             // 'new prop form $' 
  4. console.log(in1.attributes.value);  // '1' 

輸入欄的值更新了,但attribute并未更新。

然后用jQuery.attr來測(cè)試

  1. $(in1).attr('value''new attr form $'); 
  2.  
  3. console.log(in1.value);             // 'new attr form $' 
  4. console.log(in1.attributes.value);  // 'new attr form $' 

輸入欄的值更新了,同時(shí)property和attribute都更新了。

從上述測(cè)試的現(xiàn)象可以推斷,jQuery.attr和jQuery.prop基本和原生的操作方法效果一致,property會(huì)從attribute中獲取同步,然而attribute不會(huì)從property中獲取同步。那么jQuery到底是如何實(shí)現(xiàn)的呢?

下面,我們來看看jQuery.attr和jQuery.prop的源碼。

#p#

jQuery源碼

$().prop源碼

  1. jQuery.fn.extend({ 
  2.     prop: function( name, value ) { 
  3.         return access( this, jQuery.prop, name, value, arguments.length > 1 ); 
  4.     }, 
  5.     ... // removeProp方法 
  6. }); 

$().attr源碼

  1. jQuery.fn.extend({ 
  2.     attr: function( name, value ) { 
  3.         return access( this, jQuery.attr, name, value, arguments.length > 1 ); 
  4.     }, 
  5.     ... // removeAttr方法 
  6. }); 

無論是attr還是prop,都會(huì)調(diào)用access方法來對(duì)DOM對(duì)象的元素進(jìn)行訪問,因此要研究出更多內(nèi)容,就必須去閱讀access的實(shí)現(xiàn)源碼。

jQuery.access

  1. // 這是一個(gè)多功能的函數(shù),能夠用來獲取或設(shè)置一個(gè)集合的值 
  2. // 如果這個(gè)“值”是一個(gè)函數(shù),那么這個(gè)函數(shù)會(huì)被執(zhí)行 
  3.  
  4. // @param elems, 元素集合 
  5. // @param fn, 對(duì)元素進(jìn)行處理的方法 
  6. // @param key, 元素名 
  7. // @param value, 新的值 
  8. // @param chainable, 是否進(jìn)行鏈?zhǔn)秸{(diào)用 
  9. // @param emptyGet, 
  10. // @param raw, 元素是否一個(gè)非function對(duì)象 
  11. var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 
  12.     var i = 0,                      // 迭代計(jì)數(shù) 
  13.         length = elems.length,      // 元素長(zhǎng)度 
  14.         bulk = key == null;         // 判斷是否有特定的鍵(屬性名) 
  15.  
  16.     // 如果存在多個(gè)屬性,遞歸調(diào)用來逐個(gè)訪問這些值 
  17.     if ( jQuery.type( key ) === "object" ) { 
  18.         chainable = true
  19.         for ( i in key ) { 
  20.             jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); 
  21.         } 
  22.  
  23.     // 設(shè)置一個(gè)值 
  24.     } else if ( value !== undefined ) { 
  25.         chainable = true
  26.  
  27.         if ( !jQuery.isFunction( value ) ) {    // 如果值不是一個(gè)function 
  28.             raw = true
  29.         } 
  30.  
  31.         if ( bulk ) { 
  32.             // Bulk operations run against the entire set 
  33.             // 如果屬性名為空且屬性名不是一個(gè)function,則利用外部處理方法fn和value來執(zhí)行操作 
  34.             if ( raw ) { 
  35.                 fn.call( elems, value ); 
  36.                 fn = null
  37.  
  38.             // ...except when executing function values 
  39.             // 如果value是一個(gè)function,那么就重新構(gòu)造處理方法fn 
  40.             // 這個(gè)新的fn會(huì)將value function作為回調(diào)函數(shù)傳遞給到老的處理方法 
  41.             } else { 
  42.                 bulk = fn; 
  43.                 fn = function( elem, key, value ) { 
  44.                     return bulk.call( jQuery( elem ), value ); 
  45.                 }; 
  46.             } 
  47.         } 
  48.  
  49.         if ( fn ) { // 利用處理方法fn對(duì)元素集合中每個(gè)元素進(jìn)行處理 
  50.             for ( ; i < length; i++ ) { 
  51.                 fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); 
  52.                 // 如果value是一個(gè)funciton,那么首先利用這個(gè)函數(shù)返回一個(gè)值并傳入fn 
  53.             } 
  54.         } 
  55.     } 
  56.  
  57.     return chainable ? 
  58.         elems :         // 如果是鏈?zhǔn)秸{(diào)用,就返回元素集合 
  59.  
  60.         // Gets 
  61.         bulk ? 
  62.             fn.call( elems ) : 
  63.             length ? fn( elems[0], key ) : emptyGet; 
  64. }; 

access方法雖然不長(zhǎng),但是非常繞,要完全讀懂并不簡(jiǎn)單,因此可以針對(duì)jQuery.fn.attr的調(diào)用來簡(jiǎn)化access。

jQuery.fn.attr/ jQuery.fn.prop 中的access調(diào)用

$().attr的調(diào)用方式:

  • $().attr( propertyName ) // 獲取單個(gè)屬性
  • $().attr( propertyName, value ) // 設(shè)置單個(gè)屬性
  • $().attr( properties ) // 設(shè)置多個(gè)屬性
  • $().attr( propertyName, function ) // 對(duì)屬性調(diào)用回調(diào)函數(shù)

prop的調(diào)用方式與attr是一樣的,在此就不重復(fù)列舉。為了簡(jiǎn)單起見,在這里只對(duì)***和第二種調(diào)用方式進(jìn)行研究。

調(diào)用語句:

  1. access( this, jQuery.attr, name, value, arguments.length > 1 ); 

簡(jiǎn)化的access:

  1. // elems 當(dāng)前的jQuery對(duì)象,可能包含多個(gè)DOM對(duì)象 
  2. // fn jQuery.attr方法 
  3. // name 屬性名 
  4. // value 屬性的值 
  5. // chainable 如果value為空,則chainable為false,否則chainable為true 
  6.  
  7. var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 
  8.  
  9.     var i = 0,                      // 迭代計(jì)數(shù) 
  10.         length = elems.length,      // 屬性數(shù)量 
  11.         bulk = false;               // key != null 
  12.  
  13.     if ( value !== undefined ) {    // 如果value不為空,則為設(shè)置新值,否則返回該屬性的值 
  14.         chainable = true
  15.         raw = true;             // value不是function 
  16.  
  17.         if ( fn ) { // fn為jQuery.attr 
  18.             for ( ; i < length; i++ ) { 
  19.                 fn( elems[i], key, value);      // jQuery.attr(elems, key, value); 
  20.             } 
  21.         } 
  22.     } 
  23.      
  24.     if(chainable) {         // value不為空,表示是get 
  25.         return elems;       // 返回元素實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用 
  26.     } else { 
  27.         if(length) {        // 如果元素集合長(zhǎng)度不為零,則返回***個(gè)元素的屬性值 
  28.             return fn(elems[0], key);   // jQuery.attr(elems[0], key); 
  29.         } else { 
  30.             return emptyGet;        // 返回一個(gè)默認(rèn)值,在這里是undefined 
  31.         } 
  32.     } 
  33. }; 

通過簡(jiǎn)化代碼,可以知道,access的作用就是遍歷上一個(gè)$調(diào)用得到的元素集合,對(duì)其調(diào)用fn函數(shù)。在jQuery.attr和jQuery.prop里面,就是利用access來遍歷元素集合并對(duì)其實(shí)現(xiàn)對(duì)attribute和property的控制。access的源碼里面有多段條件轉(zhuǎn)移代碼,看起來眼花繚亂,其最終目的就是能夠?qū)崿F(xiàn)對(duì)元素集合的變量并完成不同的操作,復(fù)雜的代碼讓jQuery的接口變得更加簡(jiǎn)單,能極大提高代碼重用性,意味著減少了代碼量,提高代碼的密度從而使JS文件大小得到減少。

這些都是題外話了,現(xiàn)在回到$().attr和$().prop的實(shí)現(xiàn)。總的說,這兩個(gè)原型方法都利用access對(duì)元素集進(jìn)行變量,并對(duì)每個(gè)元素調(diào)用jQuery.prop和jQuery.attr方法。要注意,這里的jQuery.prop和jQuery.attr并不是原型鏈上的方法,而是jQuery這個(gè)對(duì)象本身的方法,它是使用jQuery.extend進(jìn)行方法擴(kuò)展的(jQuery.fn.prop和jQuery.fn.attr是使用jQuery.fn.extend進(jìn)行方法擴(kuò)展的)。

下面看看這兩個(gè)方法的源碼。

jQury.attr

  1. jQuery.extend({ 
  2.     attr: function( elem, name, value ) { 
  3.         var hooks, ret, 
  4.             nType = elem.nodeType;  // 獲取Node類型 
  5.  
  6.         // 如果 elem是空或者NodeType是以下類型 
  7.         //      2: Attr, 屬性, 子節(jié)點(diǎn)有Text, EntityReference 
  8.         //      3: Text, 元素或?qū)傩灾械奈谋緝?nèi)容 
  9.         //      8: Comment, 注釋 
  10.         // 不執(zhí)行任何操作 
  11.         if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 
  12.             return
  13.         } 
  14.  
  15.         // 如果支持attitude方法, 則調(diào)用property方法 
  16.         if ( typeof elem.getAttribute === strundefined ) { 
  17.             return jQuery.prop( elem, name, value ); 
  18.         } 
  19.  
  20.         // 如果elem的Node類型不是元素(1) 
  21.         if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 
  22.             name = name.toLowerCase(); 
  23.             // 針對(duì)瀏覽器的兼容性,獲取鉤子函數(shù),處理一些特殊的元素 
  24.             hooks = jQuery.attrHooks[ name ] || 
  25.                 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); 
  26.         } 
  27.  
  28.         if ( value !== undefined ) {        // 如果value不為undefined,執(zhí)行"SET" 
  29.  
  30.             if ( value === null ) {         // 如果value為null,則移除attribute 
  31.                 jQuery.removeAttr( elem, name );     
  32.  
  33.             } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { 
  34.                 return ret;                 // 使用鉤子函數(shù) 
  35.  
  36.             } else {                        // 使用Dom的setAttribute方法 
  37.                 elem.setAttribute( name, value + "" );      // 注意,要將value轉(zhuǎn)換為string,因?yàn)樗衋ttribute的值都是string 
  38.                 return value; 
  39.             } 
  40.  
  41.         // 如果value為undefined,就執(zhí)行"GET" 
  42.         } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { 
  43.             return ret;         // 使用鉤子函數(shù) 
  44.  
  45.         } else { 
  46.             ret = jQuery.find.attr( elem, name );   // 實(shí)際上調(diào)用了Sizzle.attr,這個(gè)方法中針對(duì)兼容性問題作出處理來獲取attribute的值 
  47.  
  48.             // 返回獲得的值 
  49.             return ret == null ? 
  50.                 undefined : 
  51.                 ret; 
  52.         } 
  53.     }, 
  54.  
  55.     ... 
  56. }); 

從代碼可以發(fā)現(xiàn),jQuery.attr調(diào)用的是getAttribute和setAttribute方法。

jQeury.prop

  1. jQuery.extend({ 
  2.  
  3.     ...  
  4.     prop: function( elem, name, value ) { 
  5.         var ret, hooks, notxml, 
  6.             nType = elem.nodeType; 
  7.  
  8.         // 過濾注釋、Attr、元素文本內(nèi)容 
  9.         if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 
  10.             return
  11.         } 
  12.  
  13.         notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 
  14.  
  15.         if ( notxml ) {     // 如果不是元素 
  16.             name = jQuery.propFix[ name ] || name;  // 修正屬性名 
  17.             hooks = jQuery.propHooks[ name ];       // 獲取鉤子函數(shù) 
  18.         } 
  19.  
  20.         if ( value !== undefined ) {        // 執(zhí)行"SET" 
  21.             return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? 
  22.                 ret :                       // 調(diào)用鉤子函數(shù) 
  23.                 ( elem[ name ] = value );   // 直接對(duì)elem[name]賦值 
  24.  
  25.         } else {                            // 執(zhí)行"GET" 
  26.             return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? 
  27.                 ret :               // 調(diào)用鉤子函數(shù) 
  28.                 elem[ name ];       // 直接返回elem[name] 
  29.         } 
  30.     }, 
  31.  
  32.     ... 
  33. }); 

jQuery.prop則是直接對(duì)DOM對(duì)象上的property進(jìn)行操作。

通過對(duì)比jQuery.prop和jQuery.attr可以發(fā)現(xiàn),前者直接對(duì)DOM對(duì)象的property進(jìn)行操作,而后者會(huì)調(diào)用setAttribute和getAttribute方法。setAttribute和getAttribute方法又是什么方法呢?有什么效果?

#p#

setAttribute和getAttribute

基于之前測(cè)試使用的輸入框,執(zhí)行如下代碼:

  1. in1.setAttribute('value''new attr from setAttribute'); 
  2.  
  3. console.log(in1.getAttribute('value'));         // 'new attr from setAttribute' 
  4. console.log(in1.value);                         // 'new attr from setAttribute' 
  5. console.log(in1.attributes.value);              // 'value=​"new attr from setAttribute"',實(shí)際是一個(gè)Attr對(duì)象 

執(zhí)行完setAttribute以后,就如同直接更改attributes中的同名屬性;
而getAttribute的結(jié)果與訪問property的結(jié)果一模一樣,而不會(huì)像直接訪問attritudes那樣返回一個(gè)Attr對(duì)象。

特殊的例子

href

然而,是不是所有標(biāo)簽,所有屬性都維持保持這樣的特性呢?下面我們看看href這個(gè)屬性/特性。

首先在html中創(chuàng)建一個(gè)

  1. <a href='page_1.html' id='a_1'></a> 

在JS腳本中執(zhí)行如下代碼:

  1. console.log(a1.href);   // 'file:///D:/GitHub/JS/html/test_01/page_1.html' 
  2. console.log(a1.getAttribute('href'));   // 'page_1.html' 

可以看到,property中保存的是絕對(duì)路徑,而attribute中保存的是相對(duì)路徑。那么,如果更改了這些值會(huì)發(fā)生什么情況呢?

更改attribute:

  1. a1.setAttribute('href''page_2.html');     // 相對(duì)路徑 
  2. console.log(a1.href);   // 'file:///D:/GitHub/JS/html/test_01/page_2.html' 
  3. console.log(a1.getAttribute('href'));   // 'page_2.html' 
  4.  
  5. a1.setAttribute('href''/page_3.html');    // 根目錄路徑 
  6. console.log(a1.href);                       // 'file:///D:/page_3.html' 
  7. console.log(a1.getAttribute('href'));       // '/page_3.html' 

更改property:

  1. a1.href = 'home.html';  // 相對(duì)路徑 
  2. console.log(a1.href);   // 'file:///D:/GitHub/JS/html/test_01/home.html' 
  3. console.log(a1.getAttribute('href'));   // 'home.html' 
  4.  
  5. a1.href = '/home.html'// 根目錄路徑 
  6. console.log(a1.href);   // 'file:///D:/home.html' 
  7. console.log(a1.getAttribute('href'));   // '/home.html' 

從這里可以發(fā)現(xiàn),href是特殊的屬性/特性,二者是雙向綁定的,更改任意一方,都會(huì)導(dǎo)致另一方的的值發(fā)生改變。而且,這并不是簡(jiǎn)單的雙向綁定,property中的href永遠(yuǎn)保存絕對(duì)路徑,而attribute中的href則是保存相對(duì)路徑。

看到這里,attribute和property的區(qū)別又多了一點(diǎn),然而,這又讓人變得更加疑惑了。是否還有其他類似的特殊例子呢?

id

嘗試改變property中的id:

  1. a1.id = 'new_id'
  2. console.log(a1.id);                     // 'new_id' 
  3. console.log(a1.getAttribute('id'));     // 'new_id' 

天呀,現(xiàn)在attribute中的id從property中的id發(fā)生了同步,數(shù)據(jù)方向變成了property <=> attribute;

disabled

再來看看disabled這個(gè)屬性,我們往***個(gè)

  1. <input id="in_1" value="1" sth="whatever" disabled='disabled'>  // 此時(shí)input已經(jīng)被禁用了 

然后執(zhí)行下面的代碼:

  1. console.log(in1.disabled);      // true 
  2. in1.setAttribute('disabled'false);    // 設(shè)置attribute中的disabled,無論是false還是null都不會(huì)取消禁用 
  3. console.log(in1);               // true 
  4. console.log(in1.getAttribute('disabled'));  // 'false' 

改變attributes中的disabled不會(huì)改變更改property,也不會(huì)取消輸入欄的禁用效果。
如果改成下面的代碼:

  1. console.log(in1.disabled);      // true 
  2. in1.disabled = false;           // 取消禁用 
  3. console.log(in1.disabled);      // false 
  4. console.log(in1.getAttribute('disabled'));  // null,attribute中的disabled已經(jīng)被移除了 

又或者:

  1. console.log(in1.disabled);      // true 
  2. in1.removeAttribute('disabled');    // 移除attribute上的disabled來取消禁用 
  3. console.log(in1.disabled);      // false 
  4. console.log(in1.getAttribute('disabled'));  // null,attribute中的disabled已經(jīng)被移除了 

可以發(fā)現(xiàn),將property中的disabled設(shè)置為false,會(huì)移除attributes中的disabled。這樣數(shù)據(jù)綁定又變成了,property<=>attribute;

所以property和attritude之間的數(shù)據(jù)綁定問題并不能單純地以“property<-attribute”來說明。

總結(jié)

分析了這么多,對(duì)property和attribute的區(qū)別理解也更深了,在這里總結(jié)一下:

創(chuàng)建

  • DOM對(duì)象初始化時(shí)會(huì)在創(chuàng)建默認(rèn)的基本property;
  • 只有在HTML標(biāo)簽中定義的attribute才會(huì)被保存在property的attributes屬性中;
  • attribute會(huì)初始化property中的同名屬性,但自定義的attribute不會(huì)出現(xiàn)在property中;
  • attribute的值都是字符串;

數(shù)據(jù)綁定

  • attributes的數(shù)據(jù)會(huì)同步到property上,然而property的更改不會(huì)改變attribute;
  • 對(duì)于value,class這樣的屬性/特性,數(shù)據(jù)綁定的方向是單向的,attribute->property;
  • 對(duì)于id而言,數(shù)據(jù)綁定是雙向的,attribute<=>property;
  • 對(duì)于disabled而言,property上的disabled為false時(shí),attribute上的disabled必定會(huì)并存在,此時(shí)數(shù)據(jù)綁定可以認(rèn)為是雙向的;

使用

  • 可以使用DOM的setAttribute方法來同時(shí)更改attribute;
  • 直接訪問attributes上的值會(huì)得到一個(gè)Attr對(duì)象,而通過getAttribute方法訪問則會(huì)直接得到attribute的值;
  • 大多數(shù)情況(除非有瀏覽器兼容性問題),jQuery.attr是通過setAttribute實(shí)現(xiàn),而jQuery.prop則會(huì)直接訪問DOM對(duì)象的property;

到這里為止,得出,property是DOM對(duì)象自身就擁有的屬性,而attribute是我們通過設(shè)置HTML標(biāo)簽而給之賦予的特性,attribute和property的同名屬性/特性之間會(huì)產(chǎn)生一些特殊的數(shù)據(jù)聯(lián)系,而這些聯(lián)系會(huì)針對(duì)不同的屬性/特性有不同的區(qū)別。

事實(shí)上,在這里,property和attribute之間的區(qū)別和聯(lián)系難以用簡(jiǎn)單的技術(shù)特性來描述,我在StackFlow上找到如下的回答,或者會(huì)更加接近于真正的答案:

These words existed way before Computer Science came around.

Attribute is a quality or object that we attribute to someone or something. For example, the scepter is an attribute of power and statehood.

Property is a quality that exists without any attribution. For example, clay has adhesive qualities; or, one of the properties of metals is electrical conductivity. Properties demonstrate themselves though physical phenomena without the need attribute them to someone or something. By the same token, saying that someone has masculine attributes is self-evident. In effect, you could say that a property is owned by someone or something.

To be fair though, in Computer Science these two words, at least for the most part, can be used interchangeably - but then again programmers usually don't hold degrees in English Literature and do not write or care much about grammar books :).

最關(guān)鍵的兩句話:

  • attribute(特性),是我們賦予某個(gè)事物的特質(zhì)或?qū)ο蟆?/li>
  • property(屬性),是早已存在的不需要外界賦予的特質(zhì)。

參考

What is the difference between attribute and property?

javascript中attribute和property的區(qū)別詳解

責(zé)任編輯:倪明 來源: elcarim
相關(guān)推薦

2025-03-10 00:00:00

property?attributeHTML

2025-03-10 11:40:00

前端開發(fā)HTML

2009-08-04 14:25:09

學(xué)習(xí)C#Attribute與P

2009-08-03 14:42:50

C#自定義控件

2010-09-28 10:24:50

HTML DOMXML DOM

2010-09-09 17:19:07

HTML DOMXML DOM

2010-06-07 16:55:00

JavaScript

2010-09-28 11:11:23

XML DOMHTML DOM

2023-10-12 08:25:18

Javaequals內(nèi)存

2021-04-11 08:21:20

Python@property裝飾器

2022-05-06 19:42:53

DOM

2021-08-04 08:33:59

TypeScriptConst Readonly

2021-01-18 07:52:08

Dom節(jié)點(diǎn)Element

2024-03-19 14:41:08

C#操作符開發(fā)

2009-06-29 18:32:30

Hibernate

2016-12-06 10:30:39

JavaScriptWriteWriteln

2011-05-19 17:41:20

SenderSelf

2012-03-01 14:04:03

Java

2010-09-01 15:11:09

linkimportCSS

2011-04-20 09:07:44

Ubuntuuseraddadduser
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久精品国产亚洲av麻豆蜜芽| 少妇愉情理伦三级| 色在线免费观看| 久久久久久久久久电影| 国产日韩在线看| 久草成人在线视频| 欧美精品尤物在线观看| 日韩免费电影网站| 日韩视频在线免费看| a在线免费观看| 91视视频在线直接观看在线看网页在线看| 国产精品aaaa| 久久久久无码精品国产| 极品美女一区二区三区| 精品国产免费人成在线观看| 国产av无码专区亚洲精品| 美女写真理伦片在线看| 91蝌蚪porny九色| 91九色在线视频| 日本熟女毛茸茸| 红桃视频欧美| xxx一区二区| www.色天使| 国产成人精品福利| 欧美一区日本一区韩国一区| 日日摸日日碰夜夜爽av| 欧美人与禽性xxxxx杂性| 欧美经典一区二区三区| 久久精品午夜一区二区福利| a级片在线视频| 奇米888四色在线精品| 97精品国产91久久久久久| 日韩一区二区不卡视频| 成人网18免费网站| 亚洲精品中文字幕有码专区| 性猛交╳xxx乱大交| 爱情电影网av一区二区| 欧美性色黄大片| 两根大肉大捧一进一出好爽视频| 黄网在线免费看| 亚洲乱码中文字幕| 色乱码一区二区三区熟女| 国产精品影院在线| 国产亚洲精品久| 欧美日韩日本网| 色就是色亚洲色图| 99久久精品国产导航| 粉嫩av四季av绯色av第一区| 99国产精品久久久久久久成人 | 欧美激情亚洲自拍| 久久国产波多野结衣| 午夜影院欧美| 久久国产加勒比精品无码| 男人av资源站| 久久久久久久久久久9不雅视频| 在线日韩av观看| 亚洲精品国产精品国自| 日本一区二区免费高清| 亚洲最新在线视频| 日本不卡一区视频| 午夜影院欧美| 欧美精品videossex性护士| 九九热只有精品| 激情综合久久| 欧美亚洲视频在线观看| 亚洲天堂一区在线观看| 久久一区亚洲| 国产精品视频久久久| 亚洲一区二区影视| 国产一区二区福利| 国产九区一区在线| 日本中文字幕一区二区有码在线| 久久综合久久综合亚洲| 日本不卡在线播放| 成人在线免费公开观看视频| 中文字幕av免费专区久久| 中文字幕一区二区三区乱码| 欧美1234区| 欧美视频裸体精品| 性生活免费在线观看| 美女国产精品久久久| 精品国产乱码久久久久久久| 中出视频在线观看| 日韩欧美视频| 午夜精品视频在线| 一区二区视频免费| 福利一区二区在线观看| 欧美极品色图| caoporn免费在线视频| 亚洲高清视频的网址| 日韩精品一区中文字幕| 国产亚洲久久| 亚洲欧洲日韩国产| 青青草成人免费| 久久精品日韩欧美| 亚洲一区二区久久久久久| 色婷婷av一区二区三区之红樱桃 | 日韩在线观看不卡| 91麻豆精品国产自产在线| 欧美深性狂猛ⅹxxx深喉| 色777狠狠狠综合伊人| 久久久久久亚洲精品| 中文字幕制服诱惑| 99久久综合狠狠综合久久| 伊人情人网综合| 神马久久午夜| 欧美一区二区三区的| a级大片在线观看| 午夜精品婷婷| 国产精品中文在线| 青青草手机在线| 一区二区三区加勒比av| 国产成人黄色网址| 亚洲人和日本人hd| 欧美国产视频日韩| 一级全黄少妇性色生活片| 91性感美女视频| 精品视频在线观看一区二区| 欧美大陆国产| 亚洲人成电影在线观看天堂色| 久久精品免费av| 韩国女主播成人在线观看| 欧美午夜精品久久久久久蜜| av不卡高清| 欧美变态tickle挠乳网站| 黄色片子在线观看| 久久超碰97人人做人人爱| 日本不卡一区二区三区视频| 欧亚在线中文字幕免费| 精品国产免费久久 | 午夜久久久久久久久久一区二区| 五月婷婷之婷婷| 日韩精品诱惑一区?区三区| 日本a级片电影一区二区| 色哟哟中文字幕| 亚洲福中文字幕伊人影院| 青娱乐国产精品视频| 欧美成人直播| 国产情人节一区| 一区二区三区视频在线观看视频| 色婷婷综合久久久久中文 | 在线成人动漫av| 秋霞av国产精品一区| 日产精品久久久久久久性色| 精品久久久在线观看| 亚洲一级av无码毛片精品| 91久久午夜| 国产伦精品一区二区三区免| h片在线观看下载| 亚洲国产91色在线| 成人午夜视频精品一区| 99久久婷婷国产精品综合| 97成人在线免费视频| 免费看久久久| 日本高清久久天堂| 成年人在线看| 欧美精品电影在线播放| 紧身裙女教师波多野结衣| 国产一区二区0| 日韩精品一区二区三区四| jizz国产精品| 91超碰中文字幕久久精品| 加勒比一区二区三区在线| 91久久人澡人人添人人爽欧美| 欧美 日韩 国产 成人 在线观看| 日韩av午夜在线观看| 伊人久久大香线蕉午夜av| 香蕉免费一区二区三区在线观看| 欧美激情极品视频| 手机亚洲第一页| 日韩欧美在线国产| 成人小视频免费看| 国内精品免费**视频| 妞干网在线观看视频| 蜜臀av免费一区二区三区| 国产日韩精品视频| 中文国产字幕在线观看| 亚洲精品美女久久久| 日韩免费av网站| 最新不卡av在线| 男人网站在线观看| 免费在线观看精品| 日韩视频在线视频| 成人av动漫在线观看| 亚洲自拍偷拍区| 樱桃视频成人在线观看| 久久精品视频播放| 三级网站在线看| 欧美色视频一区| 国产在线观看免费视频今夜| 久久精品一区八戒影视| 污污视频网站在线| 99在线观看免费视频精品观看| 亚洲精品成人自拍| 久久91在线| 91精品在线国产| 中文不卡1区2区3区| 丝袜美腿精品国产二区| 无码h黄肉3d动漫在线观看| 欧美日韩国产一级| 免费av网站在线| 一区二区三区在线视频观看58| japanese中文字幕| 国产91精品精华液一区二区三区| 国产精品拍拍拍| 国产欧美大片| 菠萝蜜视频在线观看入口| 色综合色综合| 欧美一区二区三区四区夜夜大片 | 国产九九视频一区二区三区| 亚洲熟妇av一区二区三区 | 欧美日韩怡红院| 亚洲激情成人| 免费看黄色a级片| 日韩成人精品一区| 快播亚洲色图| 加勒比久久高清| 亚洲精品免费网站| 四虎在线精品| 国产美女精彩久久| 成人免费网站www网站高清| 69久久夜色精品国产69| 午夜dj在线观看高清视频完整版| 中文字幕自拍vr一区二区三区| 天天爽夜夜爽夜夜爽| 精品区一区二区| 精品国产亚洲av麻豆| 欧美一区三区四区| 国产精品免费无遮挡| 精品视频1区2区| 国产精品午夜一区二区| 色国产精品一区在线观看| 伊人久久综合视频| 精品欧美一区二区三区| 日韩xxx高潮hd| 亚洲va欧美va人人爽午夜| 久久精品第一页| 一区二区高清视频在线观看| 国产高清在线免费观看| 亚洲九九爱视频| 日韩一区二区三区四区在线| 亚洲视频免费看| 999精品在线视频| 亚洲视频一二三| 九九九久久久久| 亚洲成人综合网站| 男人天堂中文字幕| 欧美日韩激情小视频| 久久久久久久极品| 色狠狠色狠狠综合| 中文字幕一区二区三区人妻四季| 欧美日韩精品免费观看视频| 中文字幕人妻丝袜乱一区三区| 欧美日韩精品一区二区在线播放| 在线视频免费观看一区| 91精品国产91久久久久久一区二区 | 99在线精品免费| 国产精品一区二区人妻喷水| 99re成人精品视频| 成年人免费观看视频网站| 欧美国产精品一区| 黄色一级大片在线免费观看| 亚洲精品伦理在线| 日产精品久久久久| 91精品福利在线| 国产精品亚洲欧美在线播放| 日韩一区二区三区免费观看| 日本波多野结衣在线| 精品一区二区电影| 在线观看免费黄色| 久久久久999| av资源中文在线| 国产精品网红福利| heyzo欧美激情| 日韩一区免费观看| 在线一区电影| 日韩av片在线看| 国内精品在线播放| 亚洲AV无码国产精品| 中文字幕不卡三区| 国产午夜免费视频| 欧美在线色视频| www.热久久| 亚洲欧洲日产国码av系列天堂| 免费黄色在线网站| 9.1国产丝袜在线观看| 日韩欧美激情| 九九九九精品| 国产精品久久久久久久久久10秀 | 国产一区在线观看免费| 亚洲制服丝袜在线| 国产精品露脸视频| 亚洲国产91色在线| 国产在线激情| 日本精品久久久久久久| 国产视频一区二| 色吧亚洲视频| 亚洲日本免费| 伊人免费视频二| 国产欧美精品一区aⅴ影院| 久久久精品人妻一区二区三区四| 色婷婷国产精品| 日韩有码第一页| 久久久91精品国产| 欧美xnxx| 精品国产一区二区三区麻豆小说 | 欲求不满的岳中文字幕| 中文字幕在线不卡国产视频| 日韩少妇高潮抽搐| 欧美一级高清片| 秋霞影院午夜丰满少妇在线视频| 日本aⅴ大伊香蕉精品视频| 凹凸成人在线| 国产资源第一页| 久久 天天综合| 蜜桃av乱码一区二区三区| 精品人伦一区二区三区蜜桃免费| 草草视频在线播放| 久久精品视频播放| 图片一区二区| 亚洲成人a**址| 天堂在线亚洲视频| 性欧美丰满熟妇xxxx性仙踪林| 亚洲成人av中文| 丁香花免费高清完整在线播放| 操91在线视频| 久久av网站| 国产欧美综合一区| 九一久久久久久| 国产精品suv一区二区88| 欧美日韩一级大片网址| 国家队第一季免费高清在线观看| 欧日韩不卡在线视频| 久久悠悠精品综合网| 久久99久久久久久| 成人免费看的视频| 国产无码精品在线播放| 精品国产人成亚洲区| 92久久精品| 精品国产一区二区三| 国产欧美精品| a级在线免费观看| 在线观看国产一区二区| 成人动漫在线免费观看| 国产精品爽爽爽| 国产精品久久久久9999赢消| 亚洲高清视频免费| 亚洲精品视频免费看| 朝桐光av在线一区二区三区| 欧美精品性视频| 草草视频在线一区二区| 男女视频网站在线观看| 91在线精品一区二区| 久久久久久无码午夜精品直播| 国产亚洲福利一区| www.一区| 18视频在线观看娇喘| 国产成人日日夜夜| 在线观看 中文字幕| 亚洲人午夜色婷婷| 日韩午夜电影免费看| 国产又粗又爽又黄的视频| 国产suv精品一区二区三区| 亚洲黄色一区二区| 国产亚洲欧洲在线| 国产一区二区三区国产精品| www.日本三级| 久久久777精品电影网影网| 一级aaaa毛片| 欧美激情第1页| 国产aⅴ精品一区二区三区久久| 色天使在线观看| 亚洲第一精品在线| av在线播放av| 国产高清在线一区二区| 99国内精品| 青青青视频在线免费观看| 日韩精品中文字幕在线不卡尤物| 国产社区精品视频| 亚洲国产成人不卡| 成人精品gif动图一区| 久久午夜鲁丝片| 欧美极品xxxx| 色88久久久久高潮综合影院| 欧美极品jizzhd欧美仙踪林| 在线亚洲高清视频| 久久久久黄久久免费漫画| 欧美日韩一区二区三| 国产一区二区不卡| 波多野结衣视频在线观看| 色综合男人天堂| 欧美理论视频| 水蜜桃av无码| 日韩亚洲欧美一区二区三区| videos性欧美另类高清| 路边理发店露脸熟妇泻火| 久久久久久日产精品| 亚洲第一页综合| 国产在线播放91| 视频一区欧美精品|