attribute 和 property

为了区别通常将两个单词翻译为 属性 和 特性

attribute:attribute类型节点,在JS中有专门处理attribute的函数(.getAttribute(name) 和 .setAttribute(name, value))。attribute不只是能够在HTML文档上看到的这几个,我们还可以自定义attribute加到DOM节点中。

通过方法 setAttribute 设置的attribute最终都会反映到元素的attribute类型的节点中。

property:DOM对象的字段,和平常使用的obj对象一样,包含很多字段,这些字段就是property,取值或者设置值和普通字段一样通过 对象.字段 的方式。

容易混淆的是因为:很多attribute节点还有一个相对应的property属性

另一种说法:有些例如id、class和title等常用的attribute已经被作为property附加在了DOM对象上,也可以取值和赋值,但是自定义的attribute或者自定义的property,两者就没有关系了

<div id="div1">demo</div>

<script>
    var div = document.getElementById('div1')
    console.log(div.getAttribute('id'))  // div1
    div.id = div2
    console.log(div.getAttribute('id'))  // div2
</script>

上面代码div的 id attribute可以用 div.id 取到,通过property更改id后,用getAttribute获取的id是更新后的id。

<div class="container"></div>

<script>
    var ct = document.querySelector('.container')

    ct.setAttribute("num", 1)
    ct.num  // undefined

    ct.sum = "2"
    ct.getAttribute("sum")  //null
</script>

对于自定义的attribute和自定义的property,两者没有关系并不能相互取值和影响

区别:

  1. 去上面的例子,对一些常见的属性来说,attribute和property共享数据,而且attribute更改了会对property造成影响,反之亦然。但是两者的自定义属性是独立数据,即使属性名字一样,也互不影响。但是,IE 67没有作区分,依然共享自定义属性数据。
<input id="test" type="checkbox" checked="checked" sex="male" age="20">
<script>
    var ipt = document.querySelector('#test')
    ipt.getAttribute("sex") // "male"
    ipt.getAttribute("SEX") // "male"
    ipt.sex // undefined
    ipt.getAttribute("age") // "20"
</script>

这里也说明:
1)在HTML里自定义的属性,node.property 的方式不能获取,node.getAttribute() 的方式可以
2)node.getAttribute() 获取自定义属性忽略属性的大小写
3)node.getAttribute() 获取自定义属性得到的值的类型总是字符串

  1. 并不是所有的attribute与对应的property名字都一致,比如attribute的class属性,使用property操作的时候应该是className。 ct.className // container
  2. 对于值是true/false的property,类似于input的checked attribute等,attribute取得值是HTML文档字面量值,property是取得计算结果,property改变并不影响attribute字面量,但attribute改变会影响property计算。
<input id="test" type="checkbox">
<script>
    var ipt = document.querySelector('#test')

    ipt.checked  // false

    ipt.setAttribute('checked', 'checked')
    ipt.getAttribute('checked')  // null
    ipt.checked  // true

    ipt.checked = false
    ipt.getAttribute('checked') // checked
    ipt.checked  // false
</script>

对于button来说,下面的例子,HTML中只要出现了disabled 属性,不管值是什么,对于 DOM property结果都是true, 而对于 attribute 获取的则是把 HTML 里对应属性的值拿到转换成字符串。

<button id="btn" disabled>点我</button>
<script>
var btn = document.querySelector('#btn');
console.log( btn.disabled );                  // true
console.log( btn.getAttribute('disabled') );  // ""
</script>
<button id="btn" disabled=false>点我</button>
<script>
var btn = document.querySelector('#btn');
console.log( btn.disabled );                  // true
console.log( btn.getAttribute('disabled') );  // "false"
</script>
  1. 对于一些和路径相关的属性,两者取得值也不尽相同,同样是attribute取得是字面量,就是从 HTML 里获取对应属性的值转化成字符串,而property取得是计算后的完整路径,获取有意义的真实地址。
<a id="test2" href="#">test2</a>
<script>
    var a = document.getElementById('test2')
    console.log(a.getAttribute('href'))  // "#"
    console.log(a.href)  // "file:///C:/Users/.../demo.html#"
</script>
  1. 对于input 的 value, 改变 property 不会同步到 atttribute 上,改变 attribute也不会同步到 value上, attribute对应 HTML, property 对应 DOM。
<input id="test" type="text" sex="male" age="20" value="这是一个textInput">
<script>
    var ipt = document.querySelector('#test')
    ipt.value = "this is a textInput"
    console.log(ipt.value)   // "this is a textInput"
    console.log(ipt.getAttribute('value'))   // "这是一个textInput"

    ipt.setAttribute('value', 'It is textInput')
    console.log(ipt.value)   // "this is a textInput"
    console.log(ipt.getAttribute('value'))   // "It is textInput"
    console.log( document.body.innerHTML )   // <input id="test" type="text" sex="male" age="20" value="It is textInput">
</script>

如果你只是想获取非自定义的属性,比如 id、name、src、href 、checked... 用 property 的方式比较符合日常习惯,如果需要获取自定义属性那只能使用 getAttribute。

attr( )和prop( )区别

在一些特殊的情况下,attributes和properties的区别非常大。在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行为。在jQuery1.6中,.prop()方法提供了一中明确的获取property值得方式,这样.attr()方法仅返回attributes。

比如,selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, 和defaultSelected应该使用.prop()方法获取/设置值。 在jQuery1.6之前这些不属于attribute的property需要用.attr()方法获取。这几个并没有相应的attibute,只有property。

然而关于checked 属性需要记住的最重要的一点是:它和checked property并不是一致的。实际上这个attribute和defaultChecked property一致,而且只应该用来设置checkbox的初始值。checked attribute并不随着checkedbox的状态而改变,但是checked property却跟着变。因此浏览器兼容的判断checkebox是否被选中应该使用property

if ( elem.checked )
if ( $( elem ).prop( "checked" ) )
if ( $( elem ).is( ":checked" ) )

这对其它一些类似于selected、value这样的动态attribute也适用。

在IE9之前版本中,如果property没有在DOM元素被移除之前删除,使用.prop()方法设置DOM元素property(简单类型除外:number、string、boolean)的值会导致内存泄露。为了安全的设置DOM对象的值,避免内存泄露,可以使用.data()方法。

附上使用场景如下:


使用场景

参考:
若愚:button.disabled 和 button.getAttribute('disabled') 有什么区别?
谦行:jQuery的attr与prop

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345