attr 和 prop的区别和使用

  一. attr和prop的区别

  要想弄清楚attr和prop的区别,就要先搞清楚js中使用DOM方法获取设置属性和使用对象方法获取设置属性的区别。

  在javascript中使用DOM方法设置获取属性值主要是依靠setAttribute和getAttribbute,而使用对象方法获取属性值主要是靠节点对象.属性名称。

  那么这两种方法有什么不同?

  1.  获取属性值

  假设有这样的html代码:

  <div id = 'id_div' class = 'class-div' a = 'aaa'>

  那么首先使用getAttribute进行测试:

var div = document.getElementById('id_div');
console.log(div.getAttribute('id'));      结果是id_div
console.log(div.getAttribute('class'));    结果是class-div        
console.log(div.getAttribute('a'));      结果是aaa

  可见使用getAttribute,节点的固有属性和自定义属性都可以获取。

  接下来使用对象方法进行测试:

var div = document.getElementById('id_div');
console.log(div.id);        结果是id_div
console.log(div.className);    结果是class-div
console.log(div.a);         结果是undefined

  由此可见使用对象方法获取属性值的话,如果是节点的固有属性那么是可以获取到的,但是如果是自定义的属性,那么这样是获取不到的。

  2.  设置属性值

  首先使用setAttribute设置属性值。

var div = document.getElementById('id_div');
div.setAttribute('class','bbb');
console.log(div.getAttribute('class'));    bbb
console.log(div.className);           bbb

  这短代码是用setAttribute设置了固有属性class的值,用两种方法获取class的值。结果是两者都能够获取到。

var div = document.getElementById('id_div');
div.setAttribute('b','bbb');
console.log(div.getAttribute('b'));    bbb
console.log(div.b);              undefined

  这段代码是用setAttribute设置了一个自定义属性的值,结果显示使用对象方法不能够获取到属性的值。另外在html文档的结构中,我们也可以看到,属性b也出现在了html文档中。

  然后我们使用对象方法设置属性值。

var div = document.getElementById('id_div');
div.className = 'bbb';
console.log(div.getAttribute('class'));      bbb
console.log(div.className);             bbb

  结果是二者都是一样的结果。

var div = document.getElementById('id_div');
div.b = 'bbb';
console.log(div.getAttribute('b'));        null
console.log(div.b);                 bbb

  而对于使用对象方法设置属性值,此时使用DOM方法获取的值为null,而使用对象方法成功获取到bbb。看一下html文档,发现属性b并没有出现在html文档中。

  最后我们在实验一下这样的代码

var div = document.getElementById('id_div');
div.b = 'bbb';
div.setAttribute('b','aaa');
console.log(div.getAttribute('b'));        aaa
console.log(div.b);                  bbb

  这段代码,我们分别都使用两种方法对一个自定义属性进行设置。结果显示,用两种方法获取的结果并不相同。

var div = document.getElementById('id_div');
div.className = 'bbb';
div.setAttribute('class','aaa');          
console.log(div.getAttribute('class'));      aaa
console.log(div.className);             aaa

  这段代码我们是用两种方法分别对固有属性class设置了不同的值,但是结果却显示的是最后修改的值。说明二者都影响了class。

  之所以要区分这二者的区别,是因为,attr使用的就是DOM方法操作属性,而prop使用的是对象方法操作属性。因此也可知道二者的区别就是:attr对固有属性和自定义属性均可操作,而prop只能对固有属性进行操作(事实上也可以对自定义属性进行操作,但是自定义属性不能够影响到html文档)。因此当对固有属性进行操作的时候就是用prop,而对自定义属性进行操作的时候就用attr。

  而对input 的checked,selected,disabled属性,由于prop使用的是布尔值进行操作,因此更加方便,所以这种情况,一般使用prop。另外prop还可以设置和返回一下的属性:tagName、selectedIndex、nodeName、nodeType、ownerDocument、defaultChecked和defaultSelected等。