博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
attribute和property的区别
阅读量:5047 次
发布时间:2019-06-12

本文共 4616 字,大约阅读时间需要 15 分钟。

1.以下内容摘自博客:http://stylechen.com/attribute-property.html

DOM元素的attributeproperty很容易混倄在一起,分不清楚,两者是不同的东西,但是两者又联系紧密。

attribute翻译成中文术语为特性property翻译成中文术语为属性,从中文的字面意思来看,确实是有点区别了,先来说说attribute

attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,attributes是一个类数组的容器,说得准确点就是NameNodeMap,总之就是一个类似数组但又和数组不太一样的容器。attributes的每个数字索引以名值对(name=”value”)的形式存放了一个attribute节点。

<div class="box" id="box" gameid="880">hello</div>

        

上面的div元素的HTML代码中有classid还有自定义的gameid,这些特性都存放在attributes中,类似下面的形式:

[ class="box", id="box", gameid="880" ]

可以这样来访问attribute节点:

var elem = document.getElementById( 'box' );

console.log( elem.attributes[0].name ); // class

console.log( elem.attributes[0].value ); // box

 

但是IE6-7将很多东西都存放在attributes中,上面的访问方法和标准浏览器的返回结果又不同。通常要获取一个attribute节点直接用getAttribute方法:

console.log( elem.getAttribute('gameid') ); // 880

 

要设置一个attribute节点使用setAttribute方法,要删除就用removeAttribute

elem.setAttribute('testAttr', 'testVal');

console.log( elem.removeAttribute('gameid') ); // undefined

 

attributes是会随着添加或删除attribute节点动态更新的。

 

property就是一个属性,如果把DOM元素看成是一个普通的Object对象,那么property就是一个以名值对(name=”value”)的形式存放在Object中的属性。要添加和删除property也简单多了,和普通的对象没啥分别:

elem.gameid = 880; // 添加

console.log( elem.gameid ) // 获取

delete elem.gameid // 删除

 

之所以attributeproperty容易混倄在一起的原因是,很多attribute节点还有一个相对应的property属性,比如上面的div元素的idclass既是attribute,也有对应的property,不管使用哪种方法都可以访问和修改。

console.log( elem.getAttribute('id') ); // box

console.log( elem.id ); // box

elem.id = 'hello';

console.log( elem.getAttribute('id') ); // hello

 

但是对于自定义的attribute节点,或者自定义property,两者就没有关系了。

console.log( elem.getAttribute('gameid') ); // 880

console.log( elem.gameid ); // undefined

elem.areaid = '900';

console.log( elem.getAttribute('areaid') ) // null

 

对于IE6-7来说,没有区分attributeproperty

console.log( elem.getAttribute('gameid') ); // 880

console.log( elem.gameid ); // 880

elem.areaid = '900';

console.log( elem.getAttribute('areaid') ) // 900

很多新手朋友估计都很容易掉进这个坑中。

 

DOM元素一些默认常见的attribute节点都有与之对应的property属性,比较特殊的是一些值为Boolean类型的property,如一些表单元素:

var radio = document.getElementById( 'radio' );

console.log( radio.getAttribute('checked') ); // checked

console.log( radio.checked ); // true

 

对于这些特殊的attribute节点,只有存在该节点,对应的property的值就为true,如:

var radio = document.getElementById( 'radio' );

console.log( radio.getAttribute('checked') ); // anything

console.log( radio.checked ); // true

 

最后为了更好的区分attributeproperty,基本可以总结为attribute节点都是在HTML代码中可见的,而property只是一个普通的名值对属性。

// gameidid都是attribute节点

// id同时又可以通过property来访问和修改

<div class="box" id="box" gameid="880">hello</div>

// areaid仅仅是property

elem.areaid = 900;

 

 

 

2.补充内容如下:参考JavaScript高级程序设计

         HTMLElement 类型直接继承自 Element 并添加了一些属性。添加的这些属性分别对应于每个HTML元素的特性。添加的属性值如下:

 id ,元素在文档中的唯一标识符。

 title ,有关元素的附加说明信息,一般通过工具提示条显示出来。

 lang ,元素内容的语言代码,很少使用。

 dir ,语言的方向,值为 "ltr" left-to-right,从左至右)或 "rtl" right-to-left,从右至左),

也很少使用。

 className ,与元素的 class 特性对应,即为元素指定的CSS类。没有将这个属性命名为 class ,是因为 class ECMAScript 的保留字。

 

         上述这些属性都可以用来取得或修改相应的特性值。以下面的 HTML 元素为例:

<div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div>

div标签中指定的所有特性,都可以通过属性取得:

var div = document.getElementById("myDiv");

alert(div.id); //"myDiv""

alert(div.className); //"bd"

alert(div.title); //"Body text"

alert(div.lang); //"en"

alert(div.dir); //"ltr"

 

当然,像下面这样通过为每个属性赋予新的值,也可以修改对应的每个特性

div.id = "someOtherId";

div.className = "ft";

div.title = "Some other text";

div.lang = "fr";

div.dir ="rtl";

 

         每个元素都有一或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。操作特性的DOM 方法主要有三个,分别是 getAttribute() setAttribute() removeAttribute() 。这三个方法可以针对任何特性使用,包括那些以 HTMLElement 类型属性的形式定义的特性。来看下面的例子:

var div = document.getElementById("myDiv");

alert(div.getAttribute("id")); //"myDiv"

alert(div.getAttribute("class")); //"bd"

alert(div.getAttribute("title")); //"Body text"

alert(div.getAttribute("lang")); //"en"

alert(div.getAttribute("dir")); //"ltr"

 

注意,传递给 getAttribute() 的特性名与实际的特性名相同。因此要想得到 class 特性值,应该传入 "class" 而不是 "className ",后者只有在通过对象属性访问特性时才用。如果给定名称的特性不存在, getAttribute() 返回 null

 

         通过 getAttribute() 方法也可以取得自定义特性(即标准 HTML 语言中没有的特性)的值,以下面的元素为例:

<div id="myDiv" my_special_attribute="hello!"></div>

这个元素包含一个名为 my_special_attribute 的自定义特性,它的值是 "hello!" 。可以像取

得其他特性一样取得这个值,如下所示:

var value = div.getAttribute("my_special_attribute");

不过,特性的名称是不区分大小写的,即 "ID" "id" 代表的都是同一个特性。另外也要注意,根据 HTML5 规范,自定义特性应该加上 data- 前缀以便验证。

 

3.浏览器查看div元素的属性和特性:

 

  • 1
  • 2
  • 3
  •  

     

     

    Firefox浏览器中console.log(div),打印div标签的属性如下图:

     

     

     

    打印div标签的特性如下:

     

     

     

    4.总结

    1)对于html元素自有的特性attribute和属性property,通过特性或属性来获取、设置同一特性值或者属性值皆有效,且相互影响。

    2)对于自定义的特性attribute和属性property,两者没有关系,不会互相影响。

    3)元素的特性attribute其实是元素的属性attributes对象中的内容。所以不能直接通过.或者[]来获取。

    转载于:https://www.cnblogs.com/shuqiao/p/10026654.html

    你可能感兴趣的文章
    谈谈网络分层和IP
    查看>>
    [Objective C] Singleton类的一个模版
    查看>>
    二叉搜索树
    查看>>
    软考-01.计算机系统的基础知识
    查看>>
    C# 复习、笔试全攻略(三、结构、枚举和数组)
    查看>>
    向量内积(点乘)和外积(叉乘)概念及几何意义
    查看>>
    昨天又是急急忙忙晚上把日志给投了
    查看>>
    斐波那契数列算法
    查看>>
    运行.py提示selenium.common.exceptions.WebDriverException
    查看>>
    WebService中的DataSet序列化使用
    查看>>
    BZOJ 1200 木梳
    查看>>
    【Linux】【C语言】菜鸟学习日志(一) 一步一步学习在Linxu下测试程序的运行时间...
    查看>>
    hostname
    查看>>
    SpringBoot使用其他的Servlet容器
    查看>>
    关于cookie存取中文乱码问题
    查看>>
    第二次OO总结
    查看>>
    练习 2:高斯分布,正态分布
    查看>>
    03、重定义CDF
    查看>>
    k8s架构
    查看>>
    select 向上弹起
    查看>>